Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Диспач клика мышки (http://www.flasher.ru/forum/showthread.php?t=145784)

Vier 19.10.2010 20:11

Диспач клика мышки
 
Проблема такая:
Есть сцена с пустой группой внутри. По клику на сцене происходит событие, которое загружает в группу набор строк (Label), каждому лейблу задается слушатель клика мышки.
Как мне сделать так, чтобы программно повторить первый клик (по которому пошла загрузка) и если он попал в один из лейблов инициировать слушателя этого объекта?

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

Второй вариант: вытащить координаты первого клика, пробежать по всем родившимся лейблам насчет hitTestPoint и вызвать событие непосредственно на нужном элементе.
Но мне кажется первый вариант интересней, просто я неправильно им пользуюсь.
К тому же, при программном создании label, я не могу понять, в какой момент он получает реальные размеры width/height. Сразу после добавления в группу ширина по-прежнему 0, но в какой-то волшебный момент получает реальные значения. Из-за этого не получается сделать hitTestPoint.

Obi 20.10.2010 11:05

Вам это зачем? Мне кажется, что у вас просто не верно выбрано решение проблемы. Если у вас флекс, то прочитайте раздел справки "understanding flex components", или как-то так, не помню точное название, там рассказывают про то, когда компоненты добавляются на экран, когда им выставляются размеры, когда применяются изменения и прочее.

UPD: вот: http://www.developmentarc.com/site/w...cycle_v1.0.pdf

AlexDesinger 20.10.2010 11:36

по-моему можно так -
при клике на лейбл, вызываете метод, который вызывался при клике на стейдж.
реальная высота и ширина появляются после события INIT, соответственно на него надо просто подписаться.

Vier 20.10.2010 12:25

Цитата:

Сообщение от AlexDesinger (Сообщение 943964)
при клике на лейбл, вызываете метод, который вызывался при клике на стейдж.

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

С инитом попробую.

Я зря наверно так подробно описал. Вот краткий вариант:
есть сцена, в ней n компонент (не важно чего, пусть спрайтов). Все спрайты слушают MouseEvent.CLICK. При человеческом клике спрайты откликаются. Нужно программно повторить это событие, чтобы спрайт откликнулся вновь. Спрайт запомнить нельзя.

В принципе, мне не сложно пробежать по всем элементам и сверить попали ли координаты, но элементов может быть несколько тысяч, при реальном клике флэш совершает такой же обход или у него какие-то более оптимизированные алгоритмы?

Obi 20.10.2010 12:29

getObjectsUnderPoint

Vier 20.10.2010 12:31

Цитата:

Сообщение от Obi (Сообщение 943956)
Вам это зачем? Мне кажется, что у вас просто не верно выбрано решение проблемы.

Сейчас уже не важно, просто интересно, можно ли программно повторить событие. dispatch вызывается на конкретном элементе, а реальное событие затрагивает все элементы сцены.

Obi 20.10.2010 12:53

нельзя

alatar 20.10.2010 13:25

Нельзя, ибо это будет нарушение политики безопасности. Некоторые операции выполняются только по реальному клику.

AlexDesinger 20.10.2010 13:28

Цитата:

Нужно программно повторить это событие, чтобы спрайт откликнулся вновь.
Не делайте так - это неправильная логика.
Либо создайте метод, который будет по e.target определять на что нажали и соответственно предпринимать действие, либо разбейте события, например -
стейдж реагирует на MOUSE_UP, а спрайты на CLICK, и создайте методы, которые в случае необходимости вызывайте из кода.

Vier 20.10.2010 16:18

Cпасибо, все понятно.

Цитата:

Сообщение от AlexDesinger (Сообщение 944006)
Не делайте так - это неправильная логика.
Либо создайте метод, который будет по e.target определять на что нажали и соответственно предпринимать действие, либо разбейте события, например -
стейдж реагирует на MOUSE_UP, а спрайты на CLICK, и создайте методы, которые в случае необходимости вызывайте из кода.

На самом деле у меня стейдж вообще ни на что не реагирует. Только спрайты. Проблема в том что спрайт который в target, к тому моменту когда я захочу повторить клик может вообще исчезнуть или поменять координаты итд. getObjectsUnderPoint вроде решает все проблемы.


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

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