Непоследовательное добавление очков при убийстве врага
Я делаю игру Asteroid Destroyer, в которой вы получаете очки с течением времени (игра становится все сложнее), но также когда вы попадаете в астероид. Я написал метод внутри Game1
класс для расчета суммы баллов, которые должны быть добавлены к концу Update
метод.
Код выглядит следующим образом:
private float CountScore(GameTime gameTime, List<Asteroid> asteroids)
{
float addScore = 0;
foreach (Asteroid asteroid in asteroids)
{
if (asteroid.Killed)
{
addScore += 100;
}
}
if (spaceship1.Alive)
{
addScore += 80 * (float)gameTime.ElapsedGameTime.TotalSeconds;
}
return addScore;
}
Метод называется так в Update
метод:
score += CountScore(gameTime, asteroids);
Часть кода, которая добавляет счет с течением времени, работает нормально. Проблема в том, что когда я уничтожаю астероид, вместо того, чтобы набрать еще 100 баллов, иногда я получаю 200, иногда 2000, а иногда 5000. Я не понимаю, что происходит, поскольку только астероиды убиваются игрок получить собственность Killed = true;
, поэтому я не думаю, что это добавляет 100 на астероид на экране.
Кто-нибудь знает, что может вызвать это? Если это необходимо, я могу опубликовать больше кода, но я не хотел писать здесь слишком много для удобства чтения.
Редактировать: Добавление asteroid.Killed = false;
только после добавления оценка сработала. Однако я до сих пор не понимаю, в чём была проблема, так как похоже, что он проходил через один и тот же астероид более одного раза.
1 ответ
Я бы порекомендовал, чтобы логика добавления к счету, когда астероид был убит, выполнялась одновременно с логикой убийства астероида.
Вполне вероятно, что вы перебираете список астероидов уже при обработке обнаружения попадания, и, таким образом, это повысит производительность, если логика будет выполнена в одно и то же время, вместо того, чтобы иметь другой цикл foreach, как продемонстрировано в вашем коде.
Еще больше ваших addScore += 80 * (плавать)gameTime.ElapsedGameTime.TotalSeconds; является ненадежным, игрок с более высоким FPS будет иметь несправедливое преимущество. Я рекомендую использовать deltaTime при добавлении к общему количеству очков в ходе игры.