Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как заставить срабатывать событие MOUSE_OVER у всех MC под курсором мышки? (http://www.flasher.ru/forum/showthread.php?t=135475)

mikhailk 24.01.2010 12:46

Как заставить срабатывать событие MOUSE_OVER у всех MC под курсором мышки?
 
Есть необходимость сделать следующий пирог:

- внизу лежит большой и плоский мувиклип, на котором набросаны эффекты, связанные с отслеживанием событий MOUSE_OVER/MOUSE_OUT курсора мыши, например, зажигаются/гаснут некоторые сектора сцены.
- вверху над этим клипом висят динамически порожденные объекты, у которых свои листенеры событий MOUSE_OVER/MOUSE_OUT

Никаких родственных отношений ни у кого нет (и мне нужно обойтись без них по разным причинам).

Сейчас когда мышка двигается по сцене, отрабатывают события клипа на бэкграунде, но при заходе на объект, тот перехватывает ее события MOUSE_OVER/MOUSE_OUT и они вниз уже не проходят.

Как победить?

alatar 24.01.2010 15:37

Сделать свое всплывающее событие (bubbles = true) и отсылать его при MOUSE_OVER

mikhailk 24.01.2010 16:18

на вскидку не получилось.

сделал так:

объектам, которые висят спереди, в обработку события MOUSE_OVER добавил генерацию события "mouseOverObject", а всем объектам, которые сидят внутри мувика на бэкграунде повесил листенер на событие "mouseOverObject". Но событие туда не прошло.

Может это из-за того, что мувик на бэкграунде подкачивается и запускается во время исполнения приложения?

etc 24.01.2010 17:43

Цитата:

Сообщение от mikhailk (Сообщение 881610)
объектам, которые висят спереди, в обработку события MOUSE_OVER добавил генерацию события "mouseOverObject", а всем объектам, которые сидят внутри мувика на бэкграунде повесил листенер на событие "mouseOverObject". Но событие туда не прошло.

Вы событие всплывающим отправляете?

mikhailk 24.01.2010 19:09

Код AS3:

dispatchEvent(new Event("mouseOverObject",true));


etc 24.01.2010 19:17

А, ну, нижележащие объекты событий мыши не получат. Вам нужно написать контроллер мыши, который, используя getObjectsUnderPoint будет выделять нужные объекты.

mikhailk 24.01.2010 19:53

Через getObjectsUnderPoint - довольно занятно.
а есть у нас способ проверить, существует ли у объекта такой-то метод?
Я бы применил этот метод ко всем объектам под курсором мыша, у которых метод существует и все.

можно, конечно, через try, но не люблю плодить ошибки запланированно.

etc 24.01.2010 19:56

Повесить на них интерфейс какой-нибудь. Нужно учесть, что getObjectsUnderPoint будет выдавать вам ссылки на шейпы внутри ваших объектов, а не на сами объекты. Поэтому нужно проходить по parent-ам и выяснять, на что наведена мышь.

mikhailk 24.01.2010 20:48

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

Или не так.
У нас есть контейнер, его имя мы знаем.
Нулевым чилдом кладем алармер, когда нужно разослать события объектам внутри контейнера, дергаем этого алармера, он диспатчит событие... Остальные объекты внутри контейнера это событие услышат?

alatar 25.01.2010 02:24

сделайте общий контейнер для клипа с эффектами и для объектов, в нем ловите MOUSE_OVER объектов и дергайте клип с эффектами. В принципе клип с эффектами может и не быть ребенком контейнера, достаточно иметь на него ссылку.

prizrak.pro 25.01.2010 13:24

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

mikhailk 26.01.2010 00:19

На самом деле я хотел найти способ не лазить в бэкграунд.

Формирую страницу по структуре, прописанной в xml. Мувики грузятся последовательно с привязкой к координатам. В основном это зацикленные по кругу изображения или программные анимации типа огня или дыма. В самый низ кладется мувик-бэкграунд, внутри которого есть свои листенеры на мышь и который сам по себе на нее реагирует. Более того, в общем виде хотелось бы даже не знать, что там за бэкграунд и как он на эту мышь реагирует. В ряде случаев там вообще может быть статичный жипег.

Поэтому и была мысль - нельзя ли как-нибудь прокинуть события мыши вниз, чтобы объекты, висящие вверху, их не перехватывали.

Но, судя по всему, так не получается.

alatar 26.01.2010 05:30

вниз это значит в родительский контейнер или дальше по иерархии родителей - так можно. Объясните что вы имеете ввиду под низом?

mikhailk 27.01.2010 00:01

внизу с точки зрения глубины))

Код AS3:

var layerBackground = new Sprite();
addChild(layerBackground );
 
var layerForeground = new Sprite();
addChild(layerForeground );

Слой layerBackground будет лежать глубже layerForeground, все объекты, помещенные в него, будут лежать глубже layerForeground. Все объекты, помещенные в layerForeground будут перекрывать объекты слоя layerBackground.

alatar 27.01.2010 03:21

Цитата:

нельзя ли как-нибудь прокинуть события мыши вниз, чтобы объекты, висящие вверху, их не перехватывали.
Можно если отключить мышь для layerForeground. Если в layerForeground нет фона, то в прорехах между его детьми события тоже будут проходить.


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

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