我假設你的代碼將玩家移出碰撞拼圖,只需一步。因此,如果玩家與瓦片發生碰撞,您確定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