1

メインムービークリップだけでゲームを完全に制御したいと考えています。しかし、コンストラクターを介してそのインスタンスを渡したくないし、.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
    }
}

シングルトンのようなソリューションが欲しかったのですが、AS3 には静的クラスがありません。そして、私が調査したことから、それは悪い習慣のようです(またはそうですか?)。

まあ、エレガントなコードまたは少なくとも公式のプラクティスを使用して、メインの観点からすべてを実行したいだけです。これどうやってするの?(これが可能であると教えてください... :s

4

2 に答える 2

0

あなたが考えることができる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);
    ...
}

そしてメインメニューで:

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

ここで、イベントのディスパッチ/リッスンを処理する追加のクラスをいつでも作成できます。

于 2012-12-10T07:38:46.860 に答える
0

シングルトンについては、Grant Skinner のSingleton クラスを使用します。これはうまく機能します。

ただし、あなたのニーズでは、Singleton が解決策ではないと思います。代わりに、子オブジェクトが、親オブジェクトがリッスンするカスタム イベントをディスパッチするようにします。カスタム イベントの代わりに優れたAS3 Signalsライブラリを使用した簡単な例を次に示します。

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 に答える