Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   MovieClip не принимает сообщение от родителя (http://www.flasher.ru/forum/showthread.php?t=108931)

akerka 03.03.2008 22:14

MovieClip не принимает сообщение от родителя
 
Вложений: 1
Есть два класса - app (главный класс флэшки) и receiver (класс находящегося на сцене movie clip, по сути - потомок app);
app посылает сообщение и задача receiver - его услышать. receiver его не слышит. Полагаю, я плохо понимаю механизм посылки сообщений. Если кто либо может взглянуть на пример кода и поправить меня, буду очень благодарен.
В приложенном файле весь пример целиком, а вот сам код

app:
Код:

package{
        import flash.display.MovieClip;
        import flash.events.ProgressEvent;
        import flash.events.Event;
       
        public class app extends MovieClip{
                public function app(){
                        loaderInfo.addEventListener(ProgressEvent.PROGRESS,onProgress);
                }
               
                public function onProgress(e:ProgressEvent):void {
                        dispatchEvent(new Event('APP_PROGRESS'));
                        trace('message sended');
                }
        }
}

receiver:
Код:

package{
        import flash.display.MovieClip;
        import flash.events.Event;
       
        public class receiver extends MovieClip{
                public function receiver(){
                        addEventListener('APP_PROGRESS', onMessage);
                }
               
                public function onMessage(e:Event):void{
                        trace('message received');
                }
        }
}


Mr. Fixit 03.03.2008 22:20

ты же пиши кому извещать..
создай например глобальный инстанс и к нему крепи листенеры..

akerka 03.03.2008 22:27

Что значит "пиши, кому извещать"? Извещает app. Он - верхний в иерархии класс, глобальнее вроде некуда. А если "кого извещать" - если бы app знал имена потомков то не было бы смысла в сообщениях - проще методы потомков вызывать

akerka 03.03.2008 22:38

можно написать :
Код:

root.addEventListener('APP_PROGRESS', onMessage);
и сообщение принимается, но в документации при работе с сообщениями я таких финтов не вижу. Как я понял, сообщение сходит по дереву иерархии вниз, а если указать
Код:

dispatchEvent(new Event('APP_PROGRESS',true));
то и всплывает до самого верха.

Я хочу понять принцип ошибки - где я не понял теорию? - иначе то что я делаю больше похоже на хак.

udaaff 03.03.2008 23:38

Цитата:

Сообщение от akerka
можно написать :
Код:

root.addEventListener('APP_PROGRESS', onMessage);
и сообщение принимается, но в документации при работе с сообщениями я таких финтов не вижу.

root у вас это app, поэтому обработчик в этом случае благополучно вносится в массив слушателей.
Цитата:

если бы app знал имена потомков то не было бы смысла в сообщениях - проще методы потомков вызывать
Проще -- далеко не всегда правильнее.

ps: Названия классов пишутся с большой буквы, а обработчики приватные немешало бы сделать.

etc 04.03.2008 00:00

А кто вас так научил классы называть и не научил кастомным событиям?

terbooter 04.03.2008 07:59

Знаю как сделать чтоб работало, но не понимаю почему не работает этот пример. Присоединяюсь к вопросу автора

etc 04.03.2008 09:18

Нужно использовать всплывающие события. Никаких хаков тут нет, событие от детей поднимается вверх по родителям. Если не использовать bubbling, то событие попадет только в те обработчики, которые были подписаны непосредственно у того, кто шлет событие.

Iv 04.03.2008 21:03

akerka,
проблемы с твоим кодом возникают из-за идеологически неверно простроеных отношений между классами.
Добиться работоспособности можно, используя bubbling и targeting. Но код в итоге получится корявым.

Что делать:

1. Переименовать. Да-да. Нет слова app в английском. А сократить так можно и appendix и application и, думаю еще не одно слово. Код пишется в первую очередь для человека. Ну, и учесть, что имена классов начинаются с большой буквы.
Это - самое важное. Остальное мелочи.

2. Где-то у тебя создается экземпляр класса receiver (но мы договорились, что переименуем этот класс на более понятное, что-то типа ApplicationPreloaderReceiver). Вот там, где он создается, и нужно передать ссылку на экземпляр класса ныне именуемого app.
И, затем, подпишемся на его события.

зачеркнуто И, затем, подпишем его на события этого класса. /зачеркнуто

3. В коде мы не будем использовать строки и навешивать нехарактерное вещание на класс Event. Просто создадим класс - наследник Event, например ApplicationPreloaderEvent и создадим в нем публичную статическую константу
APPLICATION_PROGRESS:String = "applicationProgress"
и в дальнейшем в коде будем использовать только ее для вещания событий этого типа.

Примерно так.

Теоретически возможно, что передать ссылку на экземпляр app будет затруднительно. В этом случае, коль уж это так тяжело, этот класс следует во-первых переименовать например: MyFirstApplication, а во-вторых сделать его синглтоном и подписываться на событие используя получение ссылки через getInstance(). Впрочем, это не рекомендуемая практика.

удачи.

etc 05.03.2008 00:26

2. Каким образом? Откроем всем ветрам приватные обработчики событий?
Чем это бабблинг корявый вдруг стал?


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

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