Форум 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=177033)

HardCoder 23.03.2012 01:56

Дети ловят события мыши, хотя не должны
 
Здравствуйте. Есть некий контейнер. В этом контейнере куча разных спрайтов. Есть задача: При определенных условиях В этом контейнере ПОВЕРХ всех остальных детей (на самый верхний уровень) добавить в дисплей-лист некий Shape (полупрозрачный черный прямоугольник). Цель этого шейпа - затемнить всех остальных детей в контейнере (те спрайты что под ним) и сделать их неактивными. Такой эффект можно наблюдать в некоторых играх, когда пользователь нажимает на паузу в игре.
Дело в том, что при добавлении этого черного прямоугольника все спрайты что под ним, получают события мыши. Я сделал так:
Код AS3:

this.addChild(blackShape);
this.child1.mouseEnabled = false;
this.child2.mouseEnabled = false;
............................................
this.childN.mouseEnabled = false;

Но, к моему удивлению, все эти чайлды дальше ловят клик и движение мыши! Единственное рабочее решение:
Код AS3:

this.addChild(blackShape);
this.mouseChildren = false;

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

udaaff 23.03.2012 01:59

Спрайтом накрывайте, а не шейпом.

HardCoder 23.03.2012 02:12

udaaff, спасибо большое. Я то думаю, почему раньше у меня таких проблем не возникало :) Оказывается Shape ведет себя не так как Sprite.

Добавлено через 2 минуты
PS: Теперь понял, почему не помогло вот это:
Код AS3:

this.child1.mouseEnabled = false;
this.child2.mouseEnabled = false;
............................................
this.childN.mouseEnabled = false;

Полез в справку, оказывается:
Цитата:

Эта настройка не затрагивает потомков данного экземпляра в списке отображения.
А каждый чайлд имел кнопки и пр. объекты...

Wolsh 23.03.2012 06:02

1. Для организации отображаемых объектов надо использовать контейнеры.
2. Для организации отображаемых объектов по глубине надо использовать контейнеры.
Если у Вас есть несколько логических глубин, как в играх – слой с курсором, слой с подсказками, слой с всплывающими [модальными] окнами, слой HUD (интерфейса), слой мира – создайте сразу пачку специализированных "слоев"-контейнеров. Тогда и отключать мышь для всего, что ниже модального окна, можно обычным mouseChildren, а не костыльными спрайтами-покрывалами. И не надо бегать до каждого childN, стройте удобную вам иерархию, все же в ваших руках. Боитесь создать "лишний" спрайт?))

HardCoder 23.03.2012 10:34

Wolsh, у меня так и есть. Три контейнера: 2 панельки и игровой мир. Они находятся в самом главном контейнере. Если мне нужно 2 панельки и игровой мир накрыть модальным окном, то mouseChildren здесь не поможет. Так как будет заблокировано не то что ниже этого окна, а полностью весь контейнер, в котором находится это модальное окно. Поэтому нужно лезть в родителя моего главного контейнера и там уже добавлять эти покрывала и окна. Только вот это мне не подходит! Этот "суперглобальный" родитель даже не подозревает о существовании данного контейнера. Он берет на себя другие заботы.
PS: Покрывало - это не костыль. Я придумал его из эстетических соображений. Просто, с его помощью убил двух зайцев:
1) затемняет все что под ним, тем самым показывая пользователю, что то что снизу - неактивно
2) заблокировать от мыши все что под ним

Добавлено через 35 минут
Wolsh, я кажется понял, что вы имели в виду. Три контейнера (2 панельки и игровой мир) не должны быть разбросаны по родителю, а находится в одном контейнере, который уже находится в родителе. И если нужно модальное окно, то просто задать контейнеру с панельками mouseChildren = false.
К сожалению - это не мой случай. Есть ряд причин по которым я не могу это сделать. Нужно будет дублировать целую пачку событий и переменных. То есть из панелек и мира передавать событие в их контейнер. В этом контейнере распознавать что было нажато или сделано - и эти параметры сохранять в переменных. Дальше опять отправлять событие в главный контейнер. В нем считывать нужные значения из сабконтейнера и уже принимать решения. То есть работы по отправке и приеме событий в 2 раза больше...

udaaff 23.03.2012 11:20

По мне, так проще спрайтом накрыть всё нижележащее. Тем более, что зачастую еще какой-нибудь эффект визуальный применяется. Затемнение, например. Двух зайцев одним выстрелом.

Wolsh 23.03.2012 12:13

HardCoder, не уверен что понял Вас. Как-то не замечал, чтобы помещение объекта в спрайт что-то меняло в подписках на его (объекта) события.
Покрывало не костыль, когда сделано для затемнения. Но костыль, когда сделано для недоступности мыши. Потому что объекты по-прежнему к мыши чувствительны, то есть программа не делает необходимого действия явно, а полагается на побочный эффект отображения. Тот факт, что это работает, не отменяет того, что это костыль.
Но это, конечно, мое скромное мнение.

udaaff 23.03.2012 12:32

Если для недоступности мыши - костыль, то и для затемнения тогда тоже. Ведь объекты же светлые остаются на самом то деле :)
Думаю, что и способ с покрывалом и с mouseChildren = false имеют право на жизнь. Тут еще от задачи может зависеть выбор способа.

HardCoder 23.03.2012 12:35

Цитата:

Сообщение от Wolsh (Сообщение 1070678)
HardCoder, не уверен что понял Вас. Как-то не замечал, чтобы помещение объекта в спрайт что-то меняло в подписках на его (объекта) события.

Да, это я не подумал хорошо. Вы имеете в виду все панельки создать в суперконтейнере и получать события от них напрямую. Просто добавлять их НЕ В СЕБЯ, а в некий спрайт, который добавлен в себя... ?

СлаваRa 23.03.2012 13:37

Цитата:

а в некий спрайт, который добавлен в себя... ?
это как?


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

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