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

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

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

Регистрация: Mar 2013
Сообщений: 290
По умолчанию MovieClip: единый addEventListener

(Можно даже сказать: Единый Слушатель Событий Ада), лол.

Ок, всем привет.

Есть мувиклип Area1, в котором находятся три других мувиклипа: Krug1, Krug2, Krug3.
Все они залинкованы к одноименным классам через галочку Export to ActionScript.

Изначально стэйдж пустой. Класс Main заполняет его вот так:

Нажмите на изображение для увеличения
Название: snap4940.jpg
Просмотров: 180
Размер:	68.5 Кб
ID:	29909

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

Можно ли повесить только один слушатель на объект Area1, чтобы он, через родительские ссылки определял, какой кружок был нажат?

Я попытался сделать так:

Основной класс:
Код AS3:
package
{
 
	import flash.display.Sprite;
 
	public class Main extends Sprite
	{
		private var area1:Area1;
		private var eventHandler:EventHandler;
 
		public function Main()
		{
			area1 = new Area1();
			area1.x = 120;
			area1.y = 150;
			addChild(area1);
 
			eventHandler = new EventHandler(area1);
 
		}
	}
 
}
Класс EventHandler:

Код AS3:
package
{
	import flash.display.MovieClip;
	import flash.events.*;
 
	public class EventHandler extends EventDispatcher
	{
 
		public function EventHandler(mc:MovieClip)
		{
			mc.addEventListener(MouseEvent.CLICK, clickHandler);
		}
 
		private function clickHandler(e:Event)
		{
 
//			if (e.currentTarget. ???)
//			{
//				trace("Krug1");
//			}
//			else if (e.currentTarget. ???)
//			{
//				trace("Krug2");
//			}
//			else if (e.currentTarget. ???)
//			{
//				trace("Krug3");
//			}
 
 
 
		}
 
 
 
	}
 
 
}
Вот там где камменты, надо как-то условие задать, чтобы определялся кружок.

Но как это сделать?
Вроде бы нужно как-то e.currentTarget. использовать, но не понимаю как именно.

Некоторое соображение:
Изначально, у объектов на стэйдж нет <Instance names>.
Подозреваю что если бы они были, то было бы проще.
Тогда наверное прокатило бы что-то вроде:
Код AS3:
e.currentTarget.Area1_Instancename.Krug1_instancename
Но хотелось бы решить задачу без привязки к <Imstance name>, если это возможно конешно.

Старый 14.08.2013, 18:16
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 2  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Код AS3:
if(e.currentTarget is Krug1){...}
Так поможет?
__________________
hauts.ru

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

Регистрация: Mar 2011
Сообщений: 243
Используйте #Event.target

Старый 14.08.2013, 20:59
AlexLucas вне форума Посмотреть профиль Отправить личное сообщение для AlexLucas Найти все сообщения от AlexLucas
  № 4  
Ответить с цитированием
AlexLucas
[+1 05.11.12]
 
Аватар для AlexLucas

Регистрация: Feb 2011
Сообщений: 431
currentTarget выдаст объект на который вы повесили слушатель, в данном случае Area1 (это прямоугольник в котором круги? ) а не круг.
target выдаст непосредственно IEventDispatcher который первым словил событие, если объект состоит из множества фигурок, то e.target будет не мувик Krug1, а какой-нибудь Shape694, и нужно будет проверять какой круг содержит этот шейп.
Можно создать класс Круг, там рисовать кружок, ловить и обрабатывать событие, в этом случае E.currentTarget будет именно тот Круг который нужен.

Цитата:
Изначально, у объектов на стэйдж нет <Instance names>.
Если объекту явно имя не задано, задаётся шаблонное имя (ИмяКласса672 например, цифра как-то вычисляется непонятно).
__________________
Oomph

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

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Подписаться на все три клика одним листенером и смотреть event.currentTarget

Добавлено через 1 минуту
Цитата:
Код AS3:
class EventHandler extends EventDispatcher
А вот это слегка вырвиглазое решение.
__________________
Кто к нам с чем для чего - тот у нас того от того.

Старый 14.08.2013, 23:42
Котейка вне форума Посмотреть профиль Отправить личное сообщение для Котейка Найти все сообщения от Котейка
  № 6  
Ответить с цитированием
Котейка
 
Аватар для Котейка

Регистрация: Aug 2013
Сообщений: 56
Dukobpa3, путаетесь. Смотреть надо target

Старый 14.08.2013, 23:45
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 7  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Это вы, товарищ не поняли мой ответ.
Я сказал про три клика. На три объекта. Но листенер один.

Добавлено через 1 минуту
А про таргет вон выше ответили. Всякие шейпы фильтровать нафиг надо. Таргетом никогда не пользуюсь.
__________________
Кто к нам с чем для чего - тот у нас того от того.

Старый 14.08.2013, 23:57
Котейка вне форума Посмотреть профиль Отправить личное сообщение для Котейка Найти все сообщения от Котейка
  № 8  
Ответить с цитированием
Котейка
 
Аватар для Котейка

Регистрация: Aug 2013
Сообщений: 56
Dukobpa3, а вон оно что) Ну тогда да currentTarget.
Какой вариант удобнее и лучше зависит от задачи. В данном случае разницы нет.
В случае если объектов туева хуча, (н-р интерактивная карта) target будет предпочтительнее.

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

Регистрация: Dec 2009
Сообщений: 125
Записей в блоге: 1
В моей практике встречался подобный момент. Некоторые выдержки из кода:

Код AS3:
sp2.addChild(mass[it]);	// добавляем пазл в спрайт, где размещаются пазлы
sp2.addEventListener(MouseEvent.CLICK, toMoving, true); // добавляем прослушиватель спрайту с пазлами
Код AS3:
		public function toMoving(e):void {			
			var evDisp = e.target; // это экземпляр класса пазл
			}
		}
Похоже ваша цель заключается в использовании параметра useCapture метода addEventListener Если не знакомы, то разбирайте фазы в потоке событий

Старый 15.08.2013, 11:24
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 10  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
Hauts, нет, так не помогло:
Код AS3:
			if (e.currentTarget is Krug1)
			{
				trace("Krug1");
			}
Иф не срабатывает, видимо потому что e.currentTarget = Area1, то есть квадрату-родителю.
Спасибо за указание на прием: is Object, я не сообразил что так можно.

Deimos747, AlexLucas, Котейка, благодарю за наводку на .target, сделал вот так:

Код AS3:
 
			if (e.target is Krug1)
			{
				trace("Krug1");
			}
			else if (e.target is Krug2)
			{
				trace("Krug2");
			}
			else if (e.target is Krug3)
			{
				trace("Krug3");
			}
Всё работает : ) Вроде никакие заморочки с шейпами и хитрыми номерами не нужны.
Или может быть они были бы нужны в каком-то более сложном случае? Например при сильной вложенности, или еще как.

Dukobpa3,
Код AS3:
А вот это слегка вырвиглазое решение.
А почему кстати? Я только недавно изучаю AS3.0, но по совету maincode расширял в данном случае не Sprite, а EventDispatcher.

Dukobpa3,
Цитата:
Подписаться на все три клика одним листенером и смотреть event.currentTarget
Не совсем понимаю, что вы имеете ввиду? То есть на каждый кружок повесить addEventListener, но который ссылается на единый обработчик?

SvetozarPNZ, мне просторе решение с target помогло.
Про useCapture не в курсе, возможно это нужно в более сложных случаях вложенности объектов? За ссылку спасибо.

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

Теги
addeventlistener , movieclip , единый слушатель
Опции темы
Опции просмотра

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

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


 


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


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