当前位置: 首页 > 知识库问答 >
问题:

数组列表错误

吴缪文
2023-03-14

嗨,我正在做一个类似太空入侵者的游戏,当一颗子弹与敌人相撞时,我遇到了一个问题。代码如下:

for (int i = 0; i < enemies.size(); i++) {
    for (int j = 0; j < bullets.size(); j++) {
        if (collidesWith(bullets.get(j), enemies.get(i))) { //Line 81 The Error Occurred here
            enemies.remove(i);
            bullets.remove(j);
            addScore(1);
        }
    }
}

碰撞代码:

public static boolean collidesWith(Entity collider, Entity collided) {
    Rectangle hitBox1 = collider.getHitbox();
    Rectangle hitBox2 = collided.getHitbox();

    return hitBox1.intersects(hitBox2);
}

Hitbox的代码:

@Override
public Rectangle getHitbox() {
    return new Rectangle(getX(), getY(), getWidth(), getHeight());
}

错误消息:

Exception in thread "Thread-4" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
at java.util.ArrayList.rangeCheck(ArrayList.java:635)
at java.util.ArrayList.get(ArrayList.java:411)
at io.github.kjordo711.game.Main.run(Main.java:81)
at java.lang.Thread.run(Thread.java:724)

我认为2发或更多子弹击中敌人造成的错误

玩家可以一次射出太多的子弹,如果他们保持空间,子弹将继续射出而不会延迟。我可以限制子弹的生成,但问题是即使屏幕上最多有10颗子弹,错误仍然会发生,我尝试用

Thread.sleep(500);

但它只是睡了所有的游戏线程

共有3个答案

侯博易
2023-03-14

我会回答你对第二个问题的担忧:使用Thread.sleep(...)会阻止当前的线程,这可能是美国东部时间,冻结你的整个游戏。如果你想避免发射太多子弹,你应该使用System.currentTimeMillis()为每个Space击键,并将其与最后一个真正发射子弹的击键进行比较:

static final int RECOIL = 500; // Minimum ms to wait between two shots
long lastShotMs = 0;

void fireBullet() { // Called when spacebar is pressed
    long shotMs = System.currentTimeMillis();
    if (shotMs - lastShotMs < RECOIL)
        return;
    lastShotMs = shotMs;
    doFireBullet(); // Perform the bullet-firing
}
戈华茂
2023-03-14

问题是您删除了嵌套循环中的对象。一旦你在i移除了一个敌人,敌人名单就会缩短一个。如果i恰好等于敌人的旧长度,则后续调用敌人。get(i)将导致异常。由于内部循环不重新检查i,因此可能出现这种情况。为此添加一个保护并向后迭代(当项目可以在执行过程中删除时所做的操作)应注意异常并避免跳过删除时的冲突检查:

for (int i = enemies.size()-1 ; i >= 0 ; i--) {
    for (int j = bullets.size()-1 ; j >= 0 && i < enemies.size() ; j--) {
        if (collidesWith(bullets.get(j), enemies.get(i))) {
            enemies.remove(i);
            bullets.remove(j);
            addScore(1);
        }
    }
}
轩辕天佑
2023-03-14

这是因为您正在删除循环中的对象,这是不正确的,并且除了ArrayIndexOutOfBoundsExc0019之外,这也会导致ConnettModificationExcture。

当你想从集合中移除一个对象时,考虑使用<代码> java。util。迭代器接口。

Iterator<Enemy> enemiesIterator = enemies.iterator();
Iterator<Entity> bulletsIterator = bullets.iterator();
while (enemiesIterator.hasNext()) {
    Enemy nextEnemy = enemiesIterator.next();
    while(bulletsIterator.hasNext()) {
        Entity nextBullet = bulletsIterator.next();
        if (colliesWith(nextBullet, nextEnemy) {
            enemierIterator.remove();
            bulletsIterator.remove();
            addScore(1);
        }
    }
}
 类似资料:
  • 在有趣的功能中,当我将列表添加到其他列表时,它正在添加空列表,我可以找到原因有人可以帮助我这个程序是关于查找给定数组的不同组合

  • 有人能向我解释下一行代码会发生什么以及它为什么有效吗? 上面的代码工作正常。它将数组转换为列表,然后添加另一个元素。但是下面的代码不起作用 上面的代码给了我以下错误:线程“main”java.lang.UnsupportedOperationException有人能告诉我这两个转换之间的区别吗?为什么只有第一个转换有效??提前谢谢

  • 我想在Sokoban游戏中保存我的玩家角色的步骤。首先我想用字符的实际位置填充一个int x和y的数组,称为“pos”。然后我想将这个数组添加到数组的ArrayList中,称为“moves”。 一个玩家位置的阵列: ArrayList为所有步骤,玩家在关卡: 如果将“int[]”放在ArrayList的尖括号内,则会出错。 如何将阵列位置添加到ArrayList移动?

  • 我有一个arraylist的arraylist,每个arraylist都有相同的点,例如,当您打印时,这是输出 在打印之前,我要删除其x值不等于数组列表索引的所有点 所以输出应该是 我尝试使用remove方法和for循环以及其他方法,但都不起作用。 有人能帮忙吗?

  • 我正在尝试开发一个程序,通过将甲板分成两个然后交错来洗牌甲板。 Class Deck代表52张牌的一副牌。有两种方法:Deck(int n)和Card drawCard()。 Deck(int n)是构造函数。该参数告诉牌组应该洗牌多少轮。在每轮洗牌中,整个甲板首先被分成两个子甲板。副甲板然后交错成一整层甲板。 一些注意事项: > 为了简化讨论,我们假设卡片是1,2,…,10。 Card draw

  • 限定成员类型的数组列表 如果成员类型不正确,会抛出\InvalidArgumentException异常 class TestModel { public $id; public $name; public function __construct($id, $name) { $this->id = $id; $this->nam