1

我想从Main MovieClip 和其他任何地方完全控制我的游戏。但是我不想通过构造函数传递它的实例,也不想从它的孩子那里引用任何.parent的东西。似乎太变通和不稳定。

示例情况:

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

我希望有一些类似 Singleton 的解决方案,但 AS3 中没有静态类。从我的研究来看,这似乎是一种不好的做法(或者是吗?)。

好吧,我只想从Main角度用优雅的代码或至少官方实践来做所有事情。我怎样才能做到这一点?(请告诉我这是可能的...... :s

4

2 回答 2

0

对于单身人士,我使用 Grant Skinner 的单身人士类,效果很好。

但是,对于您的需求,我认为 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 类就​​不需要知道关于 Main 的任何信息;相反,它只是在适当的时候发送信号,指示监听类采取行动。

可能有更优雅的方法来处理这个问题(我很好奇自己有什么方法可以解决这个问题),但这是我通常使用的方法,我发现它运作良好。

于 2012-12-09T22:26:00.210 回答
0

我认为您可以考虑另外两种方法:静态实例:

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

在主菜单中:

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

在这里,您始终可以创建额外的类来处理事件调度/侦听。

于 2012-12-10T07:38:46.860 回答