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

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

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

Регистрация: Nov 2005
Адрес: 26°58′49.06″ 49°24′35.72″ Ymaps
Сообщений: 119
Отправить сообщение для ZGG с помощью ICQ Отправить сообщение для ZGG с помощью Skype™
По умолчанию Диспатч одного потомка к другому потомку. Как?

Здравствуйте!
Возник такой ламерский вопросик:
Как передать диспатч от одного потомка к другому? На словах наверное трудно будет объяснить что я хочу, по этому нарисовал схемку:
[IMG]http://i.***********/i5/82/52/655282/Yzobrazhenye1.png[/IMG]

Как передать событие от экземпляра класса Г к экземпляру В? Например, у экземпляра класса Г что то изменилось и он хочет уведомить об этом экземпляра В.

Я предполагаю что ему нужно передать событие к экземпляра класса А, а тот в свою очередь передаст в экземпляра класса Майн, а тот уже вызовет соответствующий метод у экземпляра класса В.

А если вложенность предков достигает 10 уровеней и больше, то получается надо создавать 10 слушателей? Или может есть какое то универсальное решение (какие то схемы, патерны)?

Заранее спасибо за ответы!
__________________
ЛОГИКА - залог программирования!

Старый 29.10.2010, 21:49
petri вне форума Посмотреть профиль Отправить личное сообщение для petri Найти все сообщения от petri
  № 2  
Ответить с цитированием
petri
 
Аватар для petri

Регистрация: Dec 2009
Сообщений: 60
Как вариант - создать в Main экземпляр EventDispatcher и в классе Г делать диспатч своего события а в Б слушать.

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

Регистрация: Nov 2005
Адрес: 26°58′49.06″ 49°24′35.72″ Ymaps
Сообщений: 119
Отправить сообщение для ZGG с помощью ICQ Отправить сообщение для ZGG с помощью Skype™
petri, а можно подробнее? А то я ничего не понял. Я только учусь...

А можно еще вопросик: а как Экземпляру класса А, получить значение переменной класса Main. B то и то не дисплейобджект, т.е. через парент не получится.
__________________
ЛОГИКА - залог программирования!


Последний раз редактировалось iNils; 29.10.2010 в 22:19.
Старый 29.10.2010, 22:24
easy.proger вне форума Посмотреть профиль Отправить личное сообщение для easy.proger Найти все сообщения от easy.proger
  № 4  
Ответить с цитированием
easy.proger

Регистрация: Jun 2010
Адрес: somewhere in the universe
Сообщений: 195
- in class B stage.addEventListener("myEvent",myHandlerEventFromG);
- in class G stage.dispatchEvent(new Event("myEvent"));
если stage не доступен, то правильней всего передавать ссылку на Main и через Main передавать сообщения, либо пойти путем статик переменных/слушателей

Цитата:
Сообщение от ZGG Посмотреть сообщение
petri, а можно подробнее? А то я ничего не понял. Я только учусь...

А можно еще вопросик: а как Экземпляру класса А, получить значение переменной класса Main. B то и то не дисплейобджект, т.е. через парент не получится.
- В класс А передать ссылку на класс Main ( предпочтительней )
- либо
in Main

Код AS3:
private var _myVar:… 
public static var myVar:…
 
public function set myVar(value:…):void
{
     Main.myVar = value
     _myVar = value;
}
in class A
Код AS3:
Main.myVar


Последний раз редактировалось easy.proger; 29.10.2010 в 22:31.
Старый 29.10.2010, 23:01
ZGG вне форума Посмотреть профиль Отправить личное сообщение для ZGG Найти все сообщения от ZGG
  № 5  
Ответить с цитированием
ZGG
 
Аватар для ZGG

Регистрация: Nov 2005
Адрес: 26°58′49.06″ 49°24′35.72″ Ymaps
Сообщений: 119
Отправить сообщение для ZGG с помощью ICQ Отправить сообщение для ZGG с помощью Skype™
easy.proger, покажи пожалуйста на простом примере, а то я вот сижу и не понимаю:
Майн
Код AS3:
package
{	
	import flash.display.*;
	import flash.events.*;
 
	public class Main extends Sprite
	{
		private var a:A
		public var s:uint=12
 
		public function Main()
		{
			a=new A(this)
			addEventListener("hello",fff)
		}
 
		public function fff(e:Event):void 
		{
			trace("dsdsd")
		}
	}
}
Класс А
Код AS3:
package  
{
	import flash.display.Sprite;
	import flash.events.Event;
 
	public class A
	{
		public function A(d:Sprite) 
		{
			trace(d['s'])			
			d.dispatchEvent(new Event("hello"))			
		}		
	}
}
выводится только значение s, но не диспатчится:
Цитата:
12
__________________
ЛОГИКА - залог программирования!


Последний раз редактировалось ZGG; 29.10.2010 в 23:15.
Старый 30.10.2010, 00:06
easy.proger вне форума Посмотреть профиль Отправить личное сообщение для easy.proger Найти все сообщения от easy.proger
  № 6  
Ответить с цитированием
easy.proger

Регистрация: Jun 2010
Адрес: somewhere in the universe
Сообщений: 195
stage.addEventListener("hello",fff)
stage.dispatchEvent(new Event("hello"))
и как я говорил так делать не стоит и лучше передавать ссылку на Main
внимательней нада быть !

можно еще так, но тоже плохая практика, однако если не хочется передавать ссылки и есть полная уверенность, что экземпляр Main будет один то:

в Main
Код AS3:
public static var dispatcher:EventDispatcher = new EventDispatcher();
 dispatcher.addEventListener("hello",fff);
в нужном классе
Код AS3:
Main.dispatcher.dispatchEvent(new Event("hello"))

Старый 30.10.2010, 00:22
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 7  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
Цитата:
выводится только значение s, но не диспатчится:
Конкретно в вашем случае вы подписываетесь позже чем диспатчите событие.
Догадаетесь почему?
__________________
trace("Остановите Землю, я сойду!!!");

Старый 30.10.2010, 00:27
easy.proger вне форума Посмотреть профиль Отправить личное сообщение для easy.proger Найти все сообщения от easy.proger
  № 8  
Ответить с цитированием
easy.proger

Регистрация: Jun 2010
Адрес: somewhere in the universe
Сообщений: 195
Совсем уже сплю, не заметил... да, действительно проблема в том, что автор сначала вызывает конструктор, а потом подписывается, я сначала подумал, что он не заметил, что я через stage предложил диспачить события

Старый 30.10.2010, 01:36
ZGG вне форума Посмотреть профиль Отправить личное сообщение для ZGG Найти все сообщения от ZGG
  № 9  
Ответить с цитированием
ZGG
 
Аватар для ZGG

Регистрация: Nov 2005
Адрес: 26°58′49.06″ 49°24′35.72″ Ymaps
Сообщений: 119
Отправить сообщение для ZGG с помощью ICQ Отправить сообщение для ZGG с помощью Skype™
easy.proger, огромное спасибо за ответы!
Кажется понемножку начинаю разбираться.

Цитата:
Конкретно в вашем случае вы подписываетесь позже чем диспатчите событие.
Ой, точно. Невнимательный я!
__________________
ЛОГИКА - залог программирования!

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

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

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


 


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


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