![]() |
Дети ловят события мыши, хотя не должны
Здравствуйте. Есть некий контейнер. В этом контейнере куча разных спрайтов. Есть задача: При определенных условиях В этом контейнере ПОВЕРХ всех остальных детей (на самый верхний уровень) добавить в дисплей-лист некий Shape (полупрозрачный черный прямоугольник). Цель этого шейпа - затемнить всех остальных детей в контейнере (те спрайты что под ним) и сделать их неактивными. Такой эффект можно наблюдать в некоторых играх, когда пользователь нажимает на паузу в игре.
Дело в том, что при добавлении этого черного прямоугольника все спрайты что под ним, получают события мыши. Я сделал так: Код AS3:
Код AS3:
|
Спрайтом накрывайте, а не шейпом.
|
udaaff, спасибо большое. Я то думаю, почему раньше у меня таких проблем не возникало :) Оказывается Shape ведет себя не так как Sprite.
Добавлено через 2 минуты PS: Теперь понял, почему не помогло вот это: Код AS3:
Цитата:
|
1. Для организации отображаемых объектов надо использовать контейнеры.
2. Для организации отображаемых объектов по глубине надо использовать контейнеры. Если у Вас есть несколько логических глубин, как в играх – слой с курсором, слой с подсказками, слой с всплывающими [модальными] окнами, слой HUD (интерфейса), слой мира – создайте сразу пачку специализированных "слоев"-контейнеров. Тогда и отключать мышь для всего, что ниже модального окна, можно обычным mouseChildren, а не костыльными спрайтами-покрывалами. И не надо бегать до каждого childN, стройте удобную вам иерархию, все же в ваших руках. Боитесь создать "лишний" спрайт?)) |
Wolsh, у меня так и есть. Три контейнера: 2 панельки и игровой мир. Они находятся в самом главном контейнере. Если мне нужно 2 панельки и игровой мир накрыть модальным окном, то mouseChildren здесь не поможет. Так как будет заблокировано не то что ниже этого окна, а полностью весь контейнер, в котором находится это модальное окно. Поэтому нужно лезть в родителя моего главного контейнера и там уже добавлять эти покрывала и окна. Только вот это мне не подходит! Этот "суперглобальный" родитель даже не подозревает о существовании данного контейнера. Он берет на себя другие заботы.
PS: Покрывало - это не костыль. Я придумал его из эстетических соображений. Просто, с его помощью убил двух зайцев: 1) затемняет все что под ним, тем самым показывая пользователю, что то что снизу - неактивно 2) заблокировать от мыши все что под ним Добавлено через 35 минут Wolsh, я кажется понял, что вы имели в виду. Три контейнера (2 панельки и игровой мир) не должны быть разбросаны по родителю, а находится в одном контейнере, который уже находится в родителе. И если нужно модальное окно, то просто задать контейнеру с панельками mouseChildren = false. К сожалению - это не мой случай. Есть ряд причин по которым я не могу это сделать. Нужно будет дублировать целую пачку событий и переменных. То есть из панелек и мира передавать событие в их контейнер. В этом контейнере распознавать что было нажато или сделано - и эти параметры сохранять в переменных. Дальше опять отправлять событие в главный контейнер. В нем считывать нужные значения из сабконтейнера и уже принимать решения. То есть работы по отправке и приеме событий в 2 раза больше... |
По мне, так проще спрайтом накрыть всё нижележащее. Тем более, что зачастую еще какой-нибудь эффект визуальный применяется. Затемнение, например. Двух зайцев одним выстрелом.
|
HardCoder, не уверен что понял Вас. Как-то не замечал, чтобы помещение объекта в спрайт что-то меняло в подписках на его (объекта) события.
Покрывало не костыль, когда сделано для затемнения. Но костыль, когда сделано для недоступности мыши. Потому что объекты по-прежнему к мыши чувствительны, то есть программа не делает необходимого действия явно, а полагается на побочный эффект отображения. Тот факт, что это работает, не отменяет того, что это костыль. Но это, конечно, мое скромное мнение. |
Если для недоступности мыши - костыль, то и для затемнения тогда тоже. Ведь объекты же светлые остаются на самом то деле :)
Думаю, что и способ с покрывалом и с mouseChildren = false имеют право на жизнь. Тут еще от задачи может зависеть выбор способа. |
Цитата:
|
Цитата:
|
| Часовой пояс GMT +4, время: 07:07. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.