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

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

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

Регистрация: Nov 2010
Сообщений: 430
Question Слушатели для детей объекта

Здравствуйте.
Подскажите, пожалуйста, как быть в такой ситуации:
есть объект на котором N детей, они должны реагировать на события, допустим клик мышью, получается нужно поставить N слушателей на всех детей или можно поставить как-то один слушатель на родителя и уже у него узнавать по кому кликнули?
__________________
Лучше спросить и выставить себя дураком на пять минут, чем не спросить и остаться дураком на всю жизнь.

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

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Поставить на родителя, и смотреть target события. Если дети составные сделайте им mouseChildren=false всем.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

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

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Получите вы target, а дальше что? Пойдетё перебирать варианты, а не юнит ли это, а не кнопка ли это. Потом пойдут приведения типов...
Вобщем этот не даёт ничего хорошего.

Задайтесь вопросом: Что вы хотите узнать о действии с ребёнком?
Создайте свой эвент с этой информацией (можно ссылку на ребёнка там тоже сохранить)
Сделайте его всплывающим.

В ребёнке просто сделайте редиспетчинг:
Код AS3:
this.addEventListener(MouseEvent.Click, onClick);
...
private function onClick(event:MouseEvent):void {
    this.dispatchEvent(new ChildEvent(ChildEvent.CHILD_CLICK, this, _neededData));
}
Тогда в родителе не надо будет подписываться на каждого ребёнка и будет понятно что происходит:
Код AS3:
public class Parent extends Sprite {
...
this.addEventListener(ChildEvent.CHILD_CLICK, onChildClick);
...
private function onChildClick(event:ChildEvent):void {
    event.child.DoSomething();
    DoSomething(event.neededData);
    ...
}
...
}

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Пойдетё перебирать варианты, а не юнит ли это, а не кнопка ли это.
Собственно, и что в этом плохого?
Я часто делаю что-то на подобие:
Код AS3:
if (e.target is MenuButton) {
      var menuButton:MenuButton = e.target as MenuButton;
      // и тут уже получаю все, что нужно от кнопки меню
} else if (e.target is GameUnit) {
      var gameUnit:GameUnit = e.target as GameUnit;
      // управление юнитом
}
Что-то не вижу плюсов у варианта со своим событием в этом случае

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

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
caseyryan,
Аналогично
__________________
Дети не должны знать о своих родителях

Старый 08.05.2013, 20:51
Babylon вне форума Посмотреть профиль Отправить личное сообщение для Babylon Посетить домашнюю страницу Babylon Найти все сообщения от Babylon
  № 6  
Ответить с цитированием
Babylon
[+1 25.10.13]
[+4 18.03.14]
 
Аватар для Babylon

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
Если вы не будете переставлять чилда в другой родительский контейнер, то можно и на контейнер.

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

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Собственно, и что в этом плохого?
Я часто делаю что-то на подобие:
Я написал:
Код AS3:
this.addEventListener(ChildEvent.CHILD_CLICK, onChildClick);
И я уверен что слушаю чайлда.
Зачем мне какие-то проверки? (а ведь там может потребоваться не просто is, а ещё и вверх по дереву пройтись, если кликнули по ребёнку ребёнка).
Зачем мне касты, которые очень осложняют рефакторинг и вообще уменьшают надёжность кода? - Компилятор то не проверяет.
Зачем мне усложнение чтения кода.
За-чем?

Цитата:
Если вы не будете переставлять чилда в другой родительский контейнер, то можно и на контейнер.
Я бы такие правила не выводил. Мне скорее всего итересны дети, что лежат в контейнере, а если его убрали - то не интересны. А может и нет. К чему эти правила.

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Если в контейнере копошатся две сотни чайлдов, расставлять две сотни листенеров на клик, две сотни листенеров на маусовер и еще две на маусаут - мне кажется, непозволительная роскошь. Поэтому в общем виде разумно вешать на контейнер три листенера, а после получения события уже смотреть, кто его прислал.

Старый 09.05.2013, 13:04
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 9  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Поэтому в общем виде разумно вешать на контейнер три листенера, а после получения события уже смотреть, кто его прислал.
На самой подписке тока сэкономите, а события всё равно будут создаваться для каждого чайлда, а редиспетчинг можно предотвратить с помощью проверки на willTrigger (хотя она тоже не за даром делается)

Тут справедливы другие соображения по оптимизации:
- если их 200(да хоть 1000) и все на экране - значит это скорее всего какая-то сетка. Тогда вообще лучше спрайты не делать (или отключить реакцию на события для контейнера), а по координатам (этож регулярная сетка, getChildsAtPoint() не нужен) определять куда кликнули
- если их хоть 10 000, но на экране показывается только 20 (например, скроллирующийся список) - то надо просто удалять из контейнера(и держать в памяти) тех, что вне экрана - тогда при движении мыши не будет никаких тормозов (если не удалять - туши свет - любое перемещение мыши - fps падает до нескольких кадров - это проверено). Но события можно вешать на каждый спрайт - с этим никаких проблем.

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

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
expl,
Дельные советы, спасибо
__________________
Дети не должны знать о своих родителях

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

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

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


 


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


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