прослушиватель flash-событий для глобальных событий - PullRequest
1 голос
/ 30 мая 2009

У меня есть серия MovieClips, состоящая из нескольких MovieClips, которые отправляют событие пользовательского перемещения, которое я хотел бы, чтобы сцена слушала и взаимодействовала. Есть ли способ добавить на сцену (или любой объект) прослушиватель событий для любого события одного типа, независимо от того, откуда оно было отправлено?

Например, могу ли я добавить на сцену прослушиватель событий для прослушивания любого EVENT.COMPLETE, который был отправлен от ребенка, или любого из его детей, или любого из его детей?

Ответы [ 2 ]

6 голосов
/ 30 мая 2009

То, что вы ищете, это пузыри событий. Установите для третьего свойства нового события значение true, чтобы включить пузыри, и оно будет всплывать в списке отображения, начиная с объекта, отправляющего событие на сцену. См. Официальные документы для получения дополнительной информации.

Тайлер.

Отредактировано: изменить «начиная со сцены» на «объект, отправляющий событие»

2 голосов
/ 30 мая 2009

Ну, это то, что я никогда не пойму ... Почему люди всегда используют всплывающие события, чтобы запечатлеть события на сцене?

Если вы посмотрите на документ, событие распространяется от сцены к целевому объекту (фаза захвата), а затем пузырьки, если вы включаете пузыри.

Так что ... просто используйте захват:

Main.as

package {
    import flash.display.Sprite;

    public class Main extends Sprite
    {
        public function Main()
        {
            var c:Circle = new Circle();
            var r:Rect = new Rect();
            c.addChild(r);
            addChild(c);
            addEventListener(CustomEvent.CUSTOM, customEventHandler, true);//don't forget third parameter to use capture
        }

        private function customEventHandler(e:CustomEvent):void
        {
            trace(e.eventPhase == EventPhase.CAPTURING_PHASE);//shows true
        }
    }
}

Circle.as

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;

    public class Circle extends Sprite
    {
        public function Circle()
        {
            super();
            init();
        }

        private function init():void
        {
            with(graphics)
            {
                beginFill(0xFF0000);
                drawCircle(25, 25, 50);
                endFill()
            }

        }
    }
}

Rect.as

package
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;

    public class Rect extends Sprite
    {
        public function Rect()
        {
            super();
            init();
        }

        private function init():void
        {
            with(graphics)
            {
                beginFill(0x000000);
                drawRect(0, 0, 25, 25);
                endFill();
            }

            addEventListener(MouseEvent.CLICK, mouseClickHandler);
        }

        private function mouseClickHandler(e:MouseEvent):void
        {
            dispatchEvent(new CustomEvent(CustomEvent.CUSTOM));
        }


    }
}

CustomEvent.as

package
{
    import flash.events.Event;

    public class CustomEvent extends Event
    {
        public static const CUSTOM:String = "custom";

        public function CustomEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
        {
            super(type, bubbles, cancelable);
        }

    }
}
...