在检测播放器与许多相同对象(在本例中为墙砖)之间的碰撞时,我遇到了一个问题。问题是我的程序仅在与 最后添加的 墙砖接触时才检测到碰撞。这是用java写的…
我正在使用矩形(它们的相交方法)来检测碰撞。
代码示例:
更新图块:
for (int i = 0; i < wallTileArr.size(); i++) { wallTile = wallTileArr.get(i); wallTile.update(p); if(wallTile.getBounds().intersects(Screen.getBounds())) { wallTile.draw = true; } else if(!wallTile.getBounds().intersects(Screen.getBounds())) { wallTile.draw = false; } }
这是我的课程,使墙从砖块中脱颖而出:
public Wall(int x, int y, int length, int dir, WallTile wallTile) { this.x = x; this.y = y; this.length = length; this.wallTile = wallTile; for(int i = 0; i < length; i++) { if (dir == 0) { Methods.addWallTile(new WallTile(x+(wallTile.size*i), y)); } else if (dir == 1) { Methods.addWallTile(new WallTile(x, y+(wallTile.size*i))); } else if (dir != 0 || dir != 1) { System.out.println("Error in setting direction: 0 = horizontal, 1 = vertical. Your input is: "+dir ); //Methods.Exit(1); } }
}
这是我的班级,使房间或房屋带有墙壁:
public HouseSmall_1(int x, int y,int size, int rotation, WallTile wallTile) { this.x = x; this.y = y; this.wallTile = wallTile; this.size = size; if (rotation == 0) { Methods.addWall(new Wall(x, y, size, 1, wallTile)); Methods.addWall(new Wall(x+(size*wallTile.size), y, size, 1, wallTile)); Methods.addWall(new Wall(x, y, size, 0, wallTile)); Methods.addWall(new Wall(x, y+(size*wallTile.size), (size)/2, 0, wallTile)); Methods.addWall(new Wall(x+wallTile.size+((size*wallTile.size)/2), y+(size*wallTile.size),(size/2), 0, wallTile)); }
将图块和墙壁添加到其arrayList中的代码:
public static void addWallTile(WallTile wallTile) { Controller.wallTileArr.add(wallTile); } public static void addWall(Wall wall) { Controller.wallArr.add(wall); }
在wallTile.java文件中更新碰撞的代码:
public void update(Player p) { x+=Screen.movementX; y+=Screen.movementY; if(getBounds().intersects(p.upGetBounds())) { p.walk = false; } else { p.walk = true; } }
为什么会这样呢?您如何建议我修复它?
欢迎索取更多代码示例!
if(getBounds().intersects(p.upGetBounds())) { p.walk = false; } else { p.walk = true; }
问题是此代码。您正在为每个不与播放器碰撞的图块重置标志,因此只有最后一个图块可以与播放器成功碰撞,并且不会重置标志。
即-假设有2个图块,并且#1正在碰撞而#2没有碰撞。
#1
#2
在循环的第一次迭代中-
#1 正在碰撞=> p.walk = false;
在循环的第二次迭代中-
#2 不冲突=> p.walk = true; //value has been reset.
//value has been reset.
但是,如果#2是一次冲突,则无法重置该标志。
要修复:删除else条款和重置 一次 到true 之前 的for循环。
else
true
for