|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Дети ловят события мыши, хотя не должны
Здравствуйте. Есть некий контейнер. В этом контейнере куча разных спрайтов. Есть задача: При определенных условиях В этом контейнере ПОВЕРХ всех остальных детей (на самый верхний уровень) добавить в дисплей-лист некий Shape (полупрозрачный черный прямоугольник). Цель этого шейпа - затемнить всех остальных детей в контейнере (те спрайты что под ним) и сделать их неактивными. Такой эффект можно наблюдать в некоторых играх, когда пользователь нажимает на паузу в игре.
Дело в том, что при добавлении этого черного прямоугольника все спрайты что под ним, получают события мыши. Я сделал так: this.addChild(blackShape); this.child1.mouseEnabled = false; this.child2.mouseEnabled = false; ............................................ this.childN.mouseEnabled = false;
__________________
Я мало чего умею, но зато хорошо умею учиться... |
|
|||||
...
модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
|
Спрайтом накрывайте, а не шейпом.
|
|
|||||
udaaff, спасибо большое. Я то думаю, почему раньше у меня таких проблем не возникало Оказывается Shape ведет себя не так как Sprite.
Добавлено через 2 минуты PS: Теперь понял, почему не помогло вот это: this.child1.mouseEnabled = false; this.child2.mouseEnabled = false; ............................................ this.childN.mouseEnabled = false; Цитата:
__________________
Я мало чего умею, но зато хорошо умею учиться... Последний раз редактировалось HardCoder; 23.03.2012 в 02:15. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
1. Для организации отображаемых объектов надо использовать контейнеры.
2. Для организации отображаемых объектов по глубине надо использовать контейнеры. Если у Вас есть несколько логических глубин, как в играх – слой с курсором, слой с подсказками, слой с всплывающими [модальными] окнами, слой HUD (интерфейса), слой мира – создайте сразу пачку специализированных "слоев"-контейнеров. Тогда и отключать мышь для всего, что ниже модального окна, можно обычным mouseChildren, а не костыльными спрайтами-покрывалами. И не надо бегать до каждого childN, стройте удобную вам иерархию, все же в ваших руках. Боитесь создать "лишний" спрайт?))
__________________
Reality.getBounds(this); |
|
|||||
Wolsh, у меня так и есть. Три контейнера: 2 панельки и игровой мир. Они находятся в самом главном контейнере. Если мне нужно 2 панельки и игровой мир накрыть модальным окном, то mouseChildren здесь не поможет. Так как будет заблокировано не то что ниже этого окна, а полностью весь контейнер, в котором находится это модальное окно. Поэтому нужно лезть в родителя моего главного контейнера и там уже добавлять эти покрывала и окна. Только вот это мне не подходит! Этот "суперглобальный" родитель даже не подозревает о существовании данного контейнера. Он берет на себя другие заботы.
PS: Покрывало - это не костыль. Я придумал его из эстетических соображений. Просто, с его помощью убил двух зайцев: 1) затемняет все что под ним, тем самым показывая пользователю, что то что снизу - неактивно 2) заблокировать от мыши все что под ним Добавлено через 35 минут Wolsh, я кажется понял, что вы имели в виду. Три контейнера (2 панельки и игровой мир) не должны быть разбросаны по родителю, а находится в одном контейнере, который уже находится в родителе. И если нужно модальное окно, то просто задать контейнеру с панельками mouseChildren = false. К сожалению - это не мой случай. Есть ряд причин по которым я не могу это сделать. Нужно будет дублировать целую пачку событий и переменных. То есть из панелек и мира передавать событие в их контейнер. В этом контейнере распознавать что было нажато или сделано - и эти параметры сохранять в переменных. Дальше опять отправлять событие в главный контейнер. В нем считывать нужные значения из сабконтейнера и уже принимать решения. То есть работы по отправке и приеме событий в 2 раза больше...
__________________
Я мало чего умею, но зато хорошо умею учиться... Последний раз редактировалось HardCoder; 23.03.2012 в 10:45. |
|
|||||
...
модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
|
По мне, так проще спрайтом накрыть всё нижележащее. Тем более, что зачастую еще какой-нибудь эффект визуальный применяется. Затемнение, например. Двух зайцев одним выстрелом.
|
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
HardCoder, не уверен что понял Вас. Как-то не замечал, чтобы помещение объекта в спрайт что-то меняло в подписках на его (объекта) события.
Покрывало не костыль, когда сделано для затемнения. Но костыль, когда сделано для недоступности мыши. Потому что объекты по-прежнему к мыши чувствительны, то есть программа не делает необходимого действия явно, а полагается на побочный эффект отображения. Тот факт, что это работает, не отменяет того, что это костыль. Но это, конечно, мое скромное мнение.
__________________
Reality.getBounds(this); |
|
|||||
...
модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
|
Если для недоступности мыши - костыль, то и для затемнения тогда тоже. Ведь объекты же светлые остаются на самом то деле
Думаю, что и способ с покрывалом и с mouseChildren = false имеют право на жизнь. Тут еще от задачи может зависеть выбор способа. |
|
|||||
Да, это я не подумал хорошо. Вы имеете в виду все панельки создать в суперконтейнере и получать события от них напрямую. Просто добавлять их НЕ В СЕБЯ, а в некий спрайт, который добавлен в себя... ?
__________________
Я мало чего умею, но зато хорошо умею учиться... |
|
|||||
Цитата:
__________________
местонахождение |
Часовой пояс GMT +4, время: 21:52. |
|
« Предыдущая тема | Следующая тема » |
|
|