Java - 检查 ArrayList 中多个矩形之间的碰撞
Java - Checking Colisions Between Multiple Rectangles in an ArrayList
在搜索了大量站点(包括这个站点)之后,我遇到的每个解决方案似乎都不起作用,或者只适用于列表中的第一个对象。
问题
Slick2Ds Rectangle class 提供了许多不同的碰撞方法,其中一种是 intersects(Rectangle box);
方法,当使用此 class 与 ArrayList [=39 中内置的 javas 结合使用时可以正确检测碰撞=],在某种程度上。我遇到的问题是只有列表中的第一个对象被检测到并正确碰撞。
以下代码处理冲突:
public void move(float x, float y) {
if (blocks.size() > 0) {
for (int i = 0; i < blocks.size(); i++) {
Rectangle r = blocks.get(i);
Rectangle p = new Rectangle(xx + x, yy + y, 32, 32);
if (!r.intersects(p)) {
xp = xx;
yp = yy;
xx += x;
yy += y;
break;
} else {
xx = xp;
yy = yp;
xx += 0;
yy += 0;
System.out.println("Collide" + new Date());
break;
}
}
}else{
xp = xx;
yp = yy;
xx += x;
yy += y;
}
}
Key: xx = Player x; yy = 玩家 y; xp = 玩家最后 x 位置; yp = 玩家最后 y 位置; r = 迭代列表中的当前矩形; p = 预先计算出玩家的下一个位置
这个基本代码工作是通过模拟一个矩形来添加运动,该矩形将位于玩家的下一个位置。如果它没有碰撞那么玩家就不会碰撞并且我们可以移动,但是如果它确实碰撞那么我们不会移动玩家因为下一个位置没有打开。
但是代码有一个缺陷,因为在迭代过程中的某个时刻只有 第一个 框起作用,其他检测碰撞但不会停止框。
Correct Collision; logged in the console to confirm
Incorrect Collision; not logged in the console, even though its another instance of the same object
尝试删除所有中断。
因为无论是否找到相交,它都会跳出循环。
如果你使用会发生什么:
public void move(float x, float y) {
boolean intersectedBlock = false;
for (int i = 0; i < blocks.size(); i++) {
Rectangle r = blocks.get(i);
Rectangle p = new Rectangle(xx + x, yy + y, 32, 32);
if (r.intersects(p)) {
intersectedBlock = true;
break;
}
}
if (intersectedBlock) {
xx = xp;
yy = yp;
xx += 0;
yy += 0;
System.out.println("Collide" + new Date());
} else {
xp = xx;
yp = yy;
xx += x;
yy += y;
}
}
在搜索了大量站点(包括这个站点)之后,我遇到的每个解决方案似乎都不起作用,或者只适用于列表中的第一个对象。
问题
Slick2Ds Rectangle class 提供了许多不同的碰撞方法,其中一种是 intersects(Rectangle box);
方法,当使用此 class 与 ArrayList [=39 中内置的 javas 结合使用时可以正确检测碰撞=],在某种程度上。我遇到的问题是只有列表中的第一个对象被检测到并正确碰撞。
以下代码处理冲突:
public void move(float x, float y) {
if (blocks.size() > 0) {
for (int i = 0; i < blocks.size(); i++) {
Rectangle r = blocks.get(i);
Rectangle p = new Rectangle(xx + x, yy + y, 32, 32);
if (!r.intersects(p)) {
xp = xx;
yp = yy;
xx += x;
yy += y;
break;
} else {
xx = xp;
yy = yp;
xx += 0;
yy += 0;
System.out.println("Collide" + new Date());
break;
}
}
}else{
xp = xx;
yp = yy;
xx += x;
yy += y;
}
}
Key: xx = Player x; yy = 玩家 y; xp = 玩家最后 x 位置; yp = 玩家最后 y 位置; r = 迭代列表中的当前矩形; p = 预先计算出玩家的下一个位置
这个基本代码工作是通过模拟一个矩形来添加运动,该矩形将位于玩家的下一个位置。如果它没有碰撞那么玩家就不会碰撞并且我们可以移动,但是如果它确实碰撞那么我们不会移动玩家因为下一个位置没有打开。
但是代码有一个缺陷,因为在迭代过程中的某个时刻只有 第一个 框起作用,其他检测碰撞但不会停止框。
Correct Collision; logged in the console to confirm
Incorrect Collision; not logged in the console, even though its another instance of the same object
尝试删除所有中断。 因为无论是否找到相交,它都会跳出循环。
如果你使用会发生什么:
public void move(float x, float y) {
boolean intersectedBlock = false;
for (int i = 0; i < blocks.size(); i++) {
Rectangle r = blocks.get(i);
Rectangle p = new Rectangle(xx + x, yy + y, 32, 32);
if (r.intersects(p)) {
intersectedBlock = true;
break;
}
}
if (intersectedBlock) {
xx = xp;
yy = yp;
xx += 0;
yy += 0;
System.out.println("Collide" + new Date());
} else {
xp = xx;
yp = yy;
xx += x;
yy += y;
}
}