2013-03-24 2 views
1

творю пробег характер, но анимация очень быстро, как я делаю:XNA Замедление анимации

_frameIndex++;

_frameIndex; это значение, которое указывает на изображение в SpriteSheet. Кто-нибудь знает, как я могу использовать gameTime.ElapsedGameTime.TotalMilliseconds, чтобы замедлить анимацию?

ответ

2

Я видел, что вы задали пару вопросов сегодня в отношении анимации и спрайтов, так что вот пример из «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.

Я удалил код, который фактически обновляет текущий фрейм, поскольку у вас уже должно быть что-то, что делает это, поскольку у вас есть рабочая анимация. Если вы хотите, чтобы этот пример был полностью заполнен, вы можете загрузить его с сайта учебника.

+0

Привет, Энтони. Большое спасибо за этот ответ. Код не имеет смысла для меня, я просто должен прочитать его пару раз и, надеюсь, он утонет. Это звучит многообещающе, и как только я полностью пойму, я положу его в свой код! – Subby

+0

Энтони, почему бы не просто «timeSinceLastFrame = 0;» вместо 'timeSinceLastFrame - = millisecondsPerFrame;'? – Subby

+0

Консистенция, в основном, но и работа. Повторяя комментарий Кевина, будьте осторожны, чтобы не предполагать, что частота кадров никогда не изменится. –

1

Я отлажена код и заметил, что gameTime.ElapsedGameTime.TotalMilliseconds всегда приравнивается к 33. Так что я сделал следующее:

milliSeconds += gameTime.ElapsedGameTime.Milliseconds; if (milliSeconds > 99) { _frameIndex++; milliSeconds = 0; }

который в основном означает, что, если это третий кадр из игры, а затем сделать его _frameIndex идет вверх. Сбросьте миллисекунды, чтобы начать все заново.

+0

Как я читаю ваш код: «Обновляйте анимацию только один раз .099 секунд или медленнее», что делает для меня много неприятностей. Я был бы осторожен, чтобы не предполагать, что частота кадров никогда не изменится. Машины разных людей будут работать по-другому, и другие программы, которые они запускают одновременно, также могут иметь значение. – Kevin

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