2014-01-25 138 views
0

当我的角色死亡时,我想要在游戏结束屏幕上点击“重新启动”时删除所有敌人。但重新开始时场上总会留下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上运行。

如果需要进一步补充,请告诉我。

回答

2

我觉得这是你的问题:

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

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

尝试用enemies.remove(0)代替enemies.remove(i)。或者,假设enemiesCollection,为什么不只是做enemies.clear();

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); 
} 

的情况下,你需要它。

0

作为'enimies.size()'的for循环的终止值将会出现问题,因为每次循环运行时都会对其进行评估。由于循环使得尺寸变小,每当我增加1时终止值减少一次,本质上使循环终止两倍于'enimies.size()'值没有变化时的终止值。因此,最好使用不变的值作为循环终止值。其他答案提供足够的信息来解决错误,但这只是未来的额外提示。