Форум 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=159604)

Kolyunya 03.07.2011 00:00

Экземпляр класса сам добавляет себя на таймлайн
 
Всех приветствую.
Подскажите, пожалуйста, как из конструктора класса обратиться к таймлайну? Спасибо!


Единственный способ, который мне известен - передать конструкторы ссылку на таймлайн в качестве параметра. Но, мне кажется, это - изврат.

Спасибо!

Wolsh 03.07.2011 00:30

Изврат - это самодобавление.

Kolyunya 03.07.2011 00:49

Что быстрее и короче?
Код AS3:

var newSprite:SpriteClass = new SpriteClass();this.addChild(newSprite);

или

Код AS3:

var newSprite:SpriteClass = new SpriteClass();


Kolyunya 03.07.2011 00:49

Прошу отвечать по теме, как обратиться к таймлайну из класса?
Спасибо!

S-ed 03.07.2011 01:30

К какому таймлайну? =)
У всех наследников мувиклипа есть таймлайн.
Для стейджа:
Код AS3:

trace(root);//вернет самый верхний DisplayObject - обычно - таймлайн стейджа

Увы, согласен с Волшем, не стоит...

Wolsh 03.07.2011 01:36

Это ActionScript а не хайку. Количество строк не имеет значения. Хотите в одну?
Код AS3:

var newSprite:SpriteClass = this.addChild(new SpriteClass());

По теме – кроме как "передать ссылку на самого себя" – чтож, можно и поизвращаться. Можно хранить эту ссылку на контейнер где-нибудь в статическом свойстве какого-нибудь класса, который будет импортирован в SpriteClass. Больше способов обратиться куда-то из конструктора, хвала создателям, нет. К счастью AS3 ориентирован на ООП и предполагает, что все вопросы решают родители, а не новорожденные дети.

КорДум 03.07.2011 01:37

Цитата:

Сообщение от Kolyunya (Сообщение 1008308)
Что быстрее и короче?
Код AS3:

var newSprite:SpriteClass = new SpriteClass();this.addChild(newSprite);

или

Код AS3:

var newSprite:SpriteClass = new SpriteClass();


Второе (если подразумевается, что добавление реализовано в конструкторе или где-то еще) называется быдлокодерством. На самом деле не быдло-, кое-что другое, ну вы поняли.
Тем более, зачем вам ссылка на таймлайн? Добавляйте все в экземпляр главного класса и его дисплейных отпрысков. Есть еще stage, в конце концов.

Kolyunya 03.07.2011 02:33

Спасибо всем ответившим!

Продолжая дискуссию: пишу класс, вычисляющий скорость движения курсора мыши. Каким образом метод моего класса будет получать текущую координату курсора мыши без доступа к объекту stage (читай: не имея ссылки на объект stage)?

trace(stage) = null только если экземпляр этого класса не добавлен на таймлайн. НО! Добавить его туда я не могу, т.к. класс должен работать внутри других классов.

Прикладываю код класса, если кто захочет помочь советом. На данный момент экз. класса получает ссылку на сцену в кач. параметра.
Спасибо!

Код AS3:

package src.tools
{
        import flash.events.*;
        import flash.display.Stage;
 
        /*
        Класс, позволяющий вычислять скорость движения курсора мыши
        и координаты курсора.
        Имеет 2 приватных свойства: ссылка на таймлайн и массив координат мыши
        Имеет 4 метода: возвращающают скорости по горизонтали и вертикали, а также
        координаты курсора в данный момент.
        */

 
        public class MouseWatcher
        {
                // Свойство получит ссылку на сцену
                private var mStage:Stage;
                // Свойство, содержит координаты курсора в предыдущий момент времени
                // [0] - по горизонтали
                // [1] - по вертикали
                private var mPositionPrev:Array;
 
 
 
                // Конструктор класса
                public function MouseWatcher(mStage:Stage)
                {
                        this.mPositionPrev = new Array();
                        // Определяем корневой таймлайн
                        this.mStage = mStage;
                }
 
 
 
                // Метод возвращает горозонтальную скорость курсора
                // Один аргумент отвечающий за вывод скорости или ее модуля
                public function mouseSpeedHor(abs:Boolean):Number
                {
                        var mousePosHorCurr:Number;//Текущая координата курсора
                        var mousePosHorDiff:Number;// Разница между предыдущей и текущей координатой
                        mousePosHorCurr = this.mStage.mouseX;// Текущая координата мыши
                        mousePosHorDiff = mousePosHorCurr - this.mPositionPrev[0];// Разность координат
                        this.mPositionPrev[0] = mousePosHorCurr;// Текущая координата сохраняется как устаревшая
                        //Если надо найти модуль скорости ...
                        if (abs)
                        {
                                // ... то мы его вычисляем
                                mousePosHorDiff = Math.abs(mousePosHorDiff);
                        }
                        return mousePosHorDiff;
                }
 
 
 
                // Метод возвращает горозонтальную скорость курсора
                // Один аргумент отвечающий за вывод скорости или ее модуля
                public function mouseSpeedVert(abs:Boolean):Number
                {
                        var mousePosVertCurr:Number;//Текущая координата курсора
                        var mousePosVertDiff:Number;// Разница между предыдущей и текущей координатой
                        mousePosVertCurr = this.mStage.mouseY;// Текущая координата мыши
                        mousePosVertDiff = mousePosVertCurr - this.mPositionPrev[1];// Разность координат
                        this.mPositionPrev[1] = mousePosVertCurr;// Текущая координата сохраняется как устаревшая
                        if (abs)
                        {
                                // ... то мы его вычисляем
                                mousePosVertDiff = Math.abs(mousePosVertDiff);
                        }
                        return mousePosVertDiff;
                }
                public function get mPosX():Number
                {
                        return this.mStage.mouseX;
                }
                public function get mPosY():Number
                {
                        return this.mStage.mouseY;
                }
        }
}


Seagull 03.07.2011 02:46

Кхм... А Вы не считаете, что правильнее будет передать координаты аргументом в функции вычисляющие скорость? Одним из основных принципов ООП являеются слабое связывание и сильное зацепление. ТО есть класс должен быть максимально независим и выполнять минимум задач. Вот и пусть только считает. Нет?

P.S. Кстати хранить координату куда удобнее хотя бы в том же самом Point-е. У него есть куча удобных функций для работы с ними.

Kolyunya 03.07.2011 03:28

Seagull, допустим, я так и сделаю.
Но вопрос СОВСЕМ в другом! Вопрос в том, КАК я эти координаты получу внутри класса???
Класс по расчету скорости ведь - вспомогательный. Его экземпляр нужно вызывать в других классах. А другие классы не знают, где стэйдж и где рут.....


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

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