Что потребуется.
Чтобы управлять скоростью анимации, нам потребуется:
- Переменная Sprite->timer, которая хранит время до переключения на следующий кадр.
- Функция SPR_setFrameChangeCallback, которая вызывается в момент смены кадра.
Т.е. в момент смены кадра, мы будем менять переменную timer, в зависимости от условий.
Теперь, скачайте SGDK проект с github.
Задаем скорость каждой анимации.
В функции main, передаем спрайт и callBack функцию playerFrameChanged в SPR_setFrameChangeCallback
Callback функция — это функция которая передается в другую функцию.
SPR_setFrameChangeCallback(playerBody.sprite, playerFrameChanged);
Чуть выше, я создал функцию playerFrameChanged, в которой будет находится логика смены кадра.
static void playerFrameChanged(Sprite* sprite){
switch(sprite->animInd){
case 2: case 3: case 4:
sprite->timer = 1;
break;
default:
sprite->timer = 5;
break;
}
}
Разберем код:
- Если выбрана анимация с индексом 2,3,4 ставим быструю скорость проигрывания sprite->timer = 1
- В остальных случаях, медленную sprite->timer = 5
Управляем скоростью отдельных кадров.
Во втором примере я создал массив, в котором задается длительность каждого кадра анимации.
const u8 const playerAnim3_timeArr[] = {30, 5, 5, 30, 15, 30};
И в callBack функции:
static void playerFrameChanged2(Sprite* sprite){
switch(sprite->animInd){
case 2:
sprite->timer = playerAnim3_timeArr[sprite->frameInd];
break;
}
}
Т.е. в зависимости от номера кадра sprite->frameInd, получаем соответствующую длительность playerAnim3_timeArr[sprite->frameInd], и присваиваем к длительности текущего кадра sprite->timer.
Заключение
Таким образом вы можете задавать длительность любого кадра анимации. Если есть вопросы, пишите их в комментариях.
Итоговый результат.
