2013-02-25 84 views
0

這是12級OPP作業。需要關於突圍遊戲碰撞問題的幫助

目前我有一個問題,球有時會進入塊而不是反射。

這裏是我的代碼:

如何主要檢查球擊中塊:

public void theBall(){ 
    //System.out.println(blocks.size()); 
    if(!started){ 
     balls.get(0).withPaddle(paddle.returnX()); 
    } 
    if(started){ 
     for(int i=0;i<balls.size();i++){ 
      if(balls.get(i).returnX()>=0 && balls.get(i).returnX()<=800 && balls.get(i).returnY()>=0){ 
       balls.get(i).move(); 
      } 
      if(balls.get(i).returnX()+balls.get(i).returnDx()<= 0){ 
       balls.get(i).collide(1);//collide with left wall 
      } 
      if(balls.get(i).returnX()+10+balls.get(i).returnDx() >= 800){ 
       balls.get(i).collide(2);//collide with right wall 
      } 
      if(balls.get(i).returnY()-balls.get(i).returnDy() <= 0){ 
       balls.get(i).collide(3);//collide with up wall 
      } 

      if(paddle.returnX() < balls.get(i).returnX() && balls.get(i).returnX()< paddle.returnX()+paddle.returnSize() && balls.get(i).returnY()-balls.get(i).returnDy() >= 545){//fix this && balls.get(i).returnY()-balls.get(i).returnDy() <= 560 
       balls.get(i).collidePaddle(balls.get(i).returnX()-paddle.returnX());//collide with paddle 
       //System.out.println(ball.returnDy()); 
      } 
      for(int j=0;j<blocks.size();j++){ 
       //blocks.get(j).getHit(balls.get(i)); 
       if(balls.get(i).returnX()+10+balls.get(i).returnDx() >= blocks.get(j).returnX() && balls.get(i).returnX()+10+balls.get(i).returnDx() <= blocks.get(j).returnX()+5 && balls.get(i).returnY() >= blocks.get(j).returnY() && balls.get(i).returnY() < blocks.get(j).returnY()+50){ 
        if(!blocks.get(j).returnHit()){ 
         balls.get(i).collide(2);//collide with right wall (block's left) 
         blocks.get(j).getHit(balls.get(i)); 
         System.out.println("boiboiboiboibo1"); 
        } 
       } 

       if(balls.get(i).returnX()+balls.get(i).returnDx() <= blocks.get(j).returnX()+50 && balls.get(i).returnX()+balls.get(i).returnDx() >= blocks.get(j).returnX()+45 && balls.get(i).returnY() >= blocks.get(j).returnY() && balls.get(i).returnY() < blocks.get(j).returnY()+50){ 
        if(!blocks.get(j).returnHit()){ 
         balls.get(i).collide(1);//collide with left wall (block's right) 
         blocks.get(j).getHit(balls.get(i)); 
         System.out.println("boiboiboiboibo2"); 
        } 
       } 

       if(balls.get(i).returnX() >= blocks.get(j).returnX() && balls.get(i).returnX() < blocks.get(j).returnX()+50 && balls.get(i).returnY()-balls.get(i).returnDy() <= blocks.get(j).returnY()+50 && balls.get(i).returnY()-balls.get(i).returnDy() >= blocks.get(j).returnY()+45){ 
        if(!blocks.get(j).returnHit()){ 
         balls.get(i).collide(3);//collide with up wall (block's bottom) 
         blocks.get(j).getHit(balls.get(i)); 
         System.out.println("boiboiboiboibo3"); 
        } 
       } 
       if(balls.get(i).returnX() >= blocks.get(j).returnX() && balls.get(i).returnX() < blocks.get(j).returnX()+50 && balls.get(i).returnY()+10-balls.get(i).returnDy() >= blocks.get(j).returnY() && balls.get(i).returnY()+10-balls.get(i).returnDy() <= blocks.get(j).returnY()+5){ 
        if(!blocks.get(j).returnHit()){ 
         balls.get(i).collide(4);//collide with down wall (block's top) 
         blocks.get(j).getHit(balls.get(i)); 
         System.out.println("boiboiboiboibo4"); 
        } 
       } 
      } 
      for(int j=0;j<specialBlocks.size();j++){ 
       if(balls.get(i).returnX()>=specialBlocks.get(j).returnX() && balls.get(i).returnX()<=specialBlocks.get(j).returnX()+100 && balls.get(i).returnY()>=specialBlocks.get(j).returnY() && balls.get(i).returnY()<=specialBlocks.get(j).returnY()+100){ 
        oneAndThreeBalls(i, j); 
        balls.get(i).changeType(j); 
       } 
      } 
     } 
    } 
} 

如何將球反映:

public void collide(int collideWith){ 
    if(collideWith==1){//collide with left wall 
     if(90<direction && direction<180){ 
      direction = 180-direction; 
     } 
     if(180<direction && direction<270){ 
      direction = 540-direction; 
     } 
    } 
    if(collideWith==2){//collide with right wall 
     if(0<direction && direction<90){ 
      direction = 180-direction; 
     } 
     if(270<direction && direction<360){ 
      direction = 540-direction; 
     } 
    } 
    if(collideWith==3){//collide with up wall 
     direction = 360-direction; 
    } 
    if(collideWith==4){//collide with down wall 
     direction = 360-direction; 

    } 
} 

這是非常清楚的,我認爲該錯誤是因爲對邊界的雙重檢查。當球在一個街區的角落時,就會發生。但這是我能想到的唯一方法來檢查球的位置來反映。任何想法如何我可以修復這個錯誤?謝謝。

+0

嘗試在for循環中添加'continue;',一旦發現一個衝突。這將防止程序運行多個衝突。 – Zyerah 2013-02-25 04:03:28

回答

1

爲什麼不把這麼:

1)做一個反彈後,停止檢查那個球發生碰撞,直到比賽的下一個節拍。這樣一個球只能在每次跳動時反彈一次。 2)碰撞並反彈一個塊後,忽略該特定塊與球之間的碰撞,直到球不與塊重疊爲止。這樣一來,在同樣的影響下,一個球不會從一個方塊中反彈回來。

順便說一句,你有很多複製和粘貼的代碼只有輕微的數字變化等等。如果你找到一種方法來重新使用一種方法來重新調用它,你會用稍微不同的參數來調用它,你的代碼會變得很整齊,並且問題的基本對稱性也會更明顯。

+0

謝謝,但即使是第一次打擊也可能是錯誤的碰撞方向。 – 2013-02-25 04:05:46

+0

@cook cook只有當球移動得太快以至於它可以在一個嘀嗒聲中嵌入一半的塊時。如果它不行,那麼如果你在一個街區的角落,那麼你反彈的方式並不重要 - 兩者同樣有效,因爲它們會讓你遠離街區。對於內角來說,你會比另一個反彈一個,所以即使你在一個時間刻度內嵌入它也沒有關係。 – Patashu 2013-02-25 04:06:49

+0

我仍然不認爲這是因爲雙彈跳。我認爲這是因爲球有兩種走向,一種是錯誤的。例如,如果球以45度的角度進入右下角。如果碰撞恰好在底壁上,則這將是正常的,其以315度的角度反射。但是如果碰撞碰巧與右牆。然後球將反射135角,這將進入塊。 – 2013-02-25 04:15:03