2012-09-02 66 views
3

我正在嘗試製作平臺遊戲。我有碰撞代碼(幾乎),但似乎有一個錯誤。我試試這個代碼:平臺遊戲者碰撞(穿透地面幾個像素)

for (int i = 0; i < world.ground.size(); i++) { 
     if (!world.ground.get(i).intersects((int) x, (int) y, player_width, player_height + (int) dy)) { 
      y += dy; 
      if (dy < 4) { 
       dy += 0.1; 
      } 
     } else { 
      dy = 0; 
      jumped = false; 
     } 
    } 

但是有時我的角色的腳通過2或3像素穿過地面。有一個更好的方法嗎?請幫忙,謝謝。

+0

都香椿的腳相同的高度?它可能是唯一的缺陷是純粹的化妝品。 x,y和dy的數據類型是什麼?有趣的代碼是'if(dy <4)'位。那個有什麼用? –

+0

我不希望dy太高。所以你可以認爲4是終端速度。 x y和dy是雙打。腳的高度是相同的。 –

+0

因此,如果'dy'從.1開始,那麼您可以將'dy'增加到4,因爲'i'從0增加到'world.ground.size()'? –

回答

3

看起來好像你正在使用一個posteriori (discrete)碰撞檢測。這會導致你的物體每次穿透一點點,只有當它被觸摸或穿透時纔會激活。您可能會認爲將其轉換爲priori (continuous)衝突檢測。這樣,它不會穿透地面,因爲它在碰撞之前檢查,然後調整速度或位置以避免穿透。

如果你不想擺弄這種類型,你可以添加一個correction功能,在繪畫前進行操作。

void foo() 
{ 
     //check if below ground 
     //if yes, displecement upwards until it is above enough 
     //now you can paint 
     //return 
} 

我看你實現了這個:

what_you_need_to_make_it_above_ground=(ground_y-feet_y); 


    //im not sure if dy is ground level so i added second boolean compare 

    if ((dy < 4)||(ground_y>feet_y)) { 
       dy += 0.1; // this isnt enough. should be equal to: 
       dy +=what_you_need_to_make_it_above_ground; 
       dy +=if_there_are_other_parameters_think_of_them_too; 

       } 
+0

好的,那我該如何實現這個先驗碰撞檢測?有點僞代碼會有幫助。 –

+0

剛剛添加了一些僞'你'執行,因爲我不想取消你的程序 –