2015-10-19 23 views
0

我正在編寫我的第一個使用java和libgdx的2D遊戲:一個磚頭破碎機。如何避免與libgdx的多重衝突?

我在處理多重碰撞時遇到了一些困難。

讓我解釋一下:我創建了一個磚的數組(Brick extends Rectangle)。所有這些磚都有與矩形相同的參數,但我添加了4個布爾值:左,右,上,下。 當ball.y> brick.y - > up = true,其他所有= false。 當事情真的如果球重疊磚然後ball.y * = -1。 (對於職位和速度,我使用Vector2)。這與其他3個布爾值完全相同(對於左右我使用ball.x * = - 當然是1)。

if(briques.get(r).up_b == true || briques.get(r).down_b == true) { 
      if(ball.overlaps(briques.get(r))) { 
       vitb.y *= -1; 
      } 
     }  

if(briques.get(r).left_b == true || briques.get(r).right_b == true) { 
      if(ball.overlaps(briques.get(r))) { 
       vitb.x *= -1; 
      } 
     } 

NB:VITB ==球速(Vector2)。

這部分工作完美。但這裏是問題:

我的球的寬度和高度爲10像素。所以,如果所有的磚塊距離彼此至少10個像素,那就沒問題。但是如果它更少,球一次可以碰到2塊磚。它只是凍結,然後完全錯誤...

我試過這麼多的東西,我不知道該怎麼做。我認爲它來自一個事實,即2個矢量發送2個不同方向的球,所以我已經試過這樣:

try { 
     if(ball.overlaps(briques.get(r)) && ball.overlaps(briques.get(r+1))) { 

      if(((posb.dst(posbr.get(r))) < (posb.dst(posbr.get(r+1)))) || ((posb.dst(posbr.get(r))) == (posb.dst(posbr.get(r+1))))){ 
       briques.get(r+1).up_b = false; 
       briques.get(r+1).down_b = false; 
       briques.get(r+1).right_b = false; 
       briques.get(r+1).left_b = false; 
      } 
     } 

     if(ball.overlaps(briques.get(r)) && ball.overlaps(briques.get(r + nb_br_par_ligne))) { 
      if((posb.dst(posbr.get(r))) < (posb.dst(posbr.get(r+nb_br_par_ligne))) || (posb.dst(posbr.get(r))) == (posb.dst(posbr.get(r+nb_br_par_ligne)))){ 
       briques.get(r+nb_br_par_ligne).up_b = false; 
       briques.get(r+nb_br_par_ligne).down_b = false; 
       briques.get(r+nb_br_par_ligne).right_b = false; 
       briques.get(r+nb_br_par_ligne).left_b = false; 
      } 
     } 
     } catch(IndexOutOfBoundsException e){ 
      e.printStackTrace(); 
     } 

NB:POSB ==球的位置// posbr ==磚位置// nb_br_par_ligne是找到向上或向下「r」的磚的方式(這裏nb_br_par_ligne = 13,因爲我每行有13塊磚)。

在這段代碼中,我曾試着說:「如果球觸及2塊磚,選擇最近的,如果距離相同,則選擇左邊的一塊;對於另一塊,將所有布爾值設置爲false以避免碰撞。」我還添加了一些東西,使磚塊只有在與磚塊重疊的情況下消失,磚塊才被選中,但不起作用。

我也嘗試了其他的東西,我無法弄清楚什麼是錯的。

下面的兩個示例可以很好地工作,但我不確定我是否正確地使用了多重碰撞:我試圖將它們放入測試是否存在多重碰撞的循環中,然後嘗試將它放出循環...

if(ball.overlaps(briques.get(r))) { 
      briques.get(r).setRes(briques.get(r).getRes()-1); 

     } 

if(briques.get(i).getRes() == 0) { 
      briques.removeIndex(i); 

     } 

所以我在這裏要問,如果有人可以只給我如何避免多次碰撞,如果我的球觸及2個磚的建議。

謝謝大家(如果我用英語犯了一些錯誤,我很抱歉)。

回答

0

你只需要改變速度一次。

目前你改變它兩次,如果球擊中兩塊磚和x * -1 * -1 = x,這意味着你根本不會改變它。

只需添加一個球需要改變方向的標誌,每個幀只能設置一次(或模擬步驟)。

然後在碰撞檢查之後,檢查該標記(並在必要時重置)並相應地操縱速度。

這個標誌可能是一個枚舉:

public enum Hit 
{ 
    TOP, BOT, LEFT, RIGHT, NONE; 
} 

默認會NONE,這樣你可以檢查是否已經將球碰到了什麼東西。

+0

非常感謝您聽起來不錯,我會嘗試一下,但不會讓兩塊磚同時消失嗎? – Yts

+0

我不是專業的破磚機遊戲,但是這不正常嗎?其他明智的檢查球旗,如果它鼻涕擊中尚未。 –

+0

謝謝你的作品! – Yts