SGDK. Двигаем спрайт по экрану.

Данный урок является продолжением статьи SGDK. Создание изображения.

Импортируем спрайт.

Скачайте спрайт кружки с MEGA. И закиньте его в папку res, в директории вашего проекта.

Откройте предыдущий проект, и в resources.res, добавьте следующую строчку.

SPRITE spr_cup "cup.png" 8 8 BEST

Синтаксис тут следующий

тип имя путь_до_файла ширина_в_тайлах высота_в_тайлах тип_сжатия

Т.е. к спрайту cup.png обращаемся по имени spr_cup.

Размер спрайта равен 64×64 пикселя, или 8×8 в тайлах (1 тайл = 8×8 пикселей)

Сжатие выбрали самое лучшее BEST.

Как и с изображениями, вся информация о ресурсах находится в recomp.txt, находящийся в SGDK\bin

Пишем код.

Скопируйте следующий код.

#include <genesis.h>
#include "resources.h"

Sprite* cup_obj;
s16 x = 0;
s16 y = 0;

int main()
{
    VDP_drawImage(BG_A, &img, 0, 0);
    SPR_init();
    VDP_setPalette(PAL3, spr_cup.palette->data);
    cup_obj = SPR_addSprite(&spr_cup, x,  y, TILE_ATTR(PAL3, 0, FALSE, FALSE));
    while(1)
    {
	SPR_update();
        SYS_doVBlankProcess();
    }
    return (0);
}

Теперь, разберем его.

Sprite* cup_obj;

Тип Sprite, как понятно из названия, хранит спрайты. Звездочка, дает понять что мы создаем указатель *, следовательно, передавать его будем по ссылке &. В данной переменной, мы будем хранить спрайт.

s16 x = 0;
s16 y = 0;

Создали переменные в которых будем хранить координаты спрайта.

Тип s16 — это 16-ти битное число со знаком (+ или -), другими словами signed 16. C s8 и s32 тот же принцип.

Есть еще тип u1616ти битное число без знака, другими словами unsigned 16. C u8 и u32 тот же принцип.

SPR_init();

SPR_init — инициализирует спрайтовый движок (выделяет место в VRAM под спрайты)

Всегда вставляйте SPR_init, в самом начале, а уже после добавляйте спрайты SPR_addSprite.

VRAM (Video Random Access Memory) — оперативная память объемом в 64 KB, хранящая тайлы изображения.

VDP_setPalette(PAL3, spr_cup.palette->data);

В этой строке, мы задали цвета в 4-ой палитре (отсчет начинается с нуля), цветами взятыми из спрайта кружки.

Sega Genesis поддерживает 4 палитры по 16 цветов (PAL0-PAL3), и хранит их в CRAM.

cup_obj = SPR_addSprite(&spr_cup, x,  y, TILE_ATTR(PAL3, 0, FALSE, FALSE));

SPR_addSprite добавляет спрайт на экран, синтаксис у него следующий.

SPR_addSprite(спрайт, x,  y, атрибуты_тайла);

Рассмотрим атрибуты_тайла.

TILE_ATTR(палитра, приоритет, перевернуть_по_вертикали, перевернуть_по_горизонтали)
  • Палитра — Указываем палитру которую будет использовать тайлы (в нашем случае спрайт)
  • Приоритет — задает приоритет спрайта (тайла), т.е. спрайт с меньшим числом, будет перекрывать спрайт с большим.
  • остальное, понятно из названия.

В нашем случае

TILE_ATTR(PAL3, 0, FALSE, FALSE)
  • Мы использовали 4-тую палитру, в которую чуть выше, поместили палитру взятую из спрайта кружки.
  • Приоритет максимальный.
  • По оси x, спрайт переворачивать не будем.
  • Также и по оси y.

Таким образом, мы создали спрайт, и поместили в переменную cup_obj.

SPR_update();

Обновляет и отображает спрайты на экране.

SYS_doVBlankProcess();

SYS_doVBlankProcess — делает всю закулисную обработку, нужен когда есть спрайты, музыка, джойстик. В общем, всегда он нужен.

Теперь, скомпилируйте и запустите. Должно получится следующее.

Отлично, осталось заставить эту кружку двигаться. Сделаем так, что-бы она отталкивалась от границ экрана.

Двигаем кружку.

Добавьте переменные отвечающие за скорость и размер спрайта.

s16 x_spd = 3;
s16 y_spd = 3;
u16 cup_width = 64;
u16 cup_height = 64;

В цикл while, добавьте следующий код

x += x_spd;
y += y_spd;
if(x > 320-cup_width || x < 0)
  x_spd *= -1;
if(y > 240-cup_height || y < 0)
  y_spd *= -1;
SPR_setPosition(cup_obj, x, y);

Спрайт постоянно перемещается с заданной скоростью.

x += x_spd;
y += y_spd;

Если он зашел за границы экрана, то меняем скорость на противоположную.

if(x > 320-cup_width || x < 0)
x_spd *= -1;
if(y > 240-cup_height || y < 0)
y_spd *= -1;

И устанавливаем позицию спрайта равным x,y.

SPR_setPosition(cup_obj, x, y);

В итоге, у нас получился отталкивающийся от стен спрайт кружки.

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