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

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

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

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
По умолчанию Отловить клик по контейнеру

Ситуация такая, есть некий контейнер (в действительности их много похожих), в который динамически помещаются различные DisplayObject-ы, например, Bitmap в не известном количестве. На одном глобальном контейнере (пусть для простоты это будет stage) стоит слушатель клика мыши. Как определить, что клик произошел именно по тому контейнеру, о котором упоминалось в самом начале (куда подгружаются объекты)? Один способ знаю, но его "кривость" зашкаливает, поэтому прошу помощи. Заранее спасибо.
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

Старый 24.01.2011, 01:00
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 2  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Я так понял есть два контейнера один поверх другого? Допустим на один и второй повешано событие клика, при этом стоит указать что на том контейнере что сверху mouseChildren = true, а вот на том что снизу сделать прозрачный бекграунд.

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

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
А если в глобальном контейнере проверять того, кто вызвал событие?
Код AS3:
globalContainer.addEventListener(MouseEvent.CLICK,cl);
function cl(e:MouseEvent):void
{
	if(e.target==container){trace("клик по контейнеру")}
}

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

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
Код AS3:
stage.addEventListener(MouseEvent.CLICK, onGlobalContainerClick, false, 0, true);
....
private function onGlobalContainerClick(e:MouseEvent):void {
			trace(e.target);
			trace(e.currentTarget);
		}
stage - глобальный контейнер
а клацнули мы примерно по stage.Sprite.Sprite.Sprite.Bitmap (все, естественно, условно). Там вот, отловить нужно объект, выделенный в цепочке красным. Известно, что он является экземпляром класса MyClass, наследованным от Sprite. И при этом глубина нахождения различных элементов не известна, т.е. изменчива, в зависимости от места клика.

Когда я в начале поста писал про кривой способ, это имелся в виду набор конструкций типа
if(parent is MyClass)...
if(parent.parent is MyClass)...
и т.д.
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

Старый 24.01.2011, 02:49
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 5  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Наверняка этот Sprite (в дальнейшем "кнопка") создал ты и он не является продуктом сторонней библиотеки.
Поэтому:
1. Перехвати клик в коде, который точно знает что это за кнопка (Окно, содержащее эту кнопку или рендерер, содержащий кнопку, или это сама кнопка).
2. Как перехватишь, отправь кастромное событие "mySpriteClick" (с bubbling-фазой, конечно)
3. Поймай событие "mySpriteClick" и по event.target определи, что это была за кнопка.
Можно (чаще нужно) в кастомном событии сделать типизированное поле mySprite:Sprite и устанавливать его при отправке и читать при приеме

Если нет контейнера, который знает кнопку и может послать событие - создай, положи туда кнопку и добавляй этот контейнер везде вместо самой кнопки. Это вполне оправдано.

Старый 24.01.2011, 03:00
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 6  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
DisplayObjectContainer.getObjectsUnderPoint ()
__________________
(и)Нильс.ru | Плагины для FlashDevelop

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

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
Цитата:
Перехвати клик в коде
expl, пожалуй это пока что лучший вариант. Единственное что - хотелось бы избежать слушателя в каждом подобном экземпляре (а их может быть не одна сотня)
Цитата:
DisplayObjectContainer.getObjectsUnderPoint ()
iNils, в данной ситуации контейнер отлавливаться не будет, т.к. он изначально пустой (тут я может путаю, но факт остается фактом). Я могу получить все содержимое контейнера, если по нему пришелся клик, а дальше тот костыль с parent-ами, которого так хочется избежать.
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

Старый 24.01.2011, 03:18
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 8  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Код AS3:
хотелось бы избежать слушателя в каждом подобном экземпляре (а их может быть не одна сотня)
Но диспатчится то будет из этой сотни 1-30 событий в секунду.
Или имеется ввиду потеря времени на подписку?

Скорость не проверял, но:
есть такой метод willTrigger, им можно проверить, слушает ли кто-нибудь это всплывающее событие вверх по списку.
И не создавать его без надобности в "контейнерах-ретрансляторах"

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

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

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


 


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


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