0

Flash Professional CS5.5 で AS3 を使用してゲームを作成しています。

このゲームには「再」ボタンがあり、プレイヤーはレベルをリセットして新しいところから始めることができます。私の問題は今です:

「もう一度」クリックすると、ステージはnullになります。

「ResetLevel」メソッドで行うことは、一部の要素の x 位置と y 位置を 0 に戻し、ムービークリップから一部の項目を削除することだけですが、表示リストからすべての項目を削除するわけではありません。したがって、背景、hud、飛行機はムービークリップから削除されません。ここに私のディスプレイリストのスケッチがあります。取り外し可能なアイテムは、ゼロの場合もあれば、30 以上の場合もあります (プレイ時間などによって異なります)。

Displaylist:

stage
|-- Game movieclip
    |--LevelBackground
    |--Removeable item 
    |--Removeable item
    |--Removeable item
    |--Plane
    |--HUD

しかし、「取り外し可能なアイテム」を削除し、levelbackground と plane の位置座標を設定すると、ステージは null になります。

誰かがこの問題の解決策を教えてくれるかもしれません。

編集:

「ResetLevel」メソッドは「ゲーム ムービークリップ」内で呼び出され、「ゲーム ムービークリップ」からもステージにアクセスします。そのため、レベルをリセットするときに「ゲームのムービークリップ」をディスプレイリストから削除しません。ゲームのムービークリップに含まれる一部の要素のみをムービークリップから削除します。

「ゲーム ムービークリップ クラス」(GameMC) の疑似コードを次に示します。

public class GameMC extends Sprite {

    //Some properties here

    public function GameMC() {
        //Some code here

        //--Events--
        this.addEventListener(Event.ADDED_TO_STAGE, Init, false, 0, true);
        this.addEventListener(Event.REMOVED_FROM_STAGE, Removed, false, 0, true);
    }

    private function Init(e:Event) {
        this.removeEventListener(Event.ADDED_TO_STAGE, Init);
        //Some Code here
    }

    private function ResetLevel() {
        //Some Code here, too
        if(removeItemArray.length > 0) {
            for(i = 0; i < removeItemArray.length; i++) {
                currentRemoveableItem = removeItemArray[i];
                this.removeChild(currentRemoveableItem );
                removeItemArray.splice(i, 1);
            }
        }
        level.x = 0;
        level.y = 0;

        trace(stage); //Will output null
    }
}
4

2 に答える 2

2

DisplayObject が DisplayList から削除されると、ステージへの参照が保持されなくなります。したがって、設定/計算する必要があるものはすべて、有効な状態で実行してください。Event.ADDED、Event.ADDED_TO_STAGE、Event.REMOVED、および Event.REMOVED_FROM_STAGE は、DisplayObject の状態が有効であることを確認するのに役立ちます。

于 2012-07-19T10:57:13.247 に答える
0

今、私はステージをプロパティに保存し、これにアクセスしていました:

public class GameMC extends Sprite { 

    //Some properties here
    private var stagevar:Stage;

    public function GameMC() { 
        //Some code here 

        //--Events-- 
        this.addEventListener(Event.ADDED_TO_STAGE, Init, false, 0, true); 
        this.addEventListener(Event.REMOVED_FROM_STAGE, Removed, false, 0, true); 
    } 

    private function Init(e:Event) { 
        this.removeEventListener(Event.ADDED_TO_STAGE, Init); 
        this.stagevar = stage;
        //Some Code here 
    } 

    private function ResetLevel() { 
        //Some Code here, too 
        if(removeItemArray.length > 0) { 
            for(i = 0; i < removeItemArray.length; i++) { 
                currentRemoveableItem = removeItemArray[i]; 
                this.removeChild(currentRemoveableItem ); 
                removeItemArray.splice(i, 1); 
            } 
        } 
        level.x = 0; 
        level.y = 0; 

        trace(stagevar); //Will output [Object Stage]
    } 
} 
于 2012-07-19T15:59:43.107 に答える