0

我正在制作一个小型 2D 引擎,并决定使用分离轴定理进行练习。我对玩家对象进行了碰撞检测和平移,但是当游戏与多个对象发生碰撞时,它会停止玩家的移动。这是我的问题的一个例子:

玩家沿着墙壁移动,将自己向下和向右推。一旦玩家到达两个瓷砖之间的交叉点,他就不能再向下移动,因为他下方的瓷砖会检测到碰撞,并将在玩家直接向右的瓷砖将他推向左侧之前将玩家向上推。我认为问题在于玩家下方的瓷砖正在测试其他瓷砖之前的碰撞,但我不知道如何解决这个问题。

这是我认为需要更改的代码部分:

protected override void Update(GameTime gameTime)
    {
        gameCamera.Update(new Vector2(player._boundingBox.X, player._boundingBox.Y));

        foreach (Layer l in currentLevel.Layers)
        {
            foreach (GameObject gameObject in l.layerMapObjects)
            {
                gameObject.Update(gameTime);
            }
        }

        player.Update(gameTime);

        foreach (Layer l in currentLevel.Layers)
        {
            foreach (GameObject gameObject in l.layerMapObjects)
            {
                if (gameObject._isCollidable)
                {
                    Vector2 vectorTranslation = Collision(player._boundingBox, gameObject._boundingBox);
                    player._boundingBox.X += (int)vectorTranslation.X;
                    player._boundingBox.Y += (int)vectorTranslation.Y;
                }
            }
        }

        base.Update(gameTime);
    }

我现在所有的碰撞都在矩形之间,并且 Collision() 函数将检测碰撞并返回移动玩家所需的平移(如果有的话)。我希望有人可以帮助我解决这个问题。谢谢。

4

1 回答 1

1

如果问题是您的播放器在检测到所有冲突之前正在更新,请尝试批处理该过程。那是; 而不是立即应用 vectorTranslations 来创建它们的列表,然后当检测到所有碰撞时,将翻译列表应用于播放器。

于 2013-03-30T19:48:51.517 回答