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