SGDK. Спрайтовая анимация.

Первым делом, скачайте готовый проект с MEGA.

Дальше откройте resources.res, в этой строке.

SPRITE sonic_sprite "sonic.png" 6 6 BEST 5

Появился новый аргумент (5). Он указывает время проигрывания одного кадра анимации, в фреймах. И т.к. Sega Genesis выводит 60 кадров в секунду, следовательно 1 кадр будет проигрываться 5/60 = 1/12 секунды.

Теперь, откройте sonic.png

В данной картинке, хранится вся анимация игрока. Обращаться к анимациям будем по номеру, указанному на картинке выше.

Теперь, откройте main.c находящийся в папке src вашего проекта. Разберем код.

#define ANIM_STAND          0
#define ANIM_WALK           2

Создал 2 константы, для удобного переключения анимаций.

s16 max_x_spd = 3;
s16 cur_spd_x = 0;

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

void updateAnim() {
	if(cur_spd_x == 0) {
		SPR_setAnim(sonic_obj, ANIM_STAND);
	} else {
		SPR_setAnim(sonic_obj, ANIM_WALK);
	}
	
	if (cur_spd_x > 0) SPR_setHFlip(sonic_obj, FALSE);
        else if (cur_spd_x < 0) SPR_setHFlip(sonic_obj, TRUE);
}

Функция updateAnim вызывается в бесконечном цикле while.

SPR_setAnim — принимает объект типа Sprite, и номер анимации, данная функция переключает анимацию у спрайта.

Таким образом, здесь.

if(cur_spd_x == 0) {
	SPR_setAnim(sonic_obj, ANIM_STAND);
} else {
	SPR_setAnim(sonic_obj, ANIM_WALK);
}

Если игрок стоит (cur_spd == 0) то, проигрывается анимация бездействия, иначе, проигрывается анимация ходьбы.

if (cur_spd_x > 0) SPR_setHFlip(sonic_obj, FALSE);
else if (cur_spd_x < 0) SPR_setHFlip(sonic_obj, TRUE);

SPR_setHFlip — поворачивает спрайт по горизонтали. Т.е. здесь, мы поворачиваем спрайт в направлении движения.

Разберем следующую функцию handleInput.

void handleInput(){
  u16 value = JOY_readJoypad(JOY_1);
  cur_spd_x = 0;

  if(value & BUTTON_LEFT) {
    cur_spd_x = -max_x_spd;
  } else if(value & BUTTON_RIGHT) {
    cur_spd_x = max_x_spd;
  }
}

Её я разбирал здесь. Единственное, здесь при нажатии влево/вправо присваивается скорость отрицательная/положительная. Если ничего не нажато, скорость сбрасывается до нуля.

Перейдем в функцию main в цикл while.

handleInput();
updateAnim();

В цикле while, вызываем созданные функции.

x += cur_spd_x;
if(x > 320-sonic_width)
	x = 320-sonic_width;
else if(x < 0)
	x = 0;
SPR_setPosition(sonic_obj, x, y);

Прибавляем скорость к позиции игрока. Ограничиваем игрока в рамках экрана. И в заключение, перемещаем спрайт игрока на указанную позицию.

Итоговый результат.

Пожалуйста отключи блокировщик рекламы, или внеси сайт в белый список!

Please disable your adblocker or whitelist this site!