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

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

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

Регистрация: Mar 2014
Сообщений: 4
По умолчанию Единичное реагирование на событие мыши.

Имеется Class1 и его наследник Class2.

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

Class2 слушает событие мыши (свое или детей) и принимает определенный статус. Поскольку Class2 не знает какие у него дети (и дети детей) - все Class2 слушают событие мыши.

Задача: добиться того, чтобы первый попавшийся родитель Class2 (или сам Class2, если он был целью события) отработал метод (получал статус). А все следующие за ним выше - проигнорировали. При чем иметь статус одновременно может только один экземпляр Class2.

- останавливать эвент нельзя.
- подгонять Class1 под нужды Class2 нельзя. Не хочется городить в предке код, который ему не нужен.
- полностью заявить о полученном статусе ближайший Class2 может только в обработчике события. Никаких setinterval, timer, enterFrame etc

У меня есть несколько "костыльных" вариантов вроде: ближайший Class2 загоняет в internal переменную Class2.gotStatus = true, потом он и все последующие смотрят своих родителей, и если среди них больше нет экземпляра Class2 - устанавливают Class2.gotStatus = false.

Но, думается, есть разумный и простой вариант, которого я пока не вижу.

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

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
Код AS3:
if (event.target == event.currentTarget)
{
	// обрабатываем
}

Старый 26.08.2014, 23:58
iaf вне форума Посмотреть профиль Отправить личное сообщение для iaf Найти все сообщения от iaf
  № 3  
Ответить с цитированием
iaf

Регистрация: Mar 2014
Сообщений: 4
тогда уж
Код AS3:
if (event.eventPhase === EventPhase.AT_TARGET)
{
	// обрабатываем
}
дешевле на геттер.
Но не подходит. Экземпляры Class1 также могут быть целью события, а получить статус должен экземпляр Class2, стоящий выше (если он, конечно, вообще есть).

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

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

тогда остается только 'вручную всплыть' до ближайшего Class2
Код AS3:
var targ:DisplayObject = event.target as DisplayObject;
while (targ != stage)
{
	if (targ is Class2)
	{
		if (targ == event.currentTarget)
		{
 
			// обрабатываем
		}
		break;
	}
	targ = targ.parent;
 
}

Старый 27.08.2014, 01:07
iaf вне форума Посмотреть профиль Отправить личное сообщение для iaf Найти все сообщения от iaf
  № 5  
Ответить с цитированием
iaf

Регистрация: Mar 2014
Сообщений: 4
Код AS3:
if (targ == event.currentTarget)
честно говоря, не понял для чего идет эта проверка.

Но не суть. Видимо, предполагается прописать в Class1 (предке) ручное "всплытие" до Class2 (наследника). А это уже:
Цитата:
- подгонять Class1 под нужды Class2 нельзя. Не хочется городить в предке код, который ему не нужен.
Немного акцентирую. Все экземпляры Class2 должны слушать мышь, ибо находиться они могут на любом участке иерархии, а Class1 может быть как одним из детей экземпляра Class2, так и его родителем. Только один экземпляр Class2, ближайший к цели события, может быть в фокусе (иметь статус, который отбирается у предыдущего владельца).
Ключевая проблема: как-то "очевидно" заставить все, оставшиеся в цепи родителей, экземпляры Class2 не реагировать на всплывающий мышиный эвент (который уже отработал на нижестоящем Class2)


Последний раз редактировалось iaf; 27.08.2014 в 01:21.
Старый 27.08.2014, 01:21
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 6  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
не, все происходит в обработчике Class2
эта та же самая проверка, только вместо e.target (которым может быть Class1, например, или вообще Sprite) смотрим вверх по дисплейЛисту до первого Class2 , если он и есть подписант, то ему и карты в руки, а остальные получатели события не у дел

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

Регистрация: Mar 2007
Сообщений: 319
я думаю нужно подписаться у всех Class2 на фазу захвата, последний кто принял это событие на фазе захвата будет первым кто получит событие на целевой фазе из всех Class2 и Class1 и дальше от этого прыгать. фаза захвата обратная фазе всплытия и отрабатывается первой

Старый 27.08.2014, 01:33
iaf вне форума Посмотреть профиль Отправить личное сообщение для iaf Найти все сообщения от iaf
  № 8  
Ответить с цитированием
iaf

Регистрация: Mar 2014
Сообщений: 4
Цитата:
Сообщение от Nooob Посмотреть сообщение
я думаю нужно подписаться у всех Class2 на фазу захвата
Хорошая мысль. Однако используется сторонний фреймворк, у которого фазы захвата нет.

Цитата:
Сообщение от silin Посмотреть сообщение
не, все происходит в обработчике Class2
В сущности да - вариант. Пока на нем и остановлюсь, если не будет еще идей. Спасибо!

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

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

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


 


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


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