[英]Java collision swing not working from the sides
我在做Java游戲,例如打磚塊。 我已經有碰撞檢測。 但是,現在我想銷毀某些集團,如果它們的HP等於0。如果我觸摸我的集團上下或以上,效果很好,每個球將1 HP提升到集團。 但是,如果我從左側或右側觸摸該集團,則盡管HP離開,該集團也會被摧毀。
每次我碰到一個球團,我都會檢查球與球團相比的位置。 但是對於左右,我不明白為什么它不起作用。
我也不確定銷毀集團的方式。我的意思是,我將所有集團存儲在地圖中。 我得到了我的集團的當前浪潮(如此行)。 然后,我將參數中給出的塊與該行的所有塊進行比較。 那正確嗎 ?
for (Ball ball : ballList) {
for (List<Bloc> wave : mapBlocs.values()) {
for (Bloc bloc : wave) {
if (ball.getBounds().intersects(bloc.getBounds())) {
if (ball.getPosY() <= bloc.getPosY() + bloc.getHeight()) {
ball.setVelocityY(-ball.getVelocityY());
ball.setPosY(ball.getPosY() + ball.getVelocityY());
bloc.setHardness(bloc.getHardness() - 1);
System.out.println("below");
} else if (ball.getPosY() + ball.getHeight() >= bloc.getPosY()) {
ball.setVelocityY(-ball.getVelocityY());
ball.setPosY(ball.getPosY() + ball.getVelocityY());
bloc.setHardness(bloc.getHardness() - 1);
System.out.println("above");
} else if (ball.getPosX() + ball.getWidth() <= bloc.getPosX()) {
ball.setVelocityX(-ball.getVelocityX());
ball.setPosX(ball.getPosX() + ball.getVelocityX());
bloc.setHardness(bloc.getHardness() - 1);
System.out.println(bloc.getHardness());
System.out.println("left");
} else if (ball.getPosX() >= bloc.getPosX() + bloc.getWidth()) {
ball.setVelocityX(-ball.getVelocityX());
ball.setPosX(ball.getPosX() + ball.getVelocityX());
bloc.setHardness(bloc.getHardness() - 1);
System.out.println(bloc.getHardness());
System.out.println("right");
}
if (bloc.getHardness() == 0) {
destroyBlocs(bloc);
}
}
}
而我的方法destroyBlocs:
private void destroyBlocs(Bloc bloc) {
List<Bloc> list = mapBlocs.get(bloc.getWaveNumber());
for (Bloc a : list) {
if (a.equals(bloc)) {
list.remove(bloc);
}
}
}
我該如何解決? 並預先感謝您!
@UPDATE
當我測試我的應用程序時,當我從側面擊打集團時,球會執行不同的動作。 它通過整個集團,因此它的命中次數是無限的,所以我認為這就是為什么集團立即消失的原因,所以我的問題是:當我從側面擊打集團時,為什么我沒有得到反彈?
嗯,我又看了一下您的代碼,可能發現了錯誤(調試應確認這一點):您的情況似乎正在檢查球是否在障礙物之外 。
假設Ball
和Bloc
是擺動分量,則坐標0/0表示左上角,因此正y向下。
因此,塊的邊緣可以部分定義為
現在,讓我們可視化您的條件,該條件僅在球和塊的邊界相交時才適用:
為簡單起見,我們假設球只是一個點,即with和height為1。因此,我們將忽略球的大小,僅使用其位置(無論如何代表球的像素)並簡化方程式(可能是減少1 btw):
現在,讓我們用一些箭頭可視化它們,以指出它們將在哪里正確:
+----------+ ---
| | | (2)
| Block | V ^
| | | (1)
+----------+ ---
<--| |-->
(3) (4)
現在的主要問題是,您正在按順序檢查這些條件。 如果球從側面擊中障礙物會怎樣? 條件1很可能已經為真,您只需更改y條件。 如果它仍然在塊內,則條件1或2仍然為真,並且您可以將y條件改回。
但是,條件3和4也存在問題:
由於檢查了相交點,因此,如果球正確位於左邊緣,則原始條件3可能為true,這可能根本不會命中。 如果再正確一些,條件將不再成立。
讓我們以一個寬度為5的球和一個x位置為10的塊ball.x + ball.width <= block.x
。您的條件ball.x + ball.width <= block.x
因此將是ball.x + 5 <= 10
。 這僅對ball.x <= 5成立。但是,對於任何ball.x <5,您將獲得9或更小的右邊界,這意味着它不與塊相交。
條件4相似:假設塊的寬度為20,x位置為10。因此ball.x >= block.x + block.width
變為ball.x >= 30
(10 + 20)。 這意味着只有當球的x位置正好為30時,這才是正確的,但這並不意味着相交。
在檢查@Thomas解釋后,我得到了以下解決方案:
if (ball.getVelocityX() > 0) {
if (ball.getPosX() < bloc.getPosX()) {
ball.setVelocityX(-ball.getVelocityX());
ball.setPosX(ball.getPosX() + ball.getVelocityX());
bloc.setHardness(bloc.getHardness() - 1);
// left hit
} else {
ball.setVelocityY(-ball.getVelocityY());
ball.setPosY(ball.getPosY() + ball.getVelocityY());
bloc.setHardness(bloc.getHardness() - 1);
// below hit
}
} else {
if (ball.getPosX() < bloc.getPosX() + bloc.getWidth()) {
ball.setVelocityY(-ball.getVelocityY());
ball.setPosY(ball.getPosY() + ball.getVelocityY());
bloc.setHardness(bloc.getHardness() - 1);
// above hit
} else {
ball.setVelocityX(-ball.getVelocityX());
ball.setPosX(ball.getPosX() + ball.getVelocityX());
bloc.setHardness(bloc.getHardness() - 1);
// right hit
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.