Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   как использовать метод класса? (http://www.flasher.ru/forum/showthread.php?t=134202)

dixlofos 23.12.2009 22:05

как использовать метод класса?
 
Есть у меня фла файл с мувиклипом, базовый класс мувиклипа = Base:
Код AS3:

package {
 
        import flash.display.MovieClip;
 
        public class Base extends MovieClip{
 
                public function Base():void{                       
                        var rt1 = new Rotation_class();                       
                }
        }
}

есть другой класс Rotation_class:
Код AS3:

package {
 
        import flash.display.MovieClip;
 
        public class Rotation_class extends MovieClip{
 
                public function Rotation_class(){                                 
                }
 
                public function rotate_me(){
                    this.rotation+=10;
                }
        }
}

символ из библиотеки уже добавлен на сцену и его instance name = my_rect
Как мне к нему применить функцию rotate_me() класса Rotation_class, не особо меняя структуру всего происходящего?
(тобишь я знаю, что если ф-цию rotate_me() дописать в класс Base, а патом в фла файле написать my_rect.rotate_me(); , то все будет работать, а мне самый интерес в том, что бы сделать свою библиотеку классов, а эту проблему я некак не могу осилить:umnik2:)

gloomyBrain 23.12.2009 23:23

Передать ссылку на экземпляр Base в конструкторе Rotation_Class
Base:
Код AS3:

package {
 
        import flash.display.MovieClip;
 
        public class Base extends MovieClip{
 
                public function Base():void{                       
                        var rt1 = new Rotation_class(this);                       
                }
        }
}

Rotation_Class
Код AS3:

package {
 
        import flash.display.MovieClip;
 
        public class Rotation_class extends MovieClip{
 
        private var baseMovie:Base;
 
                public function Rotation_class(baseMovie:Base){
 
                        this.baseMovie = baseMovie;
 
                }
 
                public function rotate_me(){
                    this.baseMovie.rotation+=10;
                }
        }
}


dimarik 24.12.2009 00:29

Цитата:

базовый класс мувиклипа = Base:
Извините за дотошность, но базовый класс мувиклипа - это Object. Ваш Base стоит предпоследним в пищевой цепочке цепочке наследования библиотечного мувиклипа и не может считаться базовым.

По сути. Не стоит так заморачиваться и создавать _Отдельный_Класс_Реализующий_Поворот_На_Десять_Градусов_.

Традиционно: "некак" - это, извините, когда не получается сходить по-большому...

udaaff 24.12.2009 00:34

Под базовым скорее всего подразумевался Base class из linkage properties. Хотя, возможно, и нет... :)

dimarik 24.12.2009 00:45

Цитата:

Сообщение от udaaff (Сообщение 874730)
Под базовым скорее всего подразумевался Base class из linkage properties. Хотя, возможно, и нет... :)

Дружище, udaaff! Это все понятно, но нужно как-то прививать любовь к точным определеням. И к русскому языку в частности.

Psycho Tiger 24.12.2009 01:07

Цитата:

Ваш Base стоит предпоследним
У меня вдруг ощущение, что я что-то не понимаю...
Может, в цепочке чего забыл, но не суть - Base стоит самым первым ведь (ну хорошо, если смотреть вглубь - то последним).
dimarik, если ты не ошибся - то кто тогда стоит первым? :O
Base -> MovieClip -> Sprite -> Shape -> DisplayObject -> EventDispatcher -> Object

udaaff 24.12.2009 01:13

Цитата:

Сообщение от dimarik (Сообщение 874738)
Дружище, udaaff! Это все понятно, но нужно как-то прививать любовь к точным определеням. И к русскому языку в частности.

Ну да... согласен с вами, дружище dimarik. Главное — без фанатизма :victory:

dimarik 24.12.2009 01:20

Цитата:

Сообщение от Psycho Tiger (Сообщение 874746)
У меня вдруг ощущение, что я что-то не понимаю...
Может, в цепочке чего забыл, но не суть - Base стоит самым первым ведь (ну хорошо, если смотреть вглубь - то последним).
dimarik, если ты не ошибся - то кто тогда стоит первым? :O
Base -> MovieClip -> Sprite -> Shape -> DisplayObject -> EventDispatcher -> Object

libraryClass -> Base -> MovieClip -> Sprite -> Shape -> DisplayObject -> EventDispatcher -> Object

Все правильно, Base предпоследний.

По-поводу что считать первым. Ты же не считаешь Адама последним в цепочке наследования человечества.

