Я видел, что вы задали пару вопросов сегодня в отношении анимации и спрайтов, так что вот пример из «Learning XNA 4.0» Аарона Рида из главы 3 под заголовком «Настройка скорости анимации».
Во-первых, создать две переменные уровня класса для отслеживания времени между кадрами анимации:
int timeSinceLastFrame = 0;
int millisecondsPerFrame = 50;
Первая переменная отслеживает время, прошедшее с кадр анимации был изменен, а второй представляет собой произвольное количество времени, которое вам укажите, чтобы ждать, прежде чем перемещать индекс кадра снова. Таким образом, уменьшение размера анимации millisecondsPerFrame
увеличит скорость анимации, а увеличение его уменьшит скорость анимации.
Теперь в вашем методе обновления, вы можете воспользоваться game.ElapsedGameTime
, чтобы проверить время, прошедшее с момента последнего изменения кадра и изменить кадр, когда, когда это значение больше, чем millisecondsPerFrame, вы можете сделать работу:
timeSinceLastFrame += gameTime.ElapsedGameTime.Milliseconds;
if (timeSinceLastFrame > millisecondsPerFrame){
timeSinceLastFrame -= millisecondsPerFrame;
// Increment Current Frame here (See link for implementation)
}
Такое решение похоже на то, что вы нашли, за исключением того, что вы можете сделать дополнительный шаг, чтобы указать точно, как часто вы хотите, чтобы анимация обновляла, или даже измените эту продолжительность позже в своем коде, если вам нравится , Например, если у вас есть какое-то условие, которое «ускорит» спрайт (например, включение питания) или также замедлит его, вы можете сделать это, изменив millisecondsPerFrame
.
Я удалил код, который фактически обновляет текущий фрейм, поскольку у вас уже должно быть что-то, что делает это, поскольку у вас есть рабочая анимация. Если вы хотите, чтобы этот пример был полностью заполнен, вы можете загрузить его с сайта учебника.
Привет, Энтони. Большое спасибо за этот ответ. Код не имеет смысла для меня, я просто должен прочитать его пару раз и, надеюсь, он утонет. Это звучит многообещающе, и как только я полностью пойму, я положу его в свой код! – Subby
Энтони, почему бы не просто «timeSinceLastFrame = 0;» вместо 'timeSinceLastFrame - = millisecondsPerFrame;'? – Subby
Консистенция, в основном, но и работа. Повторяя комментарий Кевина, будьте осторожны, чтобы не предполагать, что частота кадров никогда не изменится. –