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

ZackMercury 23.08.2017 21:11

Задержка событий.
 
Сначала я инициализирую класс опций, который инициализирует все свои поля по ADDED_TO_STAGE
Код AS3:

_options = Options.getInstance();
addChild(_options); //required for initializing sliders
removeChild(_options);

Здесь, в теории, должно было сработать событие ADDED_TO_STAGE, и выполнение перейти в метод init Options, но
Код AS3:

trace(_options.stones);

чуть ниже возвращает null.

Выходит, это происходит с задержкой?
Как же тогда поймать момент, когда init проинициализирован?
Далее в конце init отсылаю событие
Код AS3:

dispatchEvent(new Event(Event.ACTIVATE));

Пытаюсь проверить, работает ли таким способом, и, угадайте что?
Код AS3:

_options = Options.getInstance();
addChild(_options); //required for initializing sliders
removeChild(_options);
 
_options.addEventListener(Event.ACTIVATE, function(e:Event):void{
        trace(_options.stones);
});

null. Отсылается событие раньше времени, шта?

Что я делаю не так?

update:

Убрал removeChild в обработчик события, и заработало...
Тоесть, событие ADDED_TO_STAGE, оказывается, вызывается не addChild напрямую, и происходит где-то через кадр?(Потому, что ENTER_FRAME успевает сработать разок)

Как это вообще по нормальному то делается? У меня есть класс Options, дисплейный, по иниту инициализирует свои поля, но в конструкторе инициализировать нельзя потому, что он унаследован от Window, который рисует задний фон в своём ините, и выходит, что тогда элементы будут под задним фоном. Если переместить рисование фона в конструктор, то получается, что изменить параметры windowWidth и windowHeight невозможно, пробовл без super.windowWidth, не работает, с super пишет, что до вызова конструктора суперкласса this, super и всё такое запрещено. А фон нужно рисовать по размерам окна(логично).
Оверрайда переменных не существует, что делать?

Нужно проинициализировать Options и сразу же пользоваться его полями.

Tails 24.08.2017 10:46

Я обычно заводил отдельный публичный метод init() и свойство isInit, указывающее был ли экземпляр уже проинициализирован.

ZackMercury 24.08.2017 13:21

А почему событие, которое я диспатчу в методе init после всего кода вызывает обработчик тогда, когда ничего не проинициализировано? Чушь какая-то.
Почему перенос removeChild в обработчик этого события помог?

Tails 24.08.2017 13:38

Можешь изолировать проблему и выложить? А то трудно во всё это вникнуть. Ещё событие: flash.events.Event.ACTIVATE нельзя использовать в своей логике так как оно является широковещательным и зарезервировано для других целей.
И на всякий случай уточню, речь идёт о нативном дисплей листе и диспетчере? Лучше выложить проблемный код целиком.

ZackMercury 24.08.2017 16:24

Действительно, поменял ACTIVATE на кастомное, и перестало вообще вызываться) Я и не подумал бы, что оно задействовано в спрайте.
Вообще, я думал, что событие вызывается сразу при вызове addChild, а так приходится лепить ещё доп. события к уже существующим.
Вызов инита руками как-то неприятно ощущается. Но всё же решение, спасибо.


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

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