Sprite никогда не наследовался от Shape.
Sprite -> DisplayObjectContainer -> InteractiveObject -> DisplayObject -> EventDispatcher -> Object

chabapok 24.12.2009 02:16

попробуйте:

дописываете в base.as
import Rotation_class.rotate_me;

и используете:
rotate_me();
тут я не уверен, что this укаже куда надо
----------------
Но есть способ 2.
Код AS3:

 
//в классе Base пишем так
 
var rt1_func:Function = rt1.rotate_me; //тут обратите внимание на большие
//и малые буквы
 
rt1_func.call(this);

Добавлено через 5 минут
стало быть и вот так должно получиться:
rt1.rotate_me.call(this)

или в вашем случае my_rect.rt1.rotate_me.call(this), но переменную rt1 все же прийдется сделать public

dimarik 24.12.2009 02:27

chabapok, Вам поршня менять нужно. А то прихватит.

Psycho Tiger 24.12.2009 10:46

Цитата:

libraryClass -> Base -> MovieClip -> Sprite -> Shape -> DisplayObject -> EventDispatcher -> Object
Хм, не знал) Спасибо.
Цитата:

По-поводу что считать первым. Ты же не считаешь Адама последним в цепочке наследования человечества.
Да, прав.

chabapok 24.12.2009 14:09

Цитата:

Сообщение от dimarik (Сообщение 874775)
chabapok, Вам поршня менять нужно. А то прихватит.

ась? Это вы к чему?


В мою последнюю фразу в предыдущем посте вкралась очепяточка. Читать следует так my_rect.rt1.rotate_me.call(my_rect)
Попробуйте.

но лучше, конечно, так не делать, это плохой, негодный стиль

dixlofos 25.12.2009 19:12

chabapok
эм. вроде работает, но объект не крутиться, я дописал еще в классе Rotation_class в функции rotate_me() "trace("jiosdg");" ну так вот он это выводит, а объект все равно не вращаеться.

gloomyBrain, написал как вы сказали, но нужного эффекта не добился, мб мне в самом фла файле нужно что-то хитрее чем "my_rect.rotate_me();" написать?

Psycho Tiger 25.12.2009 20:08

Цитата:

эм. вроде работает, но объект не крутиться, я дописал еще в классе Rotation_class в функции rotate_me() "trace("jiosdg");" ну так вот он это выводит, а объект все равно не вращаеться.
Если он выводит - значит вызов метода есть. Если он есть - значит, смотрите только содержимое метода на предмет ошибки.

dimarik 25.12.2009 23:27

Цитата:

Сообщение от chabapok (Сообщение 874876)
my_rect.rt1.rotate_me.call(my_rect)
Попробуйте.

Пробуем.
Код AS3:

jhaad.rt1adsasd.asdasdr.osdfrett.egrcnd.eru6ua.gryth.te$$$$$$mdfgdfge.csdfsdfasdfll(save_my_ass_god);

Нифига не вдохновляет.

Цитата:

Сообщение от chabapok (Сообщение 874876)
но лучше, конечно, так не делать, это плохой, негодный стиль

Покажите хороший стиль.

chabapok 28.12.2009 02:34

Цитата:

эм. вроде работает, но объект не крутиться, я дописал еще в классе Rotation_class в функции rotate_me() "trace("jiosdg");" ну так вот он это выводит, а объект все равно не вращаеться.
Есть подозрение, что все же this в этой функции куда-то не туда указывает, поэтому сама функция выполняется, свойство rotation у обьекта, куда указывает this есть, но только объект не тот. Проверьте, разберитесь с классом Function и его методами и укажите что надо, проверьте, что все обьекты созданы и находятся там где надо. Вы переменную rt1 вынесли за пределы функции? вынесите.

Заюзайте дебаггер и сравните адреса.

Цитата:

Покажите хороший стиль
Я не знаю как хорошо. Был вопрос - я дал ответ как это организовать конструкцией языка. А как это сделать красиво - я не знаю, а подсказать можно только если конкретный код видеть. Но сам я так не делаю.

можно, например, завести отдельный класс с функцией
Код AS3:

public class Utils{
public static function updateRotation(target:MovieClip){target.rotatoin+=10}
}
 
//и вызывать
Utils.updateRotation(my_rect);
 
//или изнутри Rotation_class
Utils.updateRotation(this);
 
//или изнутри Base:
Utils.updateRotation(rt1);


Но изучая исходники fl.controls.DataGrid обнаруживаешь, что там такое используется. Там правда не call а apply используют, но суть так же.


Часовой пояс GMT +4, время: 08:48.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.