[英]How do you make Java JLabel show on JFrame after JFrame content is removed, revalidated, and repainted?
[英]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 方法):
我會做一個假設讓事情變得更簡單:你的子彈的移動速度不超過每個循環一個像素。 否則我認為你需要注意你的循環圈時間並計算所有元素的位置,還要注意不會在一個循環圈中相交的項目符號,因為它們可能已經從一個循環圈經過到下一個循環圈. 我對游戲開發不熟悉,所以也許還有更多內容要介紹。
關於這一點,你應該改變一些事情:
hitByBullet() 方法每次調用只會返回一次碰撞。 您可以將 collidedBullets 存儲在兩個集合中,並在將它們從 bullets 和 bulletsEnemy 列表中刪除后清除這些臨時集合。
我不明白你在用“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;
}
正如我之前提到的,您應該改進很多事情:
你好
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.