Ste*_*nal 1 c# xna collision-detection tunneling
我设置了一个简单的矩形瓷砖碰撞方案,并且效果很好。
唯一的问题是当你开始从壁架上掉下来时。你的速度达到了每帧 Y/X 变化足够大的程度,足以让你夹入固体物体并出现故障。
基本上我的设置如下:
首先,玩家的位置添加了速度,因此如果没有发生碰撞,玩家现在位于下一帧的位置。下面的列表只是一个函数,checkIntersectTiles(Vector2 maskPos);
当你夹入地面时,你会在里面抖动,因为我的算法试图将你移到与你碰撞最严重的瓷砖之外。
我的解决方案:检查从玩家的位置到玩家的位置+速度的每个位置。我被困在这一点上。
有人可以帮我吗?
我假设您将玩家移出碰撞图块的代码只需一步即可完成。因此,如果玩家与图块发生碰撞,您确定 Y 方向的穿透深度为 5,您会立即将玩家 Y 位置调整 -5。
按照您的建议,检查每一步的玩家位置。因此,如果 Y 速度为 5,那么您可以将玩家的 Y 位置调整 1,检查碰撞,然后再重复 4 次。请参阅稍后处理时间步进的计算。下面只是一些基本的伪代码,并且只是在 Y 方向。
player.Y += vel;
if (player.CheckCollisions())
{
// handle collision
}
Run Code Online (Sandbox Code Playgroud)
成为
for (int i = 0; i < vel; ++i)
{
player.Y += 1;
if (player.CheckCollisions())
{
// handle collision
break;
}
}
Run Code Online (Sandbox Code Playgroud)
如果您不调整经过的时间,这就是简单的版本。如果是,那么您宁愿执行较小的时间步长
所以
player.Y += vel * elapsedTime;
if (player.CheckCollisions())
{
// handle collision
}
Run Code Online (Sandbox Code Playgroud)
成为
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;
}
}
Run Code Online (Sandbox Code Playgroud)
在上面,您需要调整时间步长增量以确保平衡性能与准确性。您可能会考虑动态计算每帧的增量,以确保调整接近 1 个像素。
| 归档时间: |
|
| 查看次数: |
709 次 |
| 最近记录: |