gpt4 book ai didi

Java - 在另一个数组中使用数组(使用 LibGDX 的平台游戏)

转载 作者:行者123 更新时间:2023-12-02 06:06:58 25 4
gpt4 key购买 nike

我有 2 个数组列表,一个用于子弹,另一个用于敌人,两者都有各自的类别(“敌人”和“子弹”)。

我正在尝试进行碰撞检查,看看子弹是否击中了敌人,如果击中了,它会消除子弹和一些敌人的生命值。目前,如果屏幕上一次只有一颗子弹,则该方法可以完美运行,如果发射多颗子弹,一旦第一颗子弹击中敌人,就会出现“索引越界异常”并崩溃。这是我的代码:

private void checkBulletCollisions() {
int len = bullets.size();
int enemyLen = enemies.size();
for (int i = 0; i < len; i++) {
Bullet bullet = bullets.get(i);
for (int j = 0; j < enemyLen; j++) {

Enemy enemy = enemies.get(j);
if (bullet.bounds.overlaps(enemy.bounds)) {
bullets.remove(bullet);
enemy.health--;

if (enemy.health <= 0) {
enemies.remove(enemy);
break;
}
}
}
}

}

通过注释掉Bullets.remove行和敌人.health——,就没有错误了。

我猜测是因为当子弹被移除时,剩余子弹的索引会发生变化。我不确定问题是否出在代码顺序中的某个地方,或者是否需要完全不同的方法。感谢您的帮助

最佳答案

你是对的,问题是你从列表中删除了一个条目,而没有更新用于迭代条目的列表大小。例如,如果列表一开始为三个条目,并且您删除了一个条目,则只剩下两个条目。尽管如此,您还是尝试访问循环中的第三个条目。

一般来说,在 forforeach 循环迭代中修改列表并不是一个好主意。请改用 while 循环和 Iterator,如 this answer 中所述。 .

例如:

Iterator<Bullet> bulletIterator = bullets.iterator();
while (bulletIterator.hasNext()) {
Bullet bullet = bulletIterator.next();
Iterator<Enemy> enemyIterator = enemies.iterator();
while (enemyIterator.hasNext()) {
Enemy enemy = enemyIterator.next();
if (/* check if you have to remove the bullet */) {
bulletIterator.remove();
}
if (/* check if you have to remove the enemy */) {
enemyIterator.remove();
}
}
}

关于Java - 在另一个数组中使用数组(使用 LibGDX 的平台游戏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22197882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com