Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 03.03.2008, 22:14
akerka вне форума Посмотреть профиль Отправить личное сообщение для akerka Найти все сообщения от akerka
  № 1  
Ответить с цитированием
akerka
 
Аватар для akerka

Регистрация: Apr 2006
Сообщений: 36
По умолчанию MovieClip не принимает сообщение от родителя

Есть два класса - 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');
		}
	}
}
Вложения
Тип файла: zip test.zip (6.2 Кб, 43 просмотров)

Старый 03.03.2008, 22:20
Mr. Fixit вне форума Посмотреть профиль Найти все сообщения от Mr. Fixit
  № 2  
Ответить с цитированием
Mr. Fixit
Banned

Регистрация: Oct 2006
Адрес: кагбэ Киеф!!1
Сообщений: 1,473
ты же пиши кому извещать..
создай например глобальный инстанс и к нему крепи листенеры..

Старый 03.03.2008, 22:27
akerka вне форума Посмотреть профиль Отправить личное сообщение для akerka Найти все сообщения от akerka
  № 3  
Ответить с цитированием
akerka
 
Аватар для akerka

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

Старый 03.03.2008, 22:38
akerka вне форума Посмотреть профиль Отправить личное сообщение для akerka Найти все сообщения от akerka
  № 4  
Ответить с цитированием
akerka
 
Аватар для akerka

Регистрация: Apr 2006
Сообщений: 36
можно написать :
Код:
root.addEventListener('APP_PROGRESS', onMessage);
и сообщение принимается, но в документации при работе с сообщениями я таких финтов не вижу. Как я понял, сообщение сходит по дереву иерархии вниз, а если указать
Код:
dispatchEvent(new Event('APP_PROGRESS',true));
то и всплывает до самого верха.

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


Последний раз редактировалось akerka; 03.03.2008 в 22:41.
Старый 03.03.2008, 23:38
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 5  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Цитата:
Сообщение от akerka
можно написать :
Код:
root.addEventListener('APP_PROGRESS', onMessage);
и сообщение принимается, но в документации при работе с сообщениями я таких финтов не вижу.
root у вас это app, поэтому обработчик в этом случае благополучно вносится в массив слушателей.
Цитата:
если бы app знал имена потомков то не было бы смысла в сообщениях - проще методы потомков вызывать
Проще -- далеко не всегда правильнее.

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

Старый 04.03.2008, 00:00
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 6  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
А кто вас так научил классы называть и не научил кастомным событиям?

Старый 04.03.2008, 07:59
terbooter вне форума Посмотреть профиль Отправить личное сообщение для terbooter Найти все сообщения от terbooter
  № 7  
Ответить с цитированием
terbooter

Регистрация: Oct 2006
Адрес: Novosibirsk-Kaliningrad
Сообщений: 1,278
Отправить сообщение для terbooter с помощью ICQ Отправить сообщение для terbooter с помощью Skype™
Знаю как сделать чтоб работало, но не понимаю почему не работает этот пример. Присоединяюсь к вопросу автора

Старый 04.03.2008, 09:18
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 8  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

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

Старый 04.03.2008, 21:03
Iv вне форума Посмотреть профиль Отправить личное сообщение для Iv Посетить домашнюю страницу Iv Найти все сообщения от Iv
  № 9  
Ответить с цитированием
Iv
 
Аватар для Iv

Регистрация: Apr 2001
Адрес: Moscow
Сообщений: 1,475
akerka,
проблемы с твоим кодом возникают из-за идеологически неверно простроеных отношений между классами.
Добиться работоспособности можно, используя bubbling и targeting. Но код в итоге получится корявым.

Что делать:

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

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

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

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

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

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

удачи.


Последний раз редактировалось Iv; 05.03.2008 в 01:05.
Старый 05.03.2008, 00:26
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 10  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
2. Каким образом? Откроем всем ветрам приватные обработчики событий?
Чем это бабблинг корявый вдруг стал?

Создать новую тему Ответ Часовой пояс GMT +4, время: 02:57.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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