在搜索了大量网站(包括此网站)之后,我遇到的每个解决方案似乎都无效,或者只处理列表中的第一个对象。
问题
Slick2Ds Rectangle类提供了许多不同的碰撞方法,一种是intersects(Rectangle box);
方法,可以在将此类与ArrayList类中构建的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;
}
}
键:xx =播放器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
答案 0 :(得分:0)
尝试删除所有休息时间。 因为如果它找到了交叉点,它就会突破循环。
答案 1 :(得分:0)
使用时会发生什么:
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;
}
}