[英]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;
}
这就是我的代码。 希望我没有忘记提些什么。 希望有人可以帮助我解决这个问题。 也就像我在编程初学者之前说过的那样,所以我可能在游戏逻辑方面只是一个愚蠢的失败...
就您的碰撞逻辑而言,无论先前的碰撞检查如何,您都将为每个矩形更改canGoRight
和canGoLeft
。 这意味着实际上,列表中的最后一个矩形是唯一一个检查碰撞的矩形。
要解决该问题,您需要将其更改为这样(我刚刚在条件中添加了!,您应该对它们进行重新处理,而不仅仅是反转最终结果):
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.