Actionscript 3 动作脚本3中的事件流

Actionscript 3 动作脚本3中的事件流,actionscript-3,flash,events,Actionscript 3,Flash,Events,我试图从舞台上的某个组件分派一个自定义事件,我注册了另一个组件来监听它,但另一个组件没有得到该事件 这是我的密码;我错过了什么 public class Main extends MovieClip //main document class { var compSource:Game; var compMenu:Menu; public function Main() { compSource

我试图从舞台上的某个组件分派一个自定义事件,我注册了另一个组件来监听它,但另一个组件没有得到该事件

这是我的密码;我错过了什么

public class Main extends MovieClip //main document class
    {
        var compSource:Game;
        var compMenu:Menu;

        public function Main() 
        {
            compSource = new Game;
            compMenu = new Menu();
            var mc:MovieClip = new MovieClip();
            addChild(mc);
            mc.addChild(compSource); // the source of the event - event dispatch when clicked btn
            mc.addChild(compMenu);  //in init of that Movie clip it add listener to the compSource events
        }

    }


public class Game extends MovieClip 
    {
        public function Game() 
        {
            btn.addEventListener(MouseEvent.CLICK, onFinishGame);
        }

        private function onFinishGame(e:MouseEvent):void 
        {

            var score:Number = Math.random() * 100 + 1;
            dispatchEvent(new ScoreChanged(score));
        }


    }

public class Menu extends MovieClip
    {
        //TextField score
        public function Menu() 
        {
            addEventListener(Event.ADDED_TO_STAGE, init);
        }   

        private function init(e:Event):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
//on init add listener to event ScoreChanged
            addEventListener(ScoreChanged.SCORE_GAIN, updateScore);
        }

        public function updateScore(e:ScoreChanged):void 
        {
//it never gets here!
            tScore.text = String(e._score);
        }   

    }



public class ScoreChanged extends Event
    {
        public static const SCORE_GAIN:String = "SCORE_GAIN";
        public var _score:Number;

        public function ScoreChanged( score:Number ) 
        {
            trace("new score");
            super( SCORE_GAIN, true);
            _score = score;
        }
}
我不想写主要的东西

compSource.addEventListener(ScoreChanged.SCORE_GAIN, compMenu.updateScore);

因为我不想让compSource知道compMenu;compMenu有责任知道需要收听哪些事件。

游戏和菜单似乎位于事件链中的不同链上。事件向上冒泡,由于游戏和菜单是兄弟,他们将无法访问彼此的事件


一种解决方案是,您可以从主屏幕向菜单发送游戏参考。然后在该点从菜单向其添加事件侦听器

游戏和菜单似乎位于事件链中的不同链上。事件向上冒泡,由于游戏和菜单是兄弟,他们将无法访问彼此的事件


一种解决方案是,您可以从主屏幕向菜单发送游戏参考。然后在该点从菜单向其添加事件侦听器

Sandro是正确的,因为事件会冒出气泡,而不是从侧面冒出,因此您的
菜单将永远看不到事件

一个可能的解决方案:由于
Main
已经“知道”了
compSource
compMenu
您可以安全地通过主类传递事件:

class Main{
    public function Main() 
    {
        compSource = new Game();
        compSource.addEventListener(ScoreChanged.SCORE_GAIN, scoreGainHandler);
        compMenu = new Menu();
        //... rest of constructor
    }

    public function scoreGainHandler(event:ScoreChanged):void
    {
        compMenu.updateScore(event);
    }
    //... rest of class
这样你的
游戏和
菜单就可以保持独立

事实上,如果您以这种方式构建它,
菜单
根本不需要监听分数更改事件,您只需更改更新函数以获取分数变量:

class Menu{

    public function updateScore(score:int):void 
    {
        tScore.text = String(score);
    }
    //... etc

Sandro是正确的,因为事件会冒泡,而不是从侧面冒泡,所以您的
菜单将永远看不到事件

一个可能的解决方案:由于
Main
已经“知道”了
compSource
compMenu
您可以安全地通过主类传递事件:

class Main{
    public function Main() 
    {
        compSource = new Game();
        compSource.addEventListener(ScoreChanged.SCORE_GAIN, scoreGainHandler);
        compMenu = new Menu();
        //... rest of constructor
    }

    public function scoreGainHandler(event:ScoreChanged):void
    {
        compMenu.updateScore(event);
    }
    //... rest of class
这样你的
游戏和
菜单就可以保持独立

事实上,如果您以这种方式构建它,
菜单
根本不需要监听分数更改事件,您只需更改更新函数以获取分数变量:

class Menu{

    public function updateScore(score:int):void 
    {
        tScore.text = String(score);
    }
    //... etc