Java LibGDX ArrayList <rectangle>无法使Collision正常工作</rectangle>

时间:2014-03-06 18:03:28

标签: java arraylist libgdx collision

首先,我想说我的英语不是那么好,而且我是初学程序员。所以请跟我一起轻松: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;
        }

这就是我的代码。我真的很遗憾地提到了一些事情。希望有人可以帮助我解决这个问题。也像我之前说的那样,我是编程的初学者,所以我可能只是在游戏逻辑中愚蠢失败......

1 个答案:

答案 0 :(得分:0)

就碰撞逻辑而言,无论先前的碰撞检查如何,您都要为每个矩形更改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;
    }
}

这样,您可以假设它们可以在给定方向上移动,任何阻挡该方向的矩形都会阻止该方向的移动。

编辑:我也调查了你的条件,看起来播放器右边的任何矩形都会阻止它们向左移动,而不仅仅是一个右侧靠近播放器左侧的矩形。更好的比较是玩家和矩形的半宽和半高之间的差异。 This article可以详细解释原因。

就更大的情况而言,我在评论中提到碰撞检测已经多次编写,并且libgdx包含您应该使用的实体碰撞检测代码,而不是编写自己的碰撞检测代码。