2010-11-20 42 views
1

我有一個簡單的矩形瓷磚碰撞方案設置,它的作品非常漂亮。防止隧道與此設置?

唯一的問題是當你開始從壁架脫落。你的速度達到了每幀的Y/X變化足夠大的程度,你可以將它們剪切成固體物體併產生干擾。

基本上我的設置如下:

首先,玩家的地位它的速度增加,所以玩家現在在的地方,他會是下一個框架,如果沒有衝突發生。 下面的列表只是一個函數,checkIntersectTiles(Vector2 maskPos);

  1. 計算字符周圍的瓷磚進行檢查。
  2. 循環切片,包括邊界切片內的切片。
  3. 檢查玩家的碰撞矩形對每個這些瓷磚。
  4. 如果有交點,將最大的違規軸移出瓷磚,然後將該軸速度設置爲0.
  5. 繼續檢查。

當你陷入地面時,你會在裏面抖動,因爲我的算法試圖將你移動到最接近你的地方。

我的解決方案:檢查從玩家位置到玩家pos +速度的每個位置。 我被困在那一點。

任何人都可以幫我一把嗎?

回答

3

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

+0

試圖實現這一點,會回來給你。謝謝! – 2010-11-20 23:19:38

+0

它似乎工作:3 – 2010-11-21 00:23:41