我假设您将玩家移出碰撞瓷砖的代码只需一步即可完成。因此,如果玩家与瓷砖碰撞,您确定 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 个像素。