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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 10.08.2007, 11:33
vvk80 вне форума Посмотреть профиль Отправить личное сообщение для vvk80 Найти все сообщения от vvk80
  № 1  
Ответить с цитированием
vvk80
[+3 09.12.07]

Регистрация: Oct 2006
Сообщений: 114
По умолчанию Взаимодействие экземпляров класса

Уважаемые форумчане!

Вопрос, который я собираюсь задать, наверное уже обсуждался и обсуждается в данный момент, но я решил создать отдельную тему (если что, исправьте)..

Итак, у меня есть несколько экземпляров класса MyClass (наследованный от Sprite), добавленные на сцену var myVar:MyClass = new MyClass (... param).

Соответственно в классе есть ивенты и т.д... Мне нужно чтобы при клике на один экземпляр класса, все другие тоже выполняли какое-либо действие (простейший пример - задвигались назад и уменьшались в размерах). Причем event.target выполнял бы другое действие.

Тут в пред. темах речь шла о классах контейнерах, но я, честно признаюсь, не въехал, как это сделать...

Пожалуйста, растолкуйте чайнику, как сделать описанную мною схему правильно и с максимальным быстройдействием. Если можно то максимально подробно и по шагам (на пальцах . Хотя бы схему дайте, которой надо следовать... А то совсем зашел в тупик...

Заранее большое спасибо за любую помощь...

Старый 10.08.2007, 12:51
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 2  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
вариант без контейнера
на пальцах: создаем статический диспатчер, подписываем на него обработчики всех экземпляров, по клику заставляем его диспатчить событие: все экземпляры его получают..

другой вариант на пальцах: в статический массив загоняем ссылки на все экземпляры, по клику опять же в статическом методе в цикле вызываем нужный метод для этого массива (т.е. тот же диспатчер, тока 'самопальный')


Последний раз редактировалось silin; 10.08.2007 в 12:56.
Старый 10.08.2007, 13:03
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 3  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

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

Старый 10.08.2007, 13:07
vvk80 вне форума Посмотреть профиль Отправить личное сообщение для vvk80 Найти все сообщения от vvk80
  № 4  
Ответить с цитированием
vvk80
[+3 09.12.07]

Регистрация: Oct 2006
Сообщений: 114
Спасибо, код видел... осталось только его прикрутить к моми целям... что не так просто (для меня)

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

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

Старый 10.08.2007, 13:36
vvk80 вне форума Посмотреть профиль Отправить личное сообщение для vvk80 Найти все сообщения от vvk80
  № 6  
Ответить с цитированием
vvk80
[+3 09.12.07]

Регистрация: Oct 2006
Сообщений: 114
Прошу прощения за наглость...
но у меня вопрос

немного модифицировал, предоставленный ув. silin код след. образом
Код:
package {
	import flash.display.MovieClip;
	import flash.events.*;

	public class  MenuButton extends MovieClip
	{
		
		static private  var dispatcher:ButDispatcher=new ButDispatcher();
		
		public function MenuButton()
		{
            dispatcher.addEventListener(ButDispatcher.BTN_STATUS, onStatus);
			addEventListener("click",onClick);
			addEventListener("rollOver",onOver);
			addEventListener("rollOut",onOut);
		}
		
		private function onClick(evt:Event):void
		{
			dispatcher.broadcast("click");
		}
		
		private function onOver(evt:Event):void
		{
			dispatcher.broadcast("over");
			this.addEventListener(Event.ENTER_FRAME,increase);
			this.removeEventListener(Event.ENTER_FRAME,diminish);
		}
		private function onOut(evt:Event):void
		{
			dispatcher.broadcast("out");
			this.addEventListener(Event.ENTER_FRAME,diminish);
			this.removeEventListener(Event.ENTER_FRAME,increase);
		
		}
				
		public function onStatus(evt:ButEvent):void
		{
			trace(name+":"+evt.status);
		}
		private function increase(evt:Event):void
		{
			if (this.scaleX<2)
			{
				this.scaleX+=.1;
				this.scaleY+=.1;
			}
			else
			{
				this.removeEventListener(Event.ENTER_FRAME,increase);
			}
		}
		private function diminish(evt:Event):void
		{
			if (this.scaleX>.5)
			{
				this.scaleX-=.1;
				this.scaleY-=.1;
			}
			else
			{
				this.removeEventListener(Event.ENTER_FRAME,diminish);
			}
		}
	}
}
Если делаю не праивльно, просьба пнуть и указать, как правильно
В итоге сейчас мне нужно следующее:
чтобы по клику на один экземпляр, тот на кого кликнули (event.target) выезжал вперед, другие двигались назад... (попробовал решить в лоб, через event.target, но к другим экземплярам (кот. не являются event target) не понял как обратиться...

Заранее спасибо за помощь!
P.S.
признаюсь, еще пока не совсем разобрался как код работает, всякие там диспатчеры, но я разберусь

Старый 10.08.2007, 14:28
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 7  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
т.е, тебе просто надо знать какой из экземпляров инициировал событие..
ну и передавай его диспатчеру , а тот добавит его в событие..
тогда в обработчиках события экземпляров будем знать по нему кликнули или по соседу..
Код:
package {
	import flash.display.MovieClip;
	import flash.events.*;

	public class  MenuButton extends MovieClip {
		
		static private  var dispatcher:ButDispatcher=new ButDispatcher();
		
		public function MenuButton(){
            dispatcher.addEventListener(ButDispatcher.BTN_STATUS, onStatus);
			addEventListener("click",onClick);
		}
		
		private function onClick(evt:Event):void{
			dispatcher.broadcast(this);
		}
		
		public function onStatus(evt:ButEvent):void	{
			var self:Boolean=evt.sender==this;
			addEventListener(Event.ENTER_FRAME,self ? increase : diminish);
			removeEventListener(Event.ENTER_FRAME,self ? diminish : increase);
		}

		private function increase(evt:Event):void{
			if (this.scaleX<2)	{
				this.scaleX+=.1;
				this.scaleY+=.1;
			}
			else{
				this.removeEventListener(Event.ENTER_FRAME,increase);
			}
		}
		
		private function diminish(evt:Event):void{
			if (this.scaleX>.5)	{
				this.scaleX-=.1;
				this.scaleY-=.1;
			}
			else{
				this.removeEventListener(Event.ENTER_FRAME,diminish);
			}
		}
	}
}
Код:
package {
	import flash.events.*;
	class ButDispatcher extends EventDispatcher {
		public static var BTN_STATUS:String = "btnStatus";
		
		public function broadcast(sender:Object):void {
			dispatchEvent(new ButEvent(sender));
		}
	}
}
Код:
package {
	import flash.events.Event;
	public class  ButEvent extends Event{
		public var sender;
		
		public function ButEvent(sender:Object=null){
			super(ButDispatcher.BTN_STATUS);
			this.sender=sender;
		}
	}
}

Старый 10.08.2007, 15:35
vvk80 вне форума Посмотреть профиль Отправить личное сообщение для vvk80 Найти все сообщения от vvk80
  № 8  
Ответить с цитированием
vvk80
[+3 09.12.07]

Регистрация: Oct 2006
Сообщений: 114
silin, спасибо...
наверное я неправильно объяснил, что я хочу... прошу прощения...

ниже доработанный мною код (наверняка много всякой фигни написал, но я не знаю как правильно)

Код:
package {
	import flash.display.MovieClip;
	import flash.events.*;

	public class  MenuButton extends MovieClip
	{
		private var self:Boolean;
		private var sender;
		static private  var dispatcher:ButDispatcher=new ButDispatcher();
		
		public function MenuButton()
		{
            dispatcher.addEventListener(ButDispatcher.BTN_STATUS, onStatus);
			addEventListener("click",onClick);
			addEventListener("rollOver",onOver);
			addEventListener("rollOut",onOut);
		}
		
		private function onClick(evt:Event):void
		{
			dispatcher.broadcast("click",this);
			if(sender==this)
			{
				trace(self);
				this.x-=20;
			}
			else
			{
				this.x+=120; //НЕ РАБОТАЕТ ТАК КАК Я ХОЧУ ПО ИДЕЕ ЕСЛИ ЭТО СОБЫТИЕ ТРАНСЛИРУЕТСЯ НА ВСЕ ЭКЗЕМПЛЯРЫ ТО ОНИ ДОЛЖНЫ СДВИГАТЬСЯ НА УКАЗАННУЮ ВЕЛИЧИНУ...
				//У МЕНЯ ЖЕ ДВИГАЕТСЯ ТОЛЬКО ИНИЦИАТОР СОБЫТИЯ. бЛИН КАК ПОЧИНИТЬ...
				trace(this.x);
			}
		}
		
		private function onOver(evt:Event):void
		{
			dispatcher.broadcast("over", this);
			this.addEventListener(Event.ENTER_FRAME,increase);
			this.removeEventListener(Event.ENTER_FRAME,diminish);
		}
		private function onOut(evt:Event):void
		{
			dispatcher.broadcast("out",this);
			this.addEventListener(Event.ENTER_FRAME,diminish);
			this.removeEventListener(Event.ENTER_FRAME,increase);
		
		}
				
		public function onStatus(evt:ButEvent):void
		{
			self=evt.sender==this;
			sender=evt.sender;
			trace(name+":"+evt.status);
			
		}
		private function increase(evt:Event):void
		{
			if (this.scaleX<2)
			{
				this.scaleX+=.1;
				this.scaleY+=.1;
			}
			else
			{
				this.removeEventListener(Event.ENTER_FRAME,increase);
			}
		}
		private function diminish(evt:Event):void
		{
			if (this.scaleX>1)
			{
				this.scaleX-=.1;
				this.scaleY-=.1;
			}
			else
			{
				this.removeEventListener(Event.ENTER_FRAME,diminish);
			}
		}
	}
}

Код:
package {
	import flash.events.*;
	class ButDispatcher extends EventDispatcher 
	{
		public static var BTN_STATUS:String = "btnStatus";
		
		public function broadcast(status:String,sender:Object):void 
		{
			dispatchEvent(new ButEvent(ButDispatcher.BTN_STATUS,status,sender));
		}
	}
}
Код:
package {
	import flash.events.Event;
	public class  ButEvent extends Event
	{
		public var status:String;
		public var sender;
		
		public function ButEvent(type:String,status:String=null,sender:Object=null)
		{
			super(type);
			this.status=status;
			this.sender = sender;
		}
	}
}
Заранее спасибо за помощь!

Старый 10.08.2007, 15:56
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 9  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
onClick вызывается при нажатии на конкретный экземпляр, в нем вызывается dispatcher.broadcast, который в свою очередь вызовет onStatus у всех экземпляров..
какой логикой ты руководствуешься, ожидая вызова onClick у всех экземпляров - загадка..

Старый 10.08.2007, 16:34
vvk80 вне форума Посмотреть профиль Отправить личное сообщение для vvk80 Найти все сообщения от vvk80
  № 10  
Ответить с цитированием
vvk80
[+3 09.12.07]

Регистрация: Oct 2006
Сообщений: 114
Цитата:
Сообщение от silin
onClick вызывается при нажатии на конкретный экземпляр, в нем вызывается dispatcher.broadcast, который в свою очередь вызовет onStatus у всех экземпляров..
какой логикой ты руководствуешься, ожидая вызова onClick у всех экземпляров - загадка..
silin, спасибо, сейчас вроде разобрался.. в итоге я повесил на onStatus проверку, какое событие в данный момент обрабатывается, чтобы сделать разные варианты движения на rollOver и на onClick

Код:
public function onStatus(evt:ButEvent):void
		{
			self=evt.sender==this;
			trace(name+":"+evt.status);
			if (evt.status == "click")
			{
				trace("CLICK");
				
				addEventListener(Event.ENTER_FRAME,self ? increase : diminishMore );
			}
			else
			{
				trace("OTHER");
			}

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

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

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


 


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


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