Непоследовательное добавление очков при убийстве врага

Я делаю игру 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 при добавлении к общему количеству очков в ходе игры.

Другие вопросы по тегам