Question

J'ai une série de MovieClips, détenus dans plusieurs MovieClips, qui distribue un événement de déplacement personnalisé que je voudrais la scène pour écouter et interagir avec. Est-il possible d'ajouter à la scène (ou tout autre objet) un écouteur d'événement pour tout événement d'un type, quel que soit l'endroit où il a été envoyé à partir?

Par exemple, pourrais-je ajouter à la scène un écouteur d'événement pour écouter toute EVENT.COMPLETE qui a été envoyé d'un enfant, ou l'un de ses enfants, ou tout c'est les enfants de leurs enfants?

Était-ce utile?

La solution

Ce que vous cherchez bouillonne d'événements. Définissez la troisième propriété d'un nouvel événement à true pour activer bouillonnement, et il fera des bulles la liste d'affichage, à partir de l'objet l'envoi de l'événement à la scène. Voir les documents officiels pour plus d'informations.

Tyler.

Modifié: Change « à partir de l'étape » à « objet l'envoi de l'événement »

Autres conseils

Eh bien, cela est quelque chose que je ne comprendrai jamais ... Pourquoi les gens utilisent toujours des événements bouillonnante pour capturer les événements sur la scène?

Si vous regardez le document, l'événement se propage de la scène à l'objet cible (phase de capture) puis des bulles si vous activez bouillonnant.

Alors ... il suffit d'utiliser la capture:

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);
        }

    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top