2014-01-25 4 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-потоке, поэтому остальные символы будут прыгать назад и вперед на несколько пикселей в этом состоянии.

Я не знаю, как tu запускать мои экраны в пользовательской строке, так как я называю это с View Class в режиме реального времени.

Я пробовал уничтожить врагов, прежде чем он войдет в новый игровой режим, но это также не устраняет проблему. Я потерялся. Должен ли я запускать свои экраны в пользовательском потоке и приостанавливать цикл игры в этом состоянии? Как мне сделать это из класса view, так как мне нужно Context для запуска в Ui-thread.

Если какое-либо дальнейшее объяснение требуется, сообщите мне.

ответ

2

Я думаю, что это ваша проблема:

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

Предположим, у вас есть 3 врагов осталось. Цикл начинается с 0 и удаляет первого врага. Теперь у вас осталось 2 вратаря с индексами 0 и 1. Значение i теперь 1, так что вы можете удалить еще 1 врага. Теперь у вас есть 1 враг слева от индекса 0, но значение i равно 2, поэтому в Collection останется 1 враг.

Попробуйте заменить enemies.remove(i) на enemies.remove(0). Или, предположив, enemies является Collection, почему бы вам просто не сделать 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 больше!

EDIT: Как указано выше enemies.clear() следует сделать трюк или использовать

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

в случае, если вам это нужно.

0

Значение термина «enimies.size Поскольку цикл уменьшает размер, значение завершения уменьшается на единицу каждый раз, когда i увеличивается на единицу, что существенно сокращает цикл в два раза быстрее, чем если бы значение «enimies.size()» не менялось.Поэтому лучше использовать неизменяемые значения как значения завершения цикла. Другие ответы содержат достаточную информацию, чтобы исправить ошибку, но это просто дополнительный совет для будущего.

Смежные вопросы