塞特犬/吸气剂(AS3)

时间:2017-04-30 16:18:04

标签: actionscript-3 flash getter-setter

我有一个带有一个按钮的菜单页面,它通过添加一个孩子并删除一个来导致另一个页面。非常简单。从这里我有一个页面,允许点击许多建筑物,这将打开一个新的页面(迷你游戏页面)。我用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);
    }

我有一个问题,当我进入一个页面(点击建筑物)然后返回到原始页面并点击同一建筑物时我无法再次打开同一页面,任何人都可以解释这里发生了什么?感谢。

1 个答案:

答案 0 :(得分:0)

之所以发生这种情况,是因为您已为nextLevelMainPage类定义并正在检查MiniGameOne。当您将miniGameOne实例中的级别更改为2时,它将为2,直到您将其更改为其他某个数字。 从那时起,你有:

mainPage.getNextLevel() == 1miniGameOne.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 可以删除所有其他代码,尤其是帧事件代码。

解决方案可能并不理想,但我希望它会给你一些想法。