簡體   English   中英

Java碰撞秋千從側面無法正常工作

[英]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

當我測試我的應用程序時,當我從側面擊打集團時,球會執行不同的動作。 它通過整個集團,因此它的命中次數是無限的,所以我認為這就是為什么集團立即消失的原因,所以我的問題是:當我從側面擊打集團時,為什么我沒有得到反彈?

嗯,我又看了一下您的代碼,可能發現了錯誤(調試應確認這一點):您的情況似乎正在檢查球是否在障礙物之外

假設BallBloc是擺動分量,則坐標0/0表示左上角,因此正y向下。

因此,塊的邊緣可以部分定義為

  • 頂部:block.y
  • 底部:block.y + block.height
  • 左:block.x
  • 右:block.x + block.width

現在,讓我們可視化您的條件,該條件僅在球和塊的邊界相交時才適用:

  1. “以下”:ball.y <= block.y + bloc.height
  2. “上方”:ball.y + ball.height> = block.y
  3. “左”:ball.x + ball.width <= block.x
  4. “右”:ball.x> = block.x + block.width

為簡單起見,我們假設球只是一個點,即with和height為1。因此,我們將忽略球的大小,僅使用其位置(無論如何代表球的像素)並簡化方程式(可能是減少1 btw):

  1. “以下”:ball.y <= block.y + bloc.height
  2. “上方”:ball.y> = block.y
  3. “左”:ball.x <= block.x
  4. “右”:ball.x> = block.x + block.height

現在,讓我們用一些箭頭可視化它們,以指出它們將在哪里正確:

   +----------+  ---
   |          |   | (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.

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