Actionscript 3 AS3将自定义事件从一个类分派到另一个类

Actionscript 3 AS3将自定义事件从一个类分派到另一个类,actionscript-3,events,dispatch,Actionscript 3,Events,Dispatch,我想将自定义事件从Country()发送到MenuButton() CountryEvent package { import flash.events.Event; public class CountryEvent extends Event { public static const COUNTRY_HOVERED:String = "onCountryOver"; private var _countryName:String = ""; public

我想将自定义事件从Country()发送到MenuButton()

CountryEvent

package  {
import flash.events.Event;

public class CountryEvent extends Event {

    public static const COUNTRY_HOVERED:String = "onCountryOver";

    private var _countryName:String = "";

    public function CountryEvent(type:String, countryName:String, bubbles:Boolean=true, cancelable:Boolean=false) {
        super(type, bubbles, cancelable);
        _countryName = countryName;
    }

    public function get countryName():String {
        return _countryName;
    }

    public override function clone():Event
    {
        return new CountryEvent(type,countryName,bubbles,cancelable);
    }
}
} 国家级

package 
{

    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    import flash.events.Event;

    public class Country extends MovieClip
    {
        private var countryEvent:CountryEvent;


        public function Country()
        {
            this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
            this.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
        }

        private function onMouseOver(e:MouseEvent):void
        {

                countryEvent = new CountryEvent("onCountryOver",this.name);

                dispatchEvent(countryEvent);

            }
        }

        private function onMouseOut(e:MouseEvent):void
        {

        }
    }

}
package  {

    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    import CountryEvent;


    public class MenuButton extends MovieClip {

        public var countryName:String = "";

        public function MenuButton() {

            this.buttonMode = true;
            this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
            this.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
            this.addEventListener(CountryEvent.COUNTRY_HOVERED,onCountryOver);
        }

        private function onCountryOver(e:CountryEvent):void {
            if(e.countryName == countryName) {
                this.gotoAndPlay(2);
            }
        }

        private function onMouseOver(e:MouseEvent):void {
            this.gotoAndPlay(2);

        }

        private function onMouseOut(e:MouseEvent):void {
            this.gotoAndPlay(11);
        }
    }

}
package{

import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.Event;

public class Country extends MovieClip
{
    private var countryEvent:CountryEvent;
    private var _stageRef:Stage;


    public function Country(pStageRef:Stage)
    {
        _stageRef = pStageRef;

        this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
        this.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
    }

    private function onMouseOver(e:MouseEvent):void
    {

            countryEvent = new CountryEvent("onCountryOver",this.name);

            _stageRef.dispatchEvent(countryEvent);

        }
    }

    private function onMouseOut(e:MouseEvent):void
    {

    }
}
package  {

import flash.display.MovieClip;
import flash.events.MouseEvent;
import CountryEvent;


public class MenuButton extends MovieClip {

    public var countryName:String = "";
    private var _stageRef:Stage;

    public function MenuButton(pStageRef:Stage) {
        _stageRef = pStageRef;
        this.buttonMode = true;
        this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
        this.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
        _stageRef.addEventListener(CountryEvent.COUNTRY_HOVERED,onCountryOver);
    }

    private function onCountryOver(e:CountryEvent):void {
        if(e.countryName == countryName) {
            this.gotoAndPlay(2);
        }
    }

    private function onMouseOver(e:MouseEvent):void {
        this.gotoAndPlay(2);

    }

    private function onMouseOut(e:MouseEvent):void {
        this.gotoAndPlay(11);
    }
}
菜单按钮类

package 
{

    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    import flash.events.Event;

    public class Country extends MovieClip
    {
        private var countryEvent:CountryEvent;


        public function Country()
        {
            this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
            this.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
        }

        private function onMouseOver(e:MouseEvent):void
        {

                countryEvent = new CountryEvent("onCountryOver",this.name);

                dispatchEvent(countryEvent);

            }
        }

        private function onMouseOut(e:MouseEvent):void
        {

        }
    }

}
package  {

    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    import CountryEvent;


    public class MenuButton extends MovieClip {

        public var countryName:String = "";

        public function MenuButton() {

            this.buttonMode = true;
            this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
            this.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
            this.addEventListener(CountryEvent.COUNTRY_HOVERED,onCountryOver);
        }

        private function onCountryOver(e:CountryEvent):void {
            if(e.countryName == countryName) {
                this.gotoAndPlay(2);
            }
        }

        private function onMouseOver(e:MouseEvent):void {
            this.gotoAndPlay(2);

        }

        private function onMouseOut(e:MouseEvent):void {
            this.gotoAndPlay(11);
        }
    }

}
package{

import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.Event;

public class Country extends MovieClip
{
    private var countryEvent:CountryEvent;
    private var _stageRef:Stage;


    public function Country(pStageRef:Stage)
    {
        _stageRef = pStageRef;

        this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
        this.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
    }

    private function onMouseOver(e:MouseEvent):void
    {

            countryEvent = new CountryEvent("onCountryOver",this.name);

            _stageRef.dispatchEvent(countryEvent);

        }
    }

    private function onMouseOut(e:MouseEvent):void
    {

    }
}
package  {

import flash.display.MovieClip;
import flash.events.MouseEvent;
import CountryEvent;


public class MenuButton extends MovieClip {

    public var countryName:String = "";
    private var _stageRef:Stage;

    public function MenuButton(pStageRef:Stage) {
        _stageRef = pStageRef;
        this.buttonMode = true;
        this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
        this.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
        _stageRef.addEventListener(CountryEvent.COUNTRY_HOVERED,onCountryOver);
    }

    private function onCountryOver(e:CountryEvent):void {
        if(e.countryName == countryName) {
            this.gotoAndPlay(2);
        }
    }

    private function onMouseOver(e:MouseEvent):void {
        this.gotoAndPlay(2);

    }

    private function onMouseOut(e:MouseEvent):void {
        this.gotoAndPlay(11);
    }
}
当一个国家被悬停时,会发送一个自定义事件,我希望菜单按钮监听该事件,如果传递的参数与其名称相同,则会突出显示该事件。Country类是我的countries movieclips的基类,我在舞台上的嘴唇,MenuButton是menu按钮的基类

这件事似乎永远也办不完


提前感谢

您必须进行两项修改:

首先,将event
bubbles
属性设置为
true
,这样当
Country
剪辑发送事件时,它将上升到顶级

然后,您的
菜单按钮
应该听
阶段
,而不是自己。因此,当一个
国家
发送一个事件时,它会进入
阶段
,并且可以被按钮捕获。如果你想听舞台,你必须对你的代码稍加修改:

public function MenuButton() {

    this.buttonMode = true;
    this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
    this.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
    this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}

private function onAddedToStage(e:Event):void 
{
    removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
    stage.addEventListener(CountryEvent.COUNTRY_HOVERED,onCountryOver); 
}

解决此问题的最佳且简单的方法是将stage引用作为类级参数传递,并将事件添加到stage引用,将dispatch事件添加到stage引用

国家级

package 
{

    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    import flash.events.Event;

    public class Country extends MovieClip
    {
        private var countryEvent:CountryEvent;


        public function Country()
        {
            this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
            this.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
        }

        private function onMouseOver(e:MouseEvent):void
        {

                countryEvent = new CountryEvent("onCountryOver",this.name);

                dispatchEvent(countryEvent);

            }
        }

        private function onMouseOut(e:MouseEvent):void
        {

        }
    }

}
package  {

    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    import CountryEvent;


    public class MenuButton extends MovieClip {

        public var countryName:String = "";

        public function MenuButton() {

            this.buttonMode = true;
            this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
            this.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
            this.addEventListener(CountryEvent.COUNTRY_HOVERED,onCountryOver);
        }

        private function onCountryOver(e:CountryEvent):void {
            if(e.countryName == countryName) {
                this.gotoAndPlay(2);
            }
        }

        private function onMouseOver(e:MouseEvent):void {
            this.gotoAndPlay(2);

        }

        private function onMouseOut(e:MouseEvent):void {
            this.gotoAndPlay(11);
        }
    }

}
package{

import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.Event;

public class Country extends MovieClip
{
    private var countryEvent:CountryEvent;
    private var _stageRef:Stage;


    public function Country(pStageRef:Stage)
    {
        _stageRef = pStageRef;

        this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
        this.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
    }

    private function onMouseOver(e:MouseEvent):void
    {

            countryEvent = new CountryEvent("onCountryOver",this.name);

            _stageRef.dispatchEvent(countryEvent);

        }
    }

    private function onMouseOut(e:MouseEvent):void
    {

    }
}
package  {

import flash.display.MovieClip;
import flash.events.MouseEvent;
import CountryEvent;


public class MenuButton extends MovieClip {

    public var countryName:String = "";
    private var _stageRef:Stage;

    public function MenuButton(pStageRef:Stage) {
        _stageRef = pStageRef;
        this.buttonMode = true;
        this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
        this.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
        _stageRef.addEventListener(CountryEvent.COUNTRY_HOVERED,onCountryOver);
    }

    private function onCountryOver(e:CountryEvent):void {
        if(e.countryName == countryName) {
            this.gotoAndPlay(2);
        }
    }

    private function onMouseOver(e:MouseEvent):void {
        this.gotoAndPlay(2);

    }

    private function onMouseOut(e:MouseEvent):void {
        this.gotoAndPlay(11);
    }
}
菜单按钮类

package 
{

    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    import flash.events.Event;

    public class Country extends MovieClip
    {
        private var countryEvent:CountryEvent;


        public function Country()
        {
            this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
            this.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
        }

        private function onMouseOver(e:MouseEvent):void
        {

                countryEvent = new CountryEvent("onCountryOver",this.name);

                dispatchEvent(countryEvent);

            }
        }

        private function onMouseOut(e:MouseEvent):void
        {

        }
    }

}
package  {

    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    import CountryEvent;


    public class MenuButton extends MovieClip {

        public var countryName:String = "";

        public function MenuButton() {

            this.buttonMode = true;
            this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
            this.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
            this.addEventListener(CountryEvent.COUNTRY_HOVERED,onCountryOver);
        }

        private function onCountryOver(e:CountryEvent):void {
            if(e.countryName == countryName) {
                this.gotoAndPlay(2);
            }
        }

        private function onMouseOver(e:MouseEvent):void {
            this.gotoAndPlay(2);

        }

        private function onMouseOut(e:MouseEvent):void {
            this.gotoAndPlay(11);
        }
    }

}
package{

import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.Event;

public class Country extends MovieClip
{
    private var countryEvent:CountryEvent;
    private var _stageRef:Stage;


    public function Country(pStageRef:Stage)
    {
        _stageRef = pStageRef;

        this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
        this.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
    }

    private function onMouseOver(e:MouseEvent):void
    {

            countryEvent = new CountryEvent("onCountryOver",this.name);

            _stageRef.dispatchEvent(countryEvent);

        }
    }

    private function onMouseOut(e:MouseEvent):void
    {

    }
}
package  {

import flash.display.MovieClip;
import flash.events.MouseEvent;
import CountryEvent;


public class MenuButton extends MovieClip {

    public var countryName:String = "";
    private var _stageRef:Stage;

    public function MenuButton(pStageRef:Stage) {
        _stageRef = pStageRef;
        this.buttonMode = true;
        this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver);
        this.addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
        _stageRef.addEventListener(CountryEvent.COUNTRY_HOVERED,onCountryOver);
    }

    private function onCountryOver(e:CountryEvent):void {
        if(e.countryName == countryName) {
            this.gotoAndPlay(2);
        }
    }

    private function onMouseOver(e:MouseEvent):void {
        this.gotoAndPlay(2);

    }

    private function onMouseOut(e:MouseEvent):void {
        this.gotoAndPlay(11);
    }
}

您好,您的不同元素(国家、菜单按钮)是如何添加到舞台上的?他们有相同的父母吗?您可能还想从示例中删除tweens,因为它们独立于您的问题,并降低了问题的可读性。它们不是通过代码添加的,而是世界电影剪辑的一部分。世界,德国,世界,西班牙等等。我会清除代码中不相关的东西。谢谢你!有一个问题,为什么我必须等待添加到舞台的事件?因为如果你不等待,
stage
还不存在。我明白了。。。所以我想对stage进行初始化。Thanx这有助于澄清我头脑中的一些事情,只是为了做一个小小的更正。它的阶段没有初始化。当菜单按钮被添加到舞台上时。在将任何内容添加到其显示列表之前,阶段应该早就初始化了。通过等待添加的_到_阶段触发,我们实际上是在等待许多进程完成。将_添加到_STAGE只是为了确保STAGE是可访问的。