舞台变为空

时间:2012-07-19 10:47:29

标签: actionscript-3 flash

我正在使用Flash Professional CS5.5中的AS3创建游戏。

在这个游戏中我有一个“再次”按钮,这样玩家可以重置关卡并从新开始。 我现在的问题是:

点击“再次”后,舞台变为空。

我在“ResetLevel”方法中做的是,我将某些元素的x和y位置设置回0,从动画片段中删除一些项目,但是我不从显示列表中删除所有项目。因此背景,hud,飞机不会从动画片段中移除。这是我的置换列表的草图。可移动项目有时为零,有时它们是30个或更多项目(取决于游戏时间,等等)

Displaylist:

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

但删除“可移除的项目”并设置levelbackground和plane的位置坐标后,该阶段为空。

也许有人可以帮我指出解决这个问题的方法。

修改

“ResetLevel”方法将在“游戏动画片段”中调用,舞台也将从“游戏动画片段”中访问。因此,当我重置关卡时,我不会从displaylist中删除“游戏动画片段”。我只删除游戏动画片段中包含的一些元素。

这里有一些来自“游戏动画片段类”(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
    }
}

2 个答案:

答案 0 :(得分:2)

从DisplayList中删除DisplayObject时,它不再保留对舞台的任何引用。因此,无论您需要设置/计算,都要在有效状态下执行此操作。 Event.ADDED,Event.ADDED_TO_STAGE,Event.REMOVED和Event.REMOVED_FROM_STAGE有助于验证DisplayObject的状态是否有效。

答案 1 :(得分: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]
    } 
}