我有一个带有一个按钮的菜单页面,它通过添加一个孩子并删除一个来导致另一个页面。非常简单。从这里我有一个页面,允许点击许多建筑物,这将打开一个新的页面(迷你游戏页面)。我用setter和getter做了这个,如下所示:
Main.as(从MainPage中的getter获取值)
public function onEnterFrame(event:Event):void
{
//Swaping pages with a getter and setter
if (mainPage.stage && mainPage.getNextLevel() == 1)
{
addChild(miniGameOne);
removeChild(mainPage);
}
if (miniGameOne.stage && miniGameOne.getNextLevel() == 2)
{
addChild(mainPage);
removeChild(miniGameOne);
}
}
MainPage.as(包含所有建筑物)
public function onAddedToStage(event:Event):void
{
doctor.addEventListener(MouseEvent.CLICK, onDoctorClick);
}
public function onDoctorClick(event:MouseEvent):void
{
setNextLevel(1);
}
public function setNextLevel(passLevel:int)
{
nextLevel = passLevel;
}
public function getNextLevel():int
{
return nextLevel;
}
MiniGameOne.as 这里说明迷你游戏完成后将页面设置为2,即添加MainPage.as并删除MiniGameOne.as
public function onEnterFrame(event:Event):void
{
healthbar.meter.scaleY = life/100;
if (life < 1)
{
life = 1;
//Make sure it isn't visiable
healthbar.meter.alpha = 0;
//New Function
gameComplete();
}
}
public function gameComplete()
{
//Level Complete, Set new Level
setNextLevel(2);
}
我有一个问题,当我进入一个页面(点击建筑物)然后返回到原始页面并点击同一建筑物时我无法再次打开同一页面,任何人都可以解释这里发生了什么?感谢。
答案 0 :(得分:0)
之所以发生这种情况,是因为您已为nextLevel
和MainPage
类定义并正在检查MiniGameOne
。当您将miniGameOne
实例中的级别更改为2
时,它将为2
,直到您将其更改为其他某个数字。
从那时起,你有:
mainPage.getNextLevel() == 1
和
miniGameOne.getNextLevel() == 2
因此,在enterFrame()
这两个条件都属实且您的miniGameOne
被添加到舞台上但在相同的框架中,它会被删除,并再次添加mainPage
。
作为最快的解决方案,您可以更改该行:
if (miniGameOne.stage && miniGameOne.getNextLevel() == 2)
到
else if (miniGameOne.stage && miniGameOne.getNextLevel() == 2)
但是这可能只会在下一帧到达之前离开您的迷你游戏,所以当您回到nextLevel
时需要重置mainPage
值:
if (miniGameOne.stage && miniGameOne.getNextLevel() == 2){
addChild(mainPage);
removeChild(miniGameOne);
miniGameOne.setNextLevel(0);
}
然而,你所拥有的是非常糟糕的做法。
所有的拳头,只更改您在每个帧上实际需要更新的帧事件中的程序部分,或者您真的没有任何其他方法来确定何时应该更新< /强>
其次,不要复制存储应用状态的变量。
有很多方法可以解决这个问题,但我会展示一个可能与你已经最接近的问题:
1 在Main
课程中定义等级状态,将等级存储在数组/向量/等等中,将主要实例传递到您的等级。
/**Current level**/
private var cl:uint = 0;
/**All levels veiews that could be shown.**/
private var levels:Array = [mainPage, miniGameOne];
public function Main() {
for each (var l in levels) l.main = this;
}
public function get level():uint { return cl; }
public function set level(l:uint) {
this.removeChild(levels[cl]);
this.addChild(levels[cl = l]);
}
2 在您的关卡类中为主实例定义setter,您现在可以更改存储在main中的当前关卡。
private var m:Main;
public function set main(v:Main):void { m = v; }
public function onDoctorClick(event:MouseEvent):void{
m.level = 1;
}
public function gameComplete(){
//Level Complete, Set new Level
m.level = 0;
}
3 可以删除所有其他代码,尤其是帧事件代码。
解决方案可能并不理想,但我希望它会给你一些想法。