0
我正在制作一个小型二维引擎,并决定使用分离轴定理进行练习。我有碰撞检测和翻译与玩家对象一起工作,但是当游戏与多个对象碰撞时,它将停止玩家的移动。这里是我的问题的一个例子:使用分离轴时的多次碰撞定理
玩家沿着墙壁推动自己向下和向右。一旦玩家到达两个方格之间的交叉点,他就不能再往下移动,因为他下方的方格会检测到碰撞,并会在方块直接向右推动玩家向左推动玩家。我相信问题在于玩家下面的瓦片在其他瓦片之前正在进行碰撞测试,但我不知道如何解决这个问题。
这是我认为需要我的代码的部分改变:
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);
}
我所有的碰撞,现在是矩形之间,以及碰撞()函数将检测碰撞并返回所需的翻译如果有玩家移动玩家。我希望有人能帮助我解决这个问题。谢谢。
我明白你在说什么,问题在于你最终还是会把这两种翻译都应用到玩家身上。按照列表的想法,我列出了与玩家碰撞的所有物体的列表,然后我解决了与玩家距离最小的物体碰撞。然后,我遍历所有剩余的对象,以查看是否有任何之后发生碰撞。如果任何剩余的物体仍然发生碰撞,那么我会重复这个过程直到所有的碰撞都被解决。这似乎工作,但如果有一个更简单的方式让我知道。 –
啊,我还没有考虑过你的嘀嗒时间足够大以致碰撞无效的情况。你的想法最接近,更新,然后处理别人似乎是明智的。如果物体以不同的速度移动,它可能会遇到困难。你可以通过建立一个有序的队列来优化它,而不是一个无序的列表。 – Alan