簡體   English   中英

Java LibGDX ArrayList <Rectangle> 無法使碰撞工作

[英]Java LibGDX ArrayList<Rectangle> Can't get Collision working

首先,我想說我的英語不好,而且我是一名初學者。 所以放輕松我:L

因此,我正在制作一個隨機生成地面的2D游戲。 它是由塊組成的...我首先要做的是創建塊,然后將它們添加到Rectangle ArrayList中。 塊正確渲染。 但是當玩家擊中它們時,它們不會發生任何碰撞。

目前,碰撞根本不起作用。 當我按D鍵(右)時,播放器向右跑,忽略了碰撞。 當我按A(左)時,播放器完全不移動。

首先,我創建此ArrayList:

static ArrayList<Rectangle> BlockArray = new ArrayList<Rectangle>();

然后在for循環中將其X,Y,Width,Height ...值賦給塊,然后將它們添加到列表中,如下所示:

BlockArray.add(Block[i]);

然后在播放器類中,每個渲染循環都運行此函數。 它應該告訴玩家是否可以向左或向右移動...:

ArrayList<Rectangle> rects = WorldGenerator.BlockArray;
        for(int i = 0; i < rects.size(); i++) {
            // LEFT
            if(player.x >= rects.get(i).getX() + rects.get(i).getWidth() && player.y >= rects.get(i).getY() + rects.get(i).getHeight()){
                canGoLeft = true;
            }
            else{
                canGoLeft = false;
            }

            // RIGHT
            if(player.x <= rects.get(i).getX() && player.y >= rects.get(i).getY() + rects.get(i).getHeight()){
                canGoRight = true;
            }
            else{
                canGoRight = false;
            }
        }

最后,當用戶輸入內容時,它會檢查這些布爾值是否正確:

if (Gdx.input.isKeyPressed(Keys.A) && canGoLeft == true){
            player.x -= delta * 350f;
        }
        if (Gdx.input.isKeyPressed(Keys.D) && canGoRight == true){
            player.x += delta * 350f;
        }

這就是我的代碼。 希望我沒有忘記提些什么。 希望有人可以幫助我解決這個問題。 也就像我在編程初學者之前說過的那樣,所以我可能在游戲邏輯方面只是一個愚蠢的失敗...

就您的碰撞邏輯而言,無論先前的碰撞檢查如何,您都將為每個矩形更改canGoRightcanGoLeft 這意味着實際上,列表中的最后一個矩形是唯一一個檢查碰撞的矩形。

要解決該問題,您需要將其更改為這樣(我剛剛在條件中添加了!,您應該對它們進行重新處理,而不僅僅是反轉最終結果):

ArrayList<Rectangle> rects = WorldGenerator.BlockArray;

canGoLeft = true;
canGoRight = true;
for(int i = 0; i < rects.size(); i++) {
    // LEFT
    if(!(player.x >= rects.get(i).getX() + rects.get(i).getWidth() && player.y >= rects.get(i).getY() + rects.get(i).getHeight())) {
        canGoLeft = false;
    }

    // RIGHT
    if(!(player.x <= rects.get(i).getX() && player.y >= rects.get(i).getY() + rects.get(i).getHeight())) {
        canGoRight = false;
    }
}

這樣,您假設它們可以沿給定方向移動,並且任何會阻塞該方向的矩形都將阻止該方向的移動。

編輯:我也調查了您的情況,看起來播放器右側的任何矩形都將阻止它們向左移動,而不僅僅是其右側向上與播放器左側相對的矩形。 更好的比較是播放器和矩形的半角與半角之間的差異。 本文可以詳細解釋原因。

就更大的前景而言,我在一條評論中提到沖突檢測已經編寫了很多次,並且libgdx包含您應該使用的可靠沖突檢測代碼,而不是編寫自己的沖突檢測代碼。

暫無
暫無

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

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