我正在使用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
}
}
答案 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]
}
}