我假设你的代码将玩家移出碰撞拼图,只需一步。因此,如果玩家与瓦片发生碰撞,您确定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;
}
}
这是简单的版本,如果你不调整ellaped时间。如果你是,那么你最好进行较小的时间步长
所以
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个像素。
试图实现这一点,会回来给你。谢谢! – 2010-11-20 23:19:38
它似乎工作:3 – 2010-11-21 00:23:41