使用此设置防止隧道?

时间:2010-11-20 22:38:55

标签: c# xna collision-detection tunneling

我设置了一个简单的矩形瓦片碰撞方案,它的工作效果非常好。

唯一的问题是当你开始从窗台上掉下来时。你的速度达到了每帧Y / X变化足够大的程度,你可以将它剪成固体物体并出现故障。

基本上我的设置如下:

首先,玩家的位置将其速度添加到其中,因此如果没有发生碰撞,玩家现在处于下一帧的位置。 下面的列表只是一个函数,checkIntersectTiles(Vector2 maskPos);

  1. 计算要检查的字符周围的图块。
  2. 遍历切片,包括边框切片内的切片。
  3. 针对每个图块检查玩家的碰撞矩形。
  4. 如果存在交叉点,则将最大的违规轴移出平铺块,然后将该轴速度设置为0.
  5. 继续检查。
  6. 当你剪入地面时,你会在里面抖动,因为我的算法试图将你移到最与你碰撞的瓷砖之外。

    我的解决方案:检查玩家位置的每个位置,以及玩家的位置+速度。 我坚持这一点。

    任何人都可以帮我一把吗?

1 个答案:

答案 0 :(得分:4)

我假设您将玩家移出碰撞图块的代码只需一步即可完成。因此,如果玩家与瓷砖碰撞,则确定Y方向的穿透深度为5,您可以立即将玩家Y位置调整-5。

如你所知,检查每一步的玩家位置。因此,如果Y速度为5,则可以将玩家Y位置调整1,检查碰撞,然后再重复4次。稍后查看计算处理时间步进。以下只是一些基本的伪代码,只是在Y方向。

player.Y += vel;
if (player.CheckCollisions())
{
  // handle collision
}

变为

for (int i = 0; i < vel; ++i)
{
  player.Y += 1;
  if (player.CheckCollisions())
  {
    // handle collision
    break;
  }
}

如果您没有调整时间,那么这就是简单版本。如果你是,那么你宁愿执行更小的时间步骤

所以

player.Y += vel * elapsedTime;
if (player.CheckCollisions())
{
  // handle collision
}

变为

float currentTimeStep = 0;
Position startY = player.Y;
while (currentTimeStep < elapsedTime)
{
  currentTimeStep = Math.Min(currentTimeStep + stepDelta, elapsedTime); // You need to tune the stepDelta
  player.Y = startY + vel * currentTimeStep;
  if (player.CheckCollisions())
  {
    // handle collision
    break;
  }      
}

在上文中,您需要调整时间步长增量,以确保平衡性能和准确性。您可能会考虑每帧动态计算增量,以确保调整接近1像素。