作为序言,我搜索了论坛,但没有发现与我的具体情况有关的信息。我大约一个星期前才开始学习Java,这是我首次涉足面向对象编程。
我正在开发一个基本游戏(在机制方面,想像太空入侵者)。我有一个“投射物”类,一个“ FallingThings”类(这是我为掉落的对象(金钱,朋友,敌人)所拥有的类的父类)。射击的每个射弹都存储在ArrayList中,Money,Friend和Enemy的每个实例也存储在它们各自的ArrayList中。
当我实现碰撞检测时,就会发生问题。首先,它需要多个子弹才能使碰撞机制起作用(我想我在这里可能只是弄乱了一些数字,但我不确定100%)。现在,有时在我发射多发子弹(并且它们早已消失)之后,无需我再发射另一颗子弹就可以检测到碰撞,并且FallingThings对象从屏幕上消失了。同样,在其他时间,多个对象会一次消失。最奇怪的是,所有这些都是不一致的,并且并非总是以相同的方式再现。但是,我与玩家角色的碰撞效果很好。
有人对我该如何解决这个问题有一些想法吗?我的代码如下:
“ FallingThings”类中的方法(ArrayLists在StartingClass(主类)中定义)。
public void checkBulletCollision(Rectangle rectangle) {
for (int j = 0; j < Character.getProjectiles().size(); j++) {
Projectile p = (Projectile) Character.getProjectiles().get(j);
if (p.isVisible() == true) {
for (int i = 0; i < StartingClass.getMoneys().size(); i++) {
Money m = (Money) StartingClass.getMoneys().get(i);
if (m.getR().intersects(rectangle)) {
m.remove(i);
System.out.println("bullet collision");
}
}
for (int i = 0; i < StartingClass.getEnemies().size(); i++) {
Enemy e = (Enemy) StartingClass.getEnemies().get(i);
if (e.getR().intersects(rectangle)) {
e.remove(i);
}
}
for (int i = 0; i < StartingClass.getFriends().size(); i++) {
Friend f = (Friend) StartingClass.getFriends().get(i);
if (f.getR().intersects(rectangle)) {
f.remove(i);
}
}
}
}
}
我的弹丸更新方法:
public void update() {
y -= speedY;
if (y < 0) {
visible = false;
}
rectangle.setBounds(getRectangle());
}
我整天都在尝试解决此问题,但仍然无法正确实施。我曾尝试使用ListIterator,但这导致程序冻结并引发类型转换错误。
非常感谢你的帮助! =)
最佳答案
我怀疑您遇到了问题,因为在遍历该列表时正在按索引从列表中删除项目。删除项目会导致索引计数器失去控制。尝试使用实际的Iterator
。甚至无需考虑索引。 Iterator
具有针对这些情况的remove方法。
Iterator<Enemy> iterator = StartingClass.getEnemies().iterator();
while (iterator.hasNext()) {
Enemy e = iterator.next();
if (e.getR().intersects(rectangle)) {
iterator.remove();
}
}