Сегодня разберём составляющие и код игры Dynamic Tilemap Layers. Начнём со сцены игрока — player.tscn.
Сцена player.tscn состоит из объекта CharacterBody2D. Внутри него вложены два узла: Sprite2D и CollisionShape2D. На изображении ниже показано, как player.tscn выглядит в 2D-редакторе.
Рассмотрим сцену world.tscn. Она построена на основе объекта Node2D, внутри которого находятся два узла типа TileMapLayer, а также камера (Camera2D). Кроме того, в сцене присутствует секретная комната: для этого добавлен узел Area2D с вложенным CollisionShape2D. Этот узел испускает сигнал, когда игрок пересекает его границу (входит в секретную пещеру). В сцену также встроен сам игрок (player.tscn). Ниже показано, как world.tscn выглядит в 2D-редакторе.
Теперь перейдём к разбору кода. Рассмотрим скрипт tile_map.gd.
В нём объявлена булева переменная player_in_secret. Она устанавливается в true, когда игрок касается CollisionShape2D пещеры, и в false, когда выходит из зоны пещеры.
Если игрок находится внутри пещеры, прозрачность пещеры плавно уменьшается (она становится менее заметной). Если игрок покидает пещеру, прозрачность плавно возвращается к полной непрозрачности (значению «единица»).
Рассмотрим код player.gd
В скрипте реализована всего одна функция — _physics_process(delta: float).
Сначала вычисляется горизонтальная скорость. Если нажаты соответствующие клавиши, скорость увеличивается плавно; если нет — плавно уменьшается. Далее скорость ограничивается заданными пределами (между максимальным и минимальным значением). Персонаж постоянно притягивается к земле, поэтому компонента velocity.y постепенно растёт.
Если игрок стоит на земле (is_on_floor()) и нажата клавиша прыжка, переменной velocity присваивается отрицательное значение (игрок подлетает вверх), а затем быстро увеличивается в положительную сторону (имитация падения).
И наконец, самой важной функцией является move_and_slide() — без неё было бы невозможно ни плавное движение объектов, ни корректное скольжение по поверхностям.
Конец.
Мы рассмотрели все ключевые функции туториала Dynamic Tilemap Layers в Godot. Спасибо за внимание.
