【问题标题】:Java LibGDX ArrayList<Rectangle> Can't get Collision workingJava LibGDX ArrayList<Rectangle> 不能让碰撞工作
【发布时间】:2014-03-07 02:30:53
【问题描述】:

首先我想说我的英语不是很好,而且我是一个初学者。所以放轻松点: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;
        }

这就是我的代码。希望我没有忘记提及一些事情。希望有人可以帮助我解决这个问题。也正如我在编程初学者之前所说的,所以我可能只是在游戏逻辑上犯了一个愚蠢的失败......

【问题讨论】:

  • 我也尝试了 System.out.println 这个循环,它返回了我(只要我能说出正确的值。(x,y,w,h) 0.0,-44.0, 90.0,84.0等等..
  • 我建议使用 Box2D(包含在 libgdx 中)为您处理碰撞,而不是编写自己的碰撞处理。碰撞处理是一个解决了一百次的问题,只有当你的程序需要一些超出规范的东西时,你才应该重新解决它
  • 好的,谢谢...我会检查 Box2D。但是,您或其他人是否注意到另一个错字或只是代码失败?只是想知道为什么它不起作用......
  • @MartinCarney 您也可以使用overlaps 方法处理普通 libgdx 中的简单碰撞,无需为此添加 Box2D
  • @user3389464 你的播放器是Sprite 吗?

标签: java arraylist libgdx collision


【解决方案1】:

就您的碰撞逻辑而言,您正在为每个矩形更改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 包含您应该使用的可靠碰撞检测代码,而不是编写自己的碰撞检测代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多