|
|
|||||
Регистрация: Nov 2010
Сообщений: 430
|
Слушатели для детей объекта
Здравствуйте.
Подскажите, пожалуйста, как быть в такой ситуации: есть объект на котором N детей, они должны реагировать на события, допустим клик мышью, получается нужно поставить N слушателей на всех детей или можно поставить как-то один слушатель на родителя и уже у него узнавать по кому кликнули?
__________________
Лучше спросить и выставить себя дураком на пять минут, чем не спросить и остаться дураком на всю жизнь. |
|
|||||
Получите вы target, а дальше что? Пойдетё перебирать варианты, а не юнит ли это, а не кнопка ли это. Потом пойдут приведения типов...
Вобщем этот не даёт ничего хорошего. Задайтесь вопросом: Что вы хотите узнать о действии с ребёнком? Создайте свой эвент с этой информацией (можно ссылку на ребёнка там тоже сохранить) Сделайте его всплывающим. В ребёнке просто сделайте редиспетчинг: this.addEventListener(MouseEvent.Click, onClick); ... private function onClick(event:MouseEvent):void { this.dispatchEvent(new ChildEvent(ChildEvent.CHILD_CLICK, this, _neededData)); } |
|
|||||
Цитата:
Я часто делаю что-то на подобие: Что-то не вижу плюсов у варианта со своим событием в этом случае |
|
|||||
[+1 25.10.13]
[+4 18.03.14] |
Если вы не будете переставлять чилда в другой родительский контейнер, то можно и на контейнер.
|
|
|||||
Цитата:
И я уверен что слушаю чайлда. Зачем мне какие-то проверки? (а ведь там может потребоваться не просто is, а ещё и вверх по дереву пройтись, если кликнули по ребёнку ребёнка). Зачем мне касты, которые очень осложняют рефакторинг и вообще уменьшают надёжность кода? - Компилятор то не проверяет. Зачем мне усложнение чтения кода. За-чем? Цитата:
|
|
|||||
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Если в контейнере копошатся две сотни чайлдов, расставлять две сотни листенеров на клик, две сотни листенеров на маусовер и еще две на маусаут - мне кажется, непозволительная роскошь. Поэтому в общем виде разумно вешать на контейнер три листенера, а после получения события уже смотреть, кто его прислал.
|
|
|||||
Цитата:
Тут справедливы другие соображения по оптимизации: - если их 200(да хоть 1000) и все на экране - значит это скорее всего какая-то сетка. Тогда вообще лучше спрайты не делать (или отключить реакцию на события для контейнера), а по координатам (этож регулярная сетка, getChildsAtPoint() не нужен) определять куда кликнули - если их хоть 10 000, но на экране показывается только 20 (например, скроллирующийся список) - то надо просто удалять из контейнера(и держать в памяти) тех, что вне экрана - тогда при движении мыши не будет никаких тормозов (если не удалять - туши свет - любое перемещение мыши - fps падает до нескольких кадров - это проверено). Но события можно вешать на каждый спрайт - с этим никаких проблем. |
Часовой пояс GMT +4, время: 09:58. |
|
« Предыдущая тема | Следующая тема » |
|
|