我正在制作一个小型 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() 函数将检测碰撞并返回移动玩家所需的平移(如果有的话)。我希望有人可以帮助我解决这个问题。谢谢。