麻烦显示播放器Vector生活在舞台上

时间:2015-01-28 01:14:36

标签: arrays actionscript-3 vector flashdevelop flash-cs6

嘿大家所以我在显示播放器时遇到了一些麻烦Vector生活在一个添加到舞台的阵列中。当我第一次开始我的游戏时,生命被正确添加,当敌人击中玩家时,他们被正确移除但是当我添加了一个商店,你可以购买额外的生命我得到一个错误,矢量生活的地方被添加到舞台但是当敌人击中玩家并且他们就在那里时他们就不会移除。

在构造函数中我有nLives = 2; addPlayerLivesToStage();

以下是addPlayerLivesToStage();函数以及removePlayerLives();

private function addPlayerLivesToStage():void 
    {

        var startPoint:Point = new Point((stage.stageWidth / 2) + 240, (stage.stageHeight / 2) - 180);
        var xSpacing:Number = 30;

        lives = new Vector.<Sprite>();

        for (var i:int = 0; i < nLives; i++)
        {
            var playerLives:mcPlayerLives = new mcPlayerLives();

            playerLives.x = startPoint.x + (xSpacing * i);
            playerLives.y = startPoint.y;

            addChild(playerLives);

            lives.push(playerLives);
            //aPlayerLivesArray.push(playerLives);
        }
    }



private function removePlayerLive():void
    {
        //Remove live from screen
        removeChild(lives[lives.length - 1]);
        lives[lives.length - 1] = null;
        lives.splice(lives.length - 1, 1);
    }

现在在我的游戏中ENTER.FRAME循环我有控制购买的函数purchaseExtraLifeFunc();,并且应该为舞台增加1点生命。

喜欢如此:

private function purchaseExtraLifeFunc():void 
    {
        if (nCoins >= 5 && purchaseItem)
        {
            trace("purchase life");
            //remove coins from cost of purchase
            nCoins -= 5;
            updatecoinsTextScore();

            //add extra life
            nLives += 1;
            addPlayerLivesToStage();

        }
        else
        {
            purchaseItem = false;
        }
    }

正如你可以说我添加1 Live并调用addPlayerLivesToStage函数。

这是行不通的,如果有人可以帮助我的话我完全没有想法我会真的很感激它

1 个答案:

答案 0 :(得分:1)

我可以看到一些可能是原因的逻辑问题。

看起来你的addPlayerLivesToStage方法忽略了之前可能已被调用的事实,并且可能已经有Sprites添加到舞台上。然后使用新的Vector覆盖life Vector。因此,您无法再访问以前添加的Sprite了。

我敢打赌,如果你让生命Sprites略微透明,当你购买更多生命时,你会看到它们叠加在一起。或者,为了测试,您可以存储一个在循环中添加生命Sprite时增加的数字。并将新精灵的Y设置为此数字。这样你就会看到你要添加的所有精灵。

要解决此问题,您希望在addPlayerLivesToStage函数的开头删除所有生命Sprite,因为无论如何您将在以后的函数中重新创建它们。

编辑*

问题仍然是在addPlayerLivesToStage调用之间没有清理Sprite。

如果你第一次使用容器Spirte来容纳你所有的生命精灵,那就容易多了。所以在你的班级中添加一个私人财产:

private var livesContainer:Sprite;

然后在你的构造函数中,只需设置它:

livesContainer = new Sprite();
livesContainer.x = (stage.stageWidth / 2) + 240;
livesContainer.y = (stage.stageHeight / 2) - 180;
addChild(livesContainer);

您可以将所有生命添加到此容器中。

我修改了你的addPlayerLivesToStage函数来删除最后遗留的精灵,并清理了添加,因此它不会添加已经添加的生命。

private function addPlayerLivesToStage():void 
{
    var xSpacing:Number = 30;

    // Add new life sprites if we need to.
    for (var i:int = lives.length; i < nLives; i++)
    {
        var playerLives:mcPlayerLives = new mcPlayerLives();
        playerLives.x = xSpacing * i;
        livesContainer.addChild(playerLives);
        lives.push(playerLives);
    }

    // Remove any life Sprites that are left over from last time.
    for (var j:int = lives.length - 1; j > nLives; j--)
    {
        var life:Sprite = lives[j]
        livesContainer.removeChild(life);
        lives.splice(j, 1);
    }
}