2011-05-25 59 views
2

如果我將播放器的「高速」變量(水平速度)設置爲足夠低的速度,那麼當他超過16x16塊的差距時,按計劃完成。然而,如果我將「高速」變量設置得足夠高,他會走得很快,以至於他在它上空盤旋。 所有雖然它工作時,我把它設置爲一個低速,它是太慢2D Box-Collisions,Platformer,我的播放器「懸停」在塊上

下面是一個例子: http://img199.imageshack.us/img199/2685/demondj.png

這裏是我撞的代碼(遍歷塊列表):

for(unsigned int i = 0; i<blocks.size(); i++){ 
Block &b = blocks.at(i); 
if(!b.passable){ 
    //Check if we are on the sides 
    if(y + height + vspeed >= b.worldY+2 && y + vspeed <= b.worldY+b.height) 
    { 
     //Right side 
     if(x + hspeed <= b.worldX+b.width+1 && x + hspeed > b.worldX+b.width + hspeed-1) 
     { 
     x = b.worldX + b.width; hspeed = 0; 
     } 
     //Left side  
     if(x + width + hspeed >= b.worldX +1 && x + width + hspeed <= b.worldX + hspeed + 1) 
     { 
     x = b.worldX - width; hspeed = 0; 
     } 
    } 

    //Check if we are on the top or the bottom 
    if(x + width + hspeed >= b.worldX+1 && x + hspeed <= b.worldX+b.width-1) 
    { 
     if(y + height + vspeed >= b.worldY && y + height + vspeed <= b.worldY + vspeed + 1 && jumpstate=="falling") 
      { 
      y = b.worldY - height; jumpstate.assign("ground"); vspeed = 0; 
      } 

     if(y + vspeed <= b.worldY + b.height && y + vspeed >= b.worldY + b.height + vspeed + 1 && jumpstate=="jumping") 
     { 
     y = b.worldY + b.height; jumpstate.assign("falling"); vspeed = 0; 
     } 
    } 

} 

}

我必須在我的碰撞代碼有問題嗎? 另一個問題是,當我碰到一個街區的底部時,這有點讓人毛骨悚然。 他應該立刻跳出來,而他確實如此,但是如果他正在移動並且他撞到了一個街區的底部,他就會不安。

回答

2

好的,這裏有很多東西:

1)太多的幻數。不確定究竟是什麼+2,+1等真正的意思。我希望將這些視爲常量。另外,我對操作順序偏執,所以我會將所有內容都放在括號中,以防萬一:)

2)不確定你的變量是什麼類型。假設浮動,但他們感覺像整數。

3)更大的問題,你設計的代碼不能很好地處理「大」速度。無法可靠地檢測到比可疑區域的寬度/高度更快的東西。你也不能輕易使用這種類型的碰撞代碼。這是你已經看到的一個副作用,我的猜測是你添加了對其餘部分的貢獻。

請考慮使用基於矢量的碰撞系統。將盒子的每個邊緣視爲線條矢量。然後,您可以執行非常簡單的數學運算,以確定點是否從線的一側開始到另一側(交叉積的符號)結束,並且點的符號將指示點是否在線段內。此外,它可以讓你的碰撞物體成爲任何形狀,甚至可以將數學擴展到3D。這種系統也是並行處理。