簡體   English   中英

你如何確保碰撞后 2 個球被移除?

[英]How do you make sure the 2 balls are removed after the collision?

我是初學者,我正在 Netbeans 制作一款太空射擊游戲。我想如果飛船的子彈擊中敵人的子彈,那么 2 顆子彈就會被移除。 我創建了一個 Arraylist 的子彈和 bulletsEnemy。 然后我創建了一個 hitByBullet 方法,它應該確保我可以搜索碰撞的子彈。 然后在方法 bulletsHit() 中,子彈應該被移除。

我的敵人循環射擊,一動不動。 我的問題是子彈 go 相互穿過。 子彈的半徑是5。

這是我寫的兩種方法

'''

public int hitByBullet(){
   for(int i=0; i<bullets.size(); i++){
       for(int j= 0;j< bulletsEnemy.size(); j++){
          if( bullets.get(i).getY() - bulletsEnemy.get(j).getY()<= 5)
           if(bullets.get(i).getX() -bulletsEnemy.get(j).getX()<= 5){ 
           return i;
           }
       }
        
   }
   return -1;
}

'''

public boolean bulletsHit(){
     if (hitByBullet()!= -1){               
         bullets.remove(this);  //with 'this' I refer too 'i'
         bulletsEnemy.remove(this);
         return true;
     }
     return false;
}

'''

[This is how it looks like] (https://i.stack.imgur.com/4XsCR.png)

我將嘗試以一種讓您找到實現所需內容的方式來回答。 有幾個框架可以幫助您解決這個問題,並且由於您是編程新手,所以您可以更改/做得更好。 但我會忽略這些事情。

我認為您正在嘗試檢查一顆 5x5 子彈是否與另一顆 5x5 子彈相交。

為了簡單起見,讓我們假設您的項目符號是正方形

在您的 hitByBullet 中,您應該在兩個維度上檢查您的正方形中心(我假設是您的子彈的 x,y)距離:

…… 像這樣應該檢查碰撞:

if(Math.abs(bullets.get(i).getY() - bulletsEnemy.get(j).getY()) < 5 && 
    Math.abs(bullets.get(i).getX() - bulletsEnemy.get(j).getX()) < 5) { 
       return i;
}

根據子彈的大小,您需要更改距離檢查(<=5)。 如果你的項目符號大小為 5 px,它應該 < 10。如果你的項目符號是 10x10,你應該檢查 < 20 ...

關於一個更現實的場景,你的子彈是圓圈(例如 5x5 方形像素或半徑 r=5 的結果):

您需要檢查兩個子彈中心之間的距離是否小於子彈半徑 * 2。

這將使您使用畢達哥拉斯定理:

畢達哥拉斯定理

https://en.wikipedia.org/wiki/Pythagorean_theorem

子彈中心之間的距離是 c。a 是維度 x 中的距離,b 是維度 y 中的距離。 您不需要關心負維度值,因為您需要將它們乘以 2,這將始終為您提供正值。

要檢查碰撞,您應該計算距離 c,如下所示:

c = 平方根(a^2+b^2)

Math.sqrt(Math.pow(bullets.get(i).getX() - bulletsEnemy.get(j).getX()),2) + Math.pow(bullets.get(i).getY() - bulletsEnemy.get(j).getY(),2)) < 10

我認為您應該閱讀有關碰撞檢測和幾何的基礎知識。 只有兩個可能的信息點:

一個簡單的代碼示例:

https://zetcode.com/javagames/collision/

圓形交點:

https://www.geeksforgeeks.org/check-two-given-circles-touch-intersect/

關於子彈的移除,我假設你有某種游戲循環,在其中你經常繪制子彈並計算碰撞(調用 bulletsHit 方法):

我會做一個假設讓事情變得更簡單:你的子彈的移動速度不超過每個循環一個像素。 否則我認為你需要注意你的循環圈時間並計算所有元素的位置,還要注意不會在一個循環圈中相交的項目符號,因為它們可能已經從一個循環圈經過到下一個循環圈. 我對游戲開發不熟悉,所以也許還有更多內容要介紹。

關於這一點,你應該改變一些事情:

  1. hitByBullet() 方法每次調用只會返回一次碰撞。 您可以將 collidedBullets 存儲在兩個集合中,並在將它們從 bullets 和 bulletsEnemy 列表中刪除后清除這些臨時集合。

  2. 我不明白你在用“this”做什么以及你的 hitByBullet 結果。

我會這樣做

public void hitByBullet(){
  for(int i=0; i<bullets.size(); i++){
   for(int j= 0;j< bulletsEnemy.size(); j++){
      if( Math.sqrt(Math.pow(bullets.get(i).getX() - bulletsEnemy.get(j).getX()),2) + Math.pow(bullets.get(i).getY() - bulletsEnemy.get(j).getY(),2)) < 10){ 
         bulletsToDelete.add(bullets.get(i));
         bulletsEnemyToDelete.add(bulletsEnemy.get(j));
       }
     }
   }
}

public boolean bulletsHit(){
   hitByBullet();
   bulletsToDelete.forEach(bullet -> bullets.remove(bullet);
   bulletsEnemyToDelete.forEach(bullet -> bulletsEnemy.remove(bullet);
   boolean bulletsHit = !bulletsToDelete.isEmpty();
   bulletsToDelete.clear();
   bulletsEnemyToDelete.clear();
   return bulletsHit;
}

正如我之前提到的,您應該改進很多事情:

  • 代碼的一般結構
  • 你的方法的命名(例如 bulletsHit 聽起來像是只檢查子彈是否被擊中但你也正在刪除它們)
  • 雙重檢查子彈

你好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM