碰撞响应2d

时间:2011-07-29 09:39:03

标签: c# xna 2d response collision

问题: Problem http://img684.imageshack.us/img684/5486/prob1b.png Problem http://img810.imageshack.us/img810/3157/prob3.png 绿色块是播放器,灰色块是静态块

当对着瓷砖跳起时,当玩家站在碰撞瓷砖的边缘附近时,向左/右推动玩家。这可能是因为跳跃速度大于x移动(甚至可能是0),因此玩家在x轴上得到纠正......

伪代码如下:

  • 1:玩家周围的碰撞瓦片
  • 2:foreach碰撞瓷砖:

{

  • 2a:获得交叉深度
  • 2b:使用最小的校正轴校正玩家位置 (例如:if(Math.Abs​​(X)> Math.Abs​​(Y)然后校正Y值。否则 正确的X值)

//下面是一些其他伪代码,不应该成为问题的一部分:

  • 2c:如果与玩家的顶部发生碰撞:取消任何跳跃
  • 2d:如果与玩家底部发生碰撞: IsStandingOnGround = true;

}

一些代码:

  foreach (Stone stone in collidingStones)
            {
                #region Collision Response
                if (DrawRect.Intersects(stone.CollisionRect)) // DrawRect is the players collision rectangle
                {
  //warning bug is in this if-statement. causes the player to be adjusted and go trough neighboar tiles and such
                    Vector2 correction = Collision.CalculateMinimumTranslationDistance(DrawRect, stone.CollisionRect);
                    if (Math.Abs(correction.X) > Math.Abs(correction.Y))
                    {
                        Location += new Vector2(correction.X, 0);
                    }
                    else
                    {
                        Location += new Vector2(0, correction.Y);
                    }

1 个答案:

答案 0 :(得分:0)

有趣的问题,几年前我在Delphi开发游戏,遇到了同样的问题。几点:

  • 你应该在碰撞时纠正X和Y.仅校正X或Y在高速时看起来不自然(超过〜3px /更新)。
  • 您正在进行的碰撞检测类型适用于矩形填充的切片,但如果您有不规则的切片(如斜坡部分的三角形),则无法计算碰撞的修正值。 / LI>

最后,我制作了一个引擎,其中每个磁贴都有位图(实际可见图形)和我称为 freemap 的东西,它是一个黑色和白色位图,表示图块内的可用空间的映射。然后我编写了碰撞函数,它首先在图块空间中操作(以确定与玩家碰撞的图块)然后在图块的位图中。

移动播放器时,您可以根据播放器的速度计算下一个点,然后沿着当前位置和计算的下一个位置之间的线测试每个点。如果在那条线上遇到障碍物,那么你就会在那一点停止玩家。