2011-07-03 59 views
0

嗯,我有一個二維框衝突代碼,基本上循環遍歷列表中的每個塊名爲「塊」,它檢查我是否靠近兩側和什麼。C++ 2D Box-Collision,是嗎?

它工作得很好,除了塊的底部。當我向底部跳躍時,我希望我的玩家只是「反彈」。它這樣做,但它非常糟糕。這很難解釋,所以我希望你們可以發現我的底部碰撞代碼有什麼問題。

這裏就是整個事情(這是在一個循環中運行):

for(unsigned int i = 0; i<blocks.size(); i++){ 
Block &b = blocks.at(i); 
if(!b.passable==true){ 
    //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-2) 
     { 
     x = b.worldX + b.width; hspeed = 0; 
     } 
     //Left side  
     if(x + width + hspeed >= b.worldX +1 && x + width + hspeed <= b.worldX + hspeed + 2) 
     { 
     x = b.worldX - width; hspeed = 0; 
     } 
    } 

    //Check if we are on the top or the bottom 
    if(x + width + hspeed >= b.worldX+2 && x + hspeed <= b.worldX+b.width-2) 
    { 
     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; 
     } 
    } 
    }  
} 
+0

[2D Box Collision - This is right?]的可能重複(http://stackoverflow.com/questions/6561341/2d-box-collision-is-this-right) –

回答

0

我不知道你會得到它像這樣工作。我會解釋一下我認爲的碰撞檢測和反彈運行平穩的解決方案。記錄上次檢查碰撞和調整位置的時間間隔。如果Xplayer+Vplayer*deltaT>Xtarget(如果玩家會重疊目標),那麼計算它將觸及目標的實際時間deltaTtouch=(Xtarget-Xplayer)/Vplayer。現在將玩家彈回Xplayer=Xtarget-Vplayer*(deltaT-deltaTtouch)。在向前,向後,向上,向下移動時,你必須弄清所有情況。
LE:你也可以實現引力,這包括求解一個二次方程來找出deltaTtouch

0

那麼我可以看到幾個小細節:

1)在這一行檢查老位置時hspeed是相當多餘的,最好將其刪除的清晰度。

if(x + hspeed <= b.worldX+b.width-1 && x + hspeed > b.worldX+b.width + hspeed-2) 

變爲:

if(x + hspeed <= b.worldX + b.width - 1 && x > b.worldX + b.width - 2) 

規則同樣適用於其他類似的線路。

2) -2和-1的小偏移量有點混亂,我認爲你試圖實現一個小的緩衝區,以便需要少量的重疊。特別是這條線,你已經使用了<的<代替=你使用的每一個東西:

if(x + hspeed <= b.worldX+b.width-1 && x + hspeed > b.worldX+b.width + hspeed-2) 

爲了保持相合與程序的其餘部分我可能會寫:

if(x + hspeed <= b.worldX + b.width - 1 && x >= b.worldX + b.width - 1) 

3 )你似乎缺少一些你的小偏移在VERT檢查:

所以這首先檢查:

if(y + height + vspeed >= b.worldY && y + height + vspeed <= b.worldY + vspeed + 1 && jumpstate=="falling") 

你似乎已經忘了你的小膠印機:

if(y + height + vspeed >= b.worldY + 1 && y + height <= b.worldY + 1 && jumpstate=="falling") 

然後第二次檢查:

if(y + vspeed <= b.worldY + b.height && y + vspeed >= b.worldY + b.height + vspeed - 1 && jumpstate=="jumping") 

再次偏移:

if(y + vspeed <= b.worldY + b.height - 1 && y >= b.worldY + b.height - 1 && jumpstate=="jumping") 

4)您需要要非常小心,速度和跳躍總是保持不變因爲vspeed的符號需要始終與jumpstate相匹配,否則您將錯過碰撞。我想這可能是你的問題來自哪裏。

5)在兩個方向上,如果速度超過塊大小,您將跳過碰撞檢測並通過塊觸發。

if(y + height + vspeed >= b.worldY+2 && y + vspeed <= b.worldY+b.height) 

如果速度大於b.height更高和y COORDS類似於在這些行中的第二檢查將是假的。

希望有助於一些。