1

我正在制作 Flash 游戏,目前我正在为碰撞检测进行编码。碰撞检测将用于检测玩家是否遇到障碍物,如果玩家遇到障碍物,则阻止他跑过。

这是我用于碰撞检测的代码:

一个 createLevel 函数

   private function createLevel():void
    {
        for (var i:int; i < numChildren; i++)
        {
            if (getChildAt(i) is Trees)
            {
                var j = getChildAt(i);
                treesArray.push(j);
                trace(treesArray.length);
            }
        }
    }

并具有碰撞检测功能。

    private function checkCollisions():void
    {
        for each (var trees:Trees in treesArray)
        {
            if (player.hitTestObject(trees))
            {
                switch (true)
                {
                    case (player.x <= trees.x) :
                        player.setRightSpeed(0);
                        break;
                    case (player.x >= trees.x) :
                        player.setLeftSpeed(0);
                        break;
                }

                switch (true)
                {
                    case (player.y <= trees.y) :
                        player.setDownSpeed(0);
                        break;
                    case (player.y >= trees.y) :
                        player.setUpSpeed(0);
                        break;
                }
            }
            else
            {
                player.resetSpeeds();
            }
        }

我将所有拖到 Flash 舞台上的 Trees 对象放入一个数组中。然后在游戏循环中,我拥有它,以便它检查与checkCollision()函数的冲突。

我有它,这样如果玩家撞到任何一棵树,它就会看到他撞到了哪一边,并阻止玩家朝那个方向移动。如果玩家没有击中任何东西,则将速度重置为正常,以便他可以向任何方向移动。

但该代码仅适用于treesArray 中的第一个Tree 对象。我的意思是玩家只有在移动到第一棵树而不是阵列中的任何其他树时才会停止。我如何使它适用于所有树木?

另外我认为这可能是由于我的player.resetSpeeds()功能所在的位置,但我不确定。

4

1 回答 1

2

有点不清楚 resetSpeeds() 究竟做了什么,但我可以从你提供的代码中看出它总是会被执行 - 除非玩家同时击中游戏中的所有树。

假设游戏中有 4 棵树,玩家击中左侧的第二棵树,那么将以该顺序在玩家对象上执行以下操作:

  1. 重置速度()
  2. player.setRightSpeed(0)
  3. 重置速度()
  4. 重置速度()

你必须首先找到被击中的树,然后才改变玩家的速度一次(而不是像游戏中的树一样多次)。

/** Find the first Trees that was hit by the player.
  * Note that the loop will quit early once a collision is found. */
private function getHitTrees():Trees {
    for each (var trees:Trees in treesArray) {
        if (player.hitTestObject(trees)) {
            return trees;
        }
    }
    return null;
}

private function checkCollisions():void {
    var hitTrees:Trees = getHitTrees();

    if (hitTrees) { stopThePlayer(hitTrees); }
    else { letThePlayerMoveOn(); }
}

这也将使您的代码更具可读性,方法是将代码分成更小的块,函数名称可以准确地告诉您其中发生了什么;而不是一个有很多嵌套的大函数。

顺便说一句:谁教你这个把戏switch(true):请把他踢疯。那是完全不可读的。

于 2011-06-11T22:21:32.460 回答