2013-03-30 26 views
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); 
    } 

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

回答

1

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

+0

我明白你在说什么,问题在于你最终还是会把这两种翻译都应用到玩家身上。按照列表的想法,我列出了与玩家碰撞的所有物体的列表,然后我解决了与玩家距离最小的物体碰撞。然后,我遍历所有剩余的对象,以查看是否有任何之后发生碰撞。如果任何剩余的物体仍然发生碰撞,那么我会重复这个过程直到所有的碰撞都被解决。这似乎工作,但如果有一个更简单的方式让我知道。 –

+0

啊,我还没有考虑过你的嘀嗒时间足够大以致碰撞无效的情况。你的想法最接近,更新,然后处理别人似乎是明智的。如果物体以不同的速度移动,它可能会遇到困难。你可以通过建立一个有序的队列来优化它,而不是一个无序的列表。 – Alan