NDS Homebrew: несколько скоростей анимации для спрайтов
Недавно я экспериментировал с набором инструментов devkitARM для NDS. Однако я хотел бы лучше понять, как управлять скоростью анимации спрайтов. Единственный способ, которым я знаю, это "подсчитывать кадры". Например, следующий код может быть помещен в пример "animate_simple", включенный в devkitpro:
int main(void) {
int frame = 0;
...
while(1) {
...
if(++frame > 9)
frame = 0;
}
return 0;
}
Обычно это нормально, но гарантирует, что вся анимация, инициализированная в основном цикле, будет работать с заданной скоростью. Как бы мне было иметь два разных спрайта, каждый из которых анимировался на разных скоростях? Любое понимание будет с благодарностью.
1 ответ
Используйте отдельный счетчик кадров для каждого спрайта. Например, вы можете создать структуру спрайта:
typedef struct _Sprite Sprite;
struct _Sprite
{
int frame;
int count;
int delay; /* handles the speed of animation */
int limit;
};
// initialize all fields
void sprite_update(Sprite* s)
{
if ( ( s->count++ % s->delay ) == 0 ) )
{
if ( s->frame++ > s->limit ) s->frame = 0;
}
}
Дать delay
малое значение для более быстрой анимации и большее значение для медленной анимации.
Пример использования:
Sprite my_spr, my_spr_2;
/* initialize the fields, or write some function for initializing them. */
my_spr.delay = 5; /* fast */
my_spr_2.delay = 10; /* slow */
/* < in Main Loop > */
while(1){
...
sprite_update(&my_spr);
sprite_update(&my_spr_2);
}
Примечание. Поскольку вы ориентируетесь только на одну платформу, лучший способ контролировать скорость анимации - отслеживать частоту кадров (или "подсчитывать кадры", как вы ее называете). Хорошая вещь в программировании консолей заключается в том, что вам не нужно устанавливать временные задержки. Поскольку все консольные устройства одной и той же модели обычно работают с одинаковой скоростью, скорость анимации на вашей машине (или в эмуляторе) будет одинаковой для всех. Разные скорости процессора - настоящая головная боль при программировании для ПК.