首先,我想说我的英语不是那么好,而且我是初学程序员。所以请跟我一起轻松: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;
}
这就是我的代码。我真的很遗憾地提到了一些事情。希望有人可以帮助我解决这个问题。也像我之前说的那样,我是编程的初学者,所以我可能只是在游戏逻辑中愚蠢失败......
答案 0 :(得分:0)
就碰撞逻辑而言,无论先前的碰撞检查如何,您都要为每个矩形更改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;
}
}
这样,您可以假设它们可以在给定方向上移动,任何阻挡该方向的矩形都会阻止该方向的移动。
编辑:我也调查了你的条件,看起来播放器右边的任何矩形都会阻止它们向左移动,而不仅仅是一个右侧靠近播放器左侧的矩形。更好的比较是玩家和矩形的半宽和半高之间的差异。 This article可以详细解释原因。就更大的情况而言,我在评论中提到碰撞检测已经多次编写,并且libgdx包含您应该使用的实体碰撞检测代码,而不是编写自己的碰撞检测代码。