Самый красивый довод – про моментальное отключение всех кнопок удалением одного слушателя – зиждется на Вашем слабом знании Событийной модели. Я не знаю, кто Вас научил таким ужасным костылям – накрывать спрайтом, пробегаться по массивам. Есть простой кошерный метод stopPropagation(). В любой момент Вы можете полностью отрубить любому контейнеру захват мыши, и все его обитатели станут глухими.
Надеюсь, концепция что все обитатели должны сидеть в контейнере, а не разгуливать по стейджу, у Вас не вызывает возражений? Тогда пример:
Код AS3:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
/**
* ...
* @author wolsh
*/
public class Main extends Sprite
{
private var _sprite:Sprite;
private var _modalSprite:Sprite;
private var _container:Sprite;
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
_container = new Sprite();
addChild(_container);
//// В контейнер поместим "кнопку", одну из 128 тысяч.
_sprite = new Sprite();
_sprite.graphics.beginFill(0x000000);
_sprite.graphics.drawRect(0, 0, 150, 100);
_sprite.x = _sprite.y = 150;
_sprite.name = "DISABLED";
_container.addChild(_sprite);
//// А это якобы модальное окно, которое будет оставаться активным,
//// когда контейнер заглохнет.
_modalSprite = new Sprite();
_modalSprite.graphics.beginFill(0x008844);
_modalSprite.graphics.drawRect(0, 0, 100, 50);
addChild(_modalSprite);
_modalSprite.x = _modalSprite.y = 120;
_modalSprite.name = "MODAL";
//// Вешаем слушателей. Для наглядности я сделал один хендлер
//// и для спрайта в контейнере и для модального окна. Это не важно))
_modalSprite.addEventListener(MouseEvent.CLICK, clickHandler);
_sprite.addEventListener(MouseEvent.CLICK, clickHandler);
//// Внезапно: Отключаем захват клика для контейнера и всех его 128 тысяч кнопок.
//// _sprite с этого момента не получает события клика.
_container.addEventListener(MouseEvent.CLICK, clickStopper, true);
}
private function clickStopper(event:MouseEvent):void
{
event.stopPropagation();
}
private function clickHandler(event:MouseEvent):void
{
var s:Sprite = event.target as Sprite;
if (s != null) trace("Clicked", s.name);
}
}
}
Добавлено через 6 минут
Ну и не забываем про старый добрый
Код AS3:
_container.mouseChildren = false;
Добавлено через 14 минут
Котяра, хитрость в том что кнопка не решает, а только хранит колбэк. Если бы решала, был бы полный атас. А так сохраняется видимость контроля за происходящим – после клика только Сам Главный решает, вызывать колбэк или нет. Ну и опять же, озвученный выше довод про моментальное отключение/включение всех кнопок. Если они будут "нажиматься" сами, то автор видит лишь два костыля как остановить это.
|