【发布时间】: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