Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 23.03.2012, 01:56
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 1  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
По умолчанию Дети ловят события мыши, хотя не должны

Здравствуйте. Есть некий контейнер. В этом контейнере куча разных спрайтов. Есть задача: При определенных условиях В этом контейнере ПОВЕРХ всех остальных детей (на самый верхний уровень) добавить в дисплей-лист некий Shape (полупрозрачный черный прямоугольник). Цель этого шейпа - затемнить всех остальных детей в контейнере (те спрайты что под ним) и сделать их неактивными. Такой эффект можно наблюдать в некоторых играх, когда пользователь нажимает на паузу в игре.
Дело в том, что при добавлении этого черного прямоугольника все спрайты что под ним, получают события мыши. Я сделал так:
Код AS3:
this.addChild(blackShape);
this.child1.mouseEnabled = false;
this.child2.mouseEnabled = false;
............................................
this.childN.mouseEnabled = false;
Но, к моему удивлению, все эти чайлды дальше ловят клик и движение мыши! Единственное рабочее решение:
Код AS3:
this.addChild(blackShape);
this.mouseChildren = false;
Но такой вариант не подходит. Так как блокируется полностью все в контейнере. А над черным прямоугольником будет диалоговое окно, которое должно слушать мышь. Подскажите, пожалуйста, как решить проблему.
__________________
Я мало чего умею, но зато хорошо умею учиться...

Старый 23.03.2012, 01:59
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 2  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Спрайтом накрывайте, а не шейпом.

Старый 23.03.2012, 02:12
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 3  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
udaaff, спасибо большое. Я то думаю, почему раньше у меня таких проблем не возникало Оказывается Shape ведет себя не так как Sprite.

Добавлено через 2 минуты
PS: Теперь понял, почему не помогло вот это:
Код AS3:
this.child1.mouseEnabled = false;
this.child2.mouseEnabled = false;
............................................
this.childN.mouseEnabled = false;
Полез в справку, оказывается:
Цитата:
Эта настройка не затрагивает потомков данного экземпляра в списке отображения.
А каждый чайлд имел кнопки и пр. объекты...
__________________
Я мало чего умею, но зато хорошо умею учиться...


Последний раз редактировалось HardCoder; 23.03.2012 в 02:15.
Старый 23.03.2012, 06:02
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 4  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
1. Для организации отображаемых объектов надо использовать контейнеры.
2. Для организации отображаемых объектов по глубине надо использовать контейнеры.
Если у Вас есть несколько логических глубин, как в играх – слой с курсором, слой с подсказками, слой с всплывающими [модальными] окнами, слой HUD (интерфейса), слой мира – создайте сразу пачку специализированных "слоев"-контейнеров. Тогда и отключать мышь для всего, что ниже модального окна, можно обычным mouseChildren, а не костыльными спрайтами-покрывалами. И не надо бегать до каждого childN, стройте удобную вам иерархию, все же в ваших руках. Боитесь создать "лишний" спрайт?))
__________________
Reality.getBounds(this);

Старый 23.03.2012, 10:34
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 5  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

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

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


Последний раз редактировалось HardCoder; 23.03.2012 в 10:45.
Старый 23.03.2012, 11:20
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 6  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
По мне, так проще спрайтом накрыть всё нижележащее. Тем более, что зачастую еще какой-нибудь эффект визуальный применяется. Затемнение, например. Двух зайцев одним выстрелом.

Старый 23.03.2012, 12:13
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 7  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
HardCoder, не уверен что понял Вас. Как-то не замечал, чтобы помещение объекта в спрайт что-то меняло в подписках на его (объекта) события.
Покрывало не костыль, когда сделано для затемнения. Но костыль, когда сделано для недоступности мыши. Потому что объекты по-прежнему к мыши чувствительны, то есть программа не делает необходимого действия явно, а полагается на побочный эффект отображения. Тот факт, что это работает, не отменяет того, что это костыль.
Но это, конечно, мое скромное мнение.
__________________
Reality.getBounds(this);

Старый 23.03.2012, 12:32
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 8  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Если для недоступности мыши - костыль, то и для затемнения тогда тоже. Ведь объекты же светлые остаются на самом то деле
Думаю, что и способ с покрывалом и с mouseChildren = false имеют право на жизнь. Тут еще от задачи может зависеть выбор способа.

Старый 23.03.2012, 12:35
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 9  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Цитата:
Сообщение от Wolsh Посмотреть сообщение
HardCoder, не уверен что понял Вас. Как-то не замечал, чтобы помещение объекта в спрайт что-то меняло в подписках на его (объекта) события.
Да, это я не подумал хорошо. Вы имеете в виду все панельки создать в суперконтейнере и получать события от них напрямую. Просто добавлять их НЕ В СЕБЯ, а в некий спрайт, который добавлен в себя... ?
__________________
Я мало чего умею, но зато хорошо умею учиться...

Старый 23.03.2012, 13:37
СлаваRa вне форума Посмотреть профиль Отправить личное сообщение для СлаваRa Найти все сообщения от СлаваRa
  № 10  
Ответить с цитированием
СлаваRa
 
Аватар для СлаваRa

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
Цитата:
а в некий спрайт, который добавлен в себя... ?
это как?
__________________
местонахождение

Создать новую тему Ответ Часовой пояс GMT +4, время: 21:52.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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