游戏没有正确重置

时间:2014-01-25 04:05:07

标签: java android

当我的角色死亡时,当我点击游戏结束屏幕上的“重启”时,我希望删除所有敌人。但重启时场上总会留下1-2个敌人,我真的不明白。

这是我的重置代码:

public void resetStats() {
    for (int i = 0; i < enemies.size(); i++) {
        enemies.remove(i);
    }
    System.out.print("ENEMIES: " + enemies.size());
    enemyCounter = 0;
    nbrOfEnemiesKilled = 0;
    spawnEnemyTimer = 0;
    score.setScore(0);
    bulletsFired = 0;
    nbrOfBullets = 100;
}

当我在游戏结束屏幕上按“重启”按钮时,会调用此方法。除了留在屏幕上的敌人外,一切都会被正确重置。 我使用游戏状态,游戏只在gameState=GAMEPLAY期间更新,当我的角色死亡时,我设置gameState=GAMEOVERSCREEN,这会调出屏幕。由于我没有在UI线程上运行我的游戏结束屏幕,所以这一切都发生在后台,但是在这种情况下剩余的角色将来回跳跃几个像素。

我不知道如何在UI线程上运行我的屏幕,因为我实时从View Class调用它。

我尝试在进入新游戏状态之前删除敌人,但这也无法解决问题。我迷路了。我应该在UI线程上运行我的屏幕并在此状态下使用我的游戏循环吗?我将如何从视图类中执行此操作,因为我需要Context在Ui-thread上运行。

如果需要进一步的表述,请告诉我。

3 个答案:

答案 0 :(得分:2)

我认为这是你的问题:

for (int i = 0; i < enemies.size(); i++) {
    enemies.remove(i);
}

假设你剩下3个敌人。循环从0开始并移除第一个敌人。现在你在索引0和1处留下了2个敌人。i的值现在是1,所以你可以移除1个敌人。现在你有1个敌人留在索引0但i的值是2,所以Collection还剩下1个敌人。

尝试将enemies.remove(i)替换为enemies.remove(0)。或者,假设enemiesCollection,为什么不执行enemies.clear();

答案 1 :(得分:0)

变量i总是递增,而enemies.size()总是递减(通过删除它):

for (int i = 0; i < enemies.size(); i++) {
    enemies.remove(i);
}

所以,如果你有5个敌人[0,1,2,3,4],它就会这样:

[0, 1, 2, 3, 4]
remove(0)
[1, 2, 3, 4]
remove(1)
[1, 3, 4]
remove(2)
[1, 3]

就是这样,因为i = 3不再小于enemies.size() = 2了!

编辑:如上所述enemies.clear()应该做或使用

while (enemies.size() > 0)
{
    enemies.remove(0);
}

万一你需要它。

答案 2 :(得分:0)

for循环的终止值为'enimies.size()'将是有问题的,因为每次循环运行时都会对此进行求值。由于循环使得大小变小,每次i增加1时终止值减1,从而基本上使循环终止的速度是'enimies.size()'值没有变化时的两倍。因此,最好将非变化值用作循环终止值。其他答案提供足够的信息来修复错误,但这只是未来的额外提示。