Java LibGDX ArrayList<;矩形>;Can';我不能让碰撞发生

Java LibGDX ArrayList<;矩形>;Can';我不能让碰撞发生,java,arraylist,libgdx,collision,Java,Arraylist,Libgdx,Collision,首先,我想说我的英语不是很好,我是一个初学者程序员。所以对我放松点:我 所以我在做一个2D游戏,地面是随机生成的。它是用砖块做的。。。 我首先创建块,然后将它们添加到矩形ArrayList中。块渲染正确。但当玩家击中它们时,它们不会受到任何碰撞 此时,碰撞根本不起作用。当我按下D键(右键)时,玩家向右跑,完全忽略碰撞。当我按下一个(左)播放器时,一点也不移动 首先,我创建这个ArrayList: static ArrayList<Rectangle> BlockArray = new

首先,我想说我的英语不是很好,我是一个初学者程序员。所以对我放松点:我

所以我在做一个2D游戏,地面是随机生成的。它是用砖块做的。。。 我首先创建块,然后将它们添加到矩形ArrayList中。块渲染正确。但当玩家击中它们时,它们不会受到任何碰撞

此时,碰撞根本不起作用。当我按下D键(右键)时,玩家向右跑,完全忽略碰撞。当我按下一个(左)播放器时,一点也不移动

首先,我创建这个ArrayList:

static ArrayList<Rectangle> BlockArray = new ArrayList<Rectangle>();
然后在player类中,我在每个渲染循环中运行这个函数。它应该告诉玩家是否可以向右或向左移动,或者没有移动…:

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;
            }
        }

这就是我的代码。我满怀希望地没有忘记提及一些事情。希望有人能帮我解决这个问题。正如我之前所说的,我是编程新手,所以我可能只是在游戏逻辑上有一个愚蠢的失败…

就您的冲突逻辑而言,您正在为每个矩形更改
canGoRight
canGoLeft
,而不考虑以前的冲突检查。这意味着,实际上,列表中的最后一个矩形是唯一被检查碰撞的矩形

要解决该问题,您需要将其更改为如下所示(我刚刚在条件中添加了一个!您应该对其进行返工,而不仅仅是反转最终结果):

ArrayList rects=WorldGenerator.BlockArray;
canGoLeft=真;
canGoRight=正确;
对于(int i=0;i=rects.get(i).getX()+rects.get(i).getWidth()&&player.y>=rects.get(i).getY()+rects.get(i).getHeight()){
canGoLeft=假;
}
//对
如果(!(player.x=rects.get(i).getY()+rects.get(i).getHeight()){
苍蝇灯=假;
}
}
通过这种方式,您假设它们可以在给定的方向上移动,任何阻挡该方向的矩形都会阻止该方向的移动

编辑:我还调查了你的情况,看起来玩家右边的任何矩形都会阻止他们向左移动,而不仅仅是一个右侧与玩家左侧相对的矩形。一个更好的比较是玩家和矩形的半宽半高之间的差异。可以详细解释原因


就大图而言,我在一篇评论中提到,碰撞检测已经编写了很多次,libgdx包含了您应该使用的可靠碰撞检测代码,而不是编写自己的碰撞检测代码。

我还尝试在这个循环中使用System.out.Print,它返回了我(只要我能说出正确的值。(x、y、w、h)0.0、-44.0、90.0、84.0等等..我建议使用Box2D(包含在libgdx中)为您处理冲突,而不是编写您自己的冲突处理。冲突处理是一个解决了上百次的问题,只有当您的程序需要一些远远超出正常范围的东西时,您才应该重新解决它。好的,谢谢……我将检查Box2D。但是您或其他人是否注意到另一个打字错误或只是代码中的一个错误?Ju我想知道为什么它不工作…@MartinCarney您也可以使用
overlaps
方法在普通libgdx中处理简单的冲突,不需要添加Box2D就可以了that@user3389464你的播放器是精灵吗?
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;
        }
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;
    }
}