我怎样才能触发从实例化对象的主要功能 - 正确的方法是什么?(How can I trigger a

2019-10-17 11:38发布

我想保持完全控制权从影片剪辑我的比赛和其他地方。 但我不希望通过构造函数传递它的实例也不做其子女的任何.parent参考啄。 似乎过于workaroundish和不稳定。

样本情况:

public class Main extends MovieClip {
    public function Main() {
        addChild(new MainMenu());
    }

    public function startGame():void {
        trace("Game started");
    }
}

 

public class MainMenu extends Sprite {
    public function MainMenu() {
        var option:Option = new Option(); // Some BitmapData library linkage
        option.addEventListener(MouseEvent.CLICK, clicked);
        addChild(option);
    }

    public function destroy():void {
        // set null/dispose/removeChildren/removeEventListener/etc.
    }

    private function clicked(evt:MouseEvent):void {
        // Should trigger startGame() here (how?) to keep the flow at Main,
        destroy(); // since this has nothing to do with it anymore
    }
}

我想对于一些单身般的解决方案,但有一个在AS3没有静态类。 它似乎不好的做法,从我研究(是吗?)。

好吧,我只想尽一切从视角与优雅的代码 ,或者至少官方的做法 。 我怎样才能做到这一点? (请告诉我这是可能的...:S)

Answer 1:

我认为有2种方法,你可以想想:静态实例:

public static var main:Main;
public function Main() {
    main = this;
    ...
}

然后:

public function MainMenu() {}

private function clicked(evt:MouseEvent):void {
    Main.main.startGame();
}

或者使用一些静态调度员,如果您的应用程序不是太大:

public static var dsp:EventDispatcher = new EventDispatcher();
public function Main() {
    dsp.addEventListener("StartGame",stageGame);
    ...
}

在MainMenu的:

 private function clicked(evt:MouseEvent):void {
    Main.dsp.dispatchEvent(new Event("StartGame"));
 }

在这里,您可以随时创建其他类将处理事件分派/听。



Answer 2:

对于单身我用格兰特斯金纳的Singleton类效果很好。

但是,对于您的需求,我不认为辛格尔顿是解决方案。 相反,我会子对象调度的父对象将监听自定义事件。 下面是一个简单的例子,使用优秀AS3信号库,而不是自定义事件:

public class Main extends MovieClip {
    public function Main() {
        var mainMenu:MainMenu new MainMenu();
        addChild(mainMenu);
        mainMenu.destroyed.add(startGame);
    }

    public function startGame():void {
        trace("Game started");
    }
}

和子:

public class MainMenu extends Sprite {

    public var destroyed:Signal;

    public function MainMenu() {
        destroyed= new Signal();
        var option:Option = new Option(); // Some BitmapData library linkage
        option.addEventListener(MouseEvent.CLICK, clicked);
        addChild(option);
    }

    public function destroy():void {
        // set null/dispose/removeChildren/removeEventListener/etc.
    }

    private function clicked(evt:MouseEvent):void {
       // Tell any class that is listening that this is being destroyed
       destroyed.dispatch();
       destroy();
    }
}

这样,MainMenu的类并不需要知道什么主; 相反,它只是分派时恰当的指导听班采取行动的信号。

可能有处理这更优雅的方式(我很好奇,我自己什么样的方法等人都有这个问题),但是这是一个我一般都用,我觉得它工作得很好。



文章来源: How can I trigger a function at Main from an instanced object — the right way?