SGDK. Добавляем Entity на сцену

Предисловие.

Для данной статьи я подготовил проект, в котором можно выставлять живность на карте, в удобном редакторе Godot, и на выходе получать массив значений, с соответствующими координатами. Данный подход значительно упрощает разработку. Но сперва, нужно подготовить структуры, и сделать функцию, которая будет отображать спрайт относительно координат камеры.

Разберем код.

Скачайте файл проекта с MEGA.

Сперва разберем структуры:

typedef struct {
	f32 x;
	f32 y;
} fixPoint;

typedef struct {
	s16 x;
	s16 y;
} intPoint;

Структуру Point из SGDK. Создание платформера для Sega Genesis. я переименовал в fixPoint. И рядом создал структуру intPoint. Таким образом:

  • fixPoint — хранит дробное значение x,y (нужно для подвижных entity)
  • intPoint — хранит целое значение x,y, (подойдет для статичных декораций)

Следом идет Decoration

typedef struct {
	intPoint pos;
	Sprite* sprite;
	u8 sizeX;
	u8 sizeY;
} Decoration;

Это и будет нашим entity.

  • pos— позиция декорации
  • sprite — его спрайт
  • sizeX, sizeY — хранит размеры спрайта в пикселях

Структура Trigger, пока ничего не делает, оставил на будущее.

Далее идет большой блок кода, с созданием массивов, и их инициализации. Данный код генерируется автоматически, но об этом позже.

За отображение декорации отвечает функция showDecoration

void showDecoration(Decoration *entity)
{
    // clip out of screen sprites
    s16 posX_OnCam = entity->pos.x-camPosX;
	s16 posY_OnCam = entity->pos.y-camPosY;

	if ((posX_OnCam < -entity->sizeX) || (posX_OnCam > 320) || (posY_OnCam < -entity->sizeY) || (posY_OnCam > 240)) SPR_setVisibility(entity->sprite, HIDDEN);
    else
    {
        SPR_setVisibility(entity->sprite, VISIBLE);
        SPR_setPosition(entity->sprite, posX_OnCam, posY_OnCam);
    }
}

Сначала, нужно вычислить позицию декорации относительно камеры. Нечто похожее мы делали, когда запирали камеру в пределах карты в статье SGDK. Создание платформера для Sega Genesis.

s16 posX_OnCam = entity->pos.x-camPosX;
s16 posY_OnCam = entity->pos.y-camPosY;

Затем, если спрайт полностью зашел на экран, делаем его невидимым.

if ((posX_OnCam < -entity->sizeX) || (posX_OnCam > 320) || (posY_OnCam < -entity->sizeY) || (posY_OnCam > 240)) SPR_setVisibility(entity->sprite, HIDDEN);

В противном случае видимым, и выставляем позицию спрайта на соответствующих координатах.

SPR_setVisibility(entity->sprite, VISIBLE);
SPR_setPosition(entity->sprite, posX_OnCam, posY_OnCam);

Функцию отвечающую за рисование декорации, разобрали. Осталось её вызвать в handleInput.

В handleInput, проходимся по всем декорациям.

for(u16 i=0; i<DECORATION_ARR_LEN; i++){
	showDecoration(&decoration_Arr[i]);
}

Ок, теперь запустите.

Эти декорации выставляются в соответствии с их координатами, которые выставлены в массиве decoration_Arr.

Муторно выставлять координаты для каждого entity, поэтому я создал проект на Godot, который делает это за вас.

Выставляем entity, с помощью Godot.

Первый вариант лого

Скачайте Godot проект с MEGA.

Разархивируйте папку с проектом и импортируйте его в Godot.

Откройте сцену Tilemap.

Разберем структуру.

  • Decoration — все декорации находятся в этой группе.
  • Points — все точки хранятся здесь (на будущее)
  • Triggers — прямоугольные триггеры, находятся тут (также на будущее)

Для скрытых групп, код генерироваться не будет.

Ладно, начнем выставлять декорации.

Перемещайте декорации, создавайте новые (Ctrl+D), и меняйте внешний вид (если надо).

Декорации в проекте Godot, не просто спрайты, а спрайты с переменными.

Разберем переменные.

  • Sgdk Sprite Name — задает имя спрайта, которое указывали в resources.res. Если его не задать, то будет использоваться имя спрайта, без расширения.
  • Sgdk Pal — здесь указывается палитра спрайта.

Рекомендую png спрайтам давать то же имя, что прописано в reources.res.

SPRITE spr_coffee "coffe_cup.png" 8 8 NONE 20

После того, как расставили декорации, нажмите F5, чтобы запустить проект. И закройте его.

В папке с проектом появился файл с кодом resultCode.txt (Godot его не видит, поэтому ищите его в проводнике)

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

После компиляции, получил следующий результат.

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

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

Please disable your adblocker or whitelist this site!