От базовой карты к динамической загрузке уровня. Devlog #2

Разобрался с Tiled Map Editor. Поначалу я планировал строить уровни так, как их видит игрок классической метроидвании девяностых: уровень имеет четкие границы, в его пределах камера следует за игроком, между уровнями есть точки переходов, когда игрок достигает такой точки, игра должна загрузить соседний уровень и закрыть текущий. Довольно легко в редакторе была создана простая карта…

Разобрался с Tiled Map Editor. Поначалу я планировал строить уровни так, как их видит игрок классической метроидвании девяностых: уровень имеет четкие границы, в его пределах камера следует за игроком, между уровнями есть точки переходов, когда игрок достигает такой точки, игра должна загрузить соседний уровень и закрыть текущий. Довольно легко в редакторе была создана простая карта уровня.

Пробный уровень

Теперь её нужно экспортировать в Godot. Это можно сделать двумя способами: либо использовать плагин Tiled Map Importer для Godot, либо плагин Tiled To Godot Export для Tiled. Второй работает лучше на больших картах, поэтому использую его.

В Godot у движка физики свои собственные законы, и спрайтовые плитки физическими объектами не являются. Чтобы шарик не проваливался сквозь них, нужно как-то указать границы объектов. Можно либо нарисовать в Godot руками, это долго и неудобно, либо начертить полигоны в Tiled в карте спрайтов, это уже лучше и быстрее, но есть один фатальный недостаток.

Спрайт с зоной столкновения

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

Решение нашлось в связке двух редакторов: в Tiled можно экспортировать карту в изображение в PNG-изображение, а в Godot можно выбрать спрайт и автоматически сгенерировать физические объекты по его границам. Это удобней и точнее, чем рисовать их руками, процесс стал занимать меньше двух минут.

Казалось бы задача решена, но при увеличении размера карты до 16384 пикселей в квадрате Godot упал от нехватки памяти. Уменьшать карты не хотелось, игра должна быть быстрой и динамичной, требовался простор. Карта должна быть разрезаны на небольшие квадраты и подгружаться динамически во время игры. Создаём карту открытую по бокам, пишем скрипт загрузки, попутно рисуем пару облаков для параллакса фона и готов бесконечный раннер.