当我的角色死亡时,当我点击游戏结束屏幕上的“重启”时,我希望删除所有敌人。但重启时场上总会留下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上运行。
如果需要进一步的表述,请告诉我。
答案 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)
。或者,假设enemies
是Collection
,为什么不执行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()'值没有变化时的两倍。因此,最好将非变化值用作循环终止值。其他答案提供足够的信息来修复错误,但这只是未来的额外提示。