Первым делом, скачайте готовый проект с 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);
Прибавляем скорость к позиции игрока. Ограничиваем игрока в рамках экрана. И в заключение, перемещаем спрайт игрока на указанную позицию.