Данный урок является продолжением статьи 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();
PAL_setPalette(PAL3, spr_cup.palette->data, DMA);
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 тот же принцип.
Есть еще тип u16 — 16ти битное число без знака, другими словами unsigned 16. C u8 и u32 тот же принцип.
SPR_init();
SPR_init — инициализирует спрайтовый движок (выделяет место в VRAM под спрайты)
Всегда вставляйте SPR_init, в самом начале, а уже после добавляйте спрайты SPR_addSprite.
VRAM (Video Random Access Memory) — оперативная память объемом в 64 KB, хранящая тайлы изображения.
PAL_setPalette(PAL3, spr_cup.palette->data, DMA);
В этой строке, мы задали цвета в 4-ой палитре (отсчет начинается с нуля), цветами взятыми из спрайта кружки, и выбрали в качестве способа передачи DMA.
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);
В итоге, у нас получился отталкивающийся от стен спрайт кружки.
Исходный код доступен на github