Восстановим структуру и код проекта Годот Phisics-Based Platformer 2D.Восстановим 2д игра на годот.Phisics-Based Platformer 2D 3
Создадим новый проект в Godot под названием Physics-Based Platformer 2D experiment и начнем восстановление со сцены Player.tscn. В корне разместим RigidBody2D, внутрь которого добавим Sprite2D, AnimationPlayer, Camera2D, Marker2D, CollisionShape2D, CollisionPolygon2D, CanvasLayer и два AudioStreamPlayer2D. В Sprite2D вложим узел CPUParticles2D, а в CanvasLayer — четыре узла TouchScreenButton для управления на сенсорных экранах:
Сохраняем сцену как player.tscn. Теперь создадим все остальные сцены, а затем настроим их. Переходим к сцене врага — enemy.tscn. Создаём корневой узел RigidBody2D и вкладываем в него AnimationPlayer, два AudioStreamPlayer2D, VisibleOnScreenEnabler2D, Sprite2D, три CollisionShape2D, два RayCast2D и GPUParticles2D:
Сохраняем сцену врага как enemy.tscn. Теперь создадим сцену монетки coin.tscn. Корневым узлом будет Area2D, внутрь которого добавим Sprite2D, AnimationPlayer, CollisionShape2D, AudioStreamPlayer2D, CPUParticles2D и VisibleOnScreenEnabler2D:
Сохраняем сцену монетки как coin.tscn. Теперь создадим две сцены платформ. Первая — moving_platform.tscn — состоит из корневого узла CharacterBody2D с дочерними Sprite2D и CollisionPolygon2D. Вторая — one_way_platform.tscn — построена на основе StaticBody2D со вложенными Sprite2D и CollisionShape2D:
Сохраняем две сцены как moving_platform.tscn и one_way_platform.tscn соответственно. Теперь создадим сцену заднего фона. Для этого добавим узел ParallaxBackground, внутрь которого вложим несколько слоев ParallaxLayer, а в каждый из них — спрайты для создания эффекта глубины:
Сохраним сцену фона как ParallaxBackground.tscn и откроем Player.tscn. Настроим физическое тело: в RigidBody2D установим массу 1.5 кг, назначим PhysicsMaterial с нулевым трением, заблокируем вращение (lock_rotation), активируем custom_integrator, contact_monitor и увеличим max_contact_reported до 4. В Sprite2D добавим спрайт-лист player.webp и укажем количество спрайтов по вертикали, горизонтали и общее число кадров. Для CPUParticles2D назначим текстуру bullet.png, установим время жизни 0.3 с, отметим One Shot, explosiveness = 1, разброс частиц (Spread) — 65.84, цветовой градиент от фиолетового к прозрачному, а в Self Modulate выставим прозрачность. В AnimationPlayer создадим анимации с дорожкой frame для Sprite2D и ключевыми кадрами, управляя временем и индексом спрайта. Для Camera2D установим Zoom = 2, а Limits Left и Top — в 0. Marker2D сместим на 15 пикселей вправо. CollisionShape2D заменим на SeparationRayShape2D с длиной 18 и смещением bias до 0.5, а CollisionPolygon2D сделаем в форме треугольника для скатывания с утёсов. Остаётся настроить TouchScreenButton и добавить звук в AudioStreamPlayer2D:
Теперь рассмотрим сцену moving_platform.tscn. Для Sprite2D назначаем текстуру moving_platform, после чего настраиваем CollisionPolygon2D — создаём полигон, соответствующий форме платформы:
Теперь рассмотрим сцену one_way_platform.tscn. Для Sprite2D назначаем текстуру one_way_platform, а для CollisionShape2D выбираем прямоугольную форму — RectangleShape2D:
Теперь рассмотрим сцену врага enemy.tscn. Для корневого RigidBody2D добавляем PhysicsMaterial, блокируем вращение (lock_rotation), включаем contact_monitor и устанавливаем max_contact_reported = 4. В AnimationPlayer создаём анимации idle и walk: добавляем дорожку свойств для Sprite2D, выбираем фреймы и устанавливаем кадры. Для анимации explode добавляем один кадр, а также настраиваем self_modulate для Sprite2D и emitting для CPUParticles2D с включением значения value. Для RigidBody2D вызываем функции _pre_explode и _die — это позволяет управлять кодом прямо из анимации. Для AudioStreamPlayer2D назначаем звуковые файлы. VisibleOnScreenEnabler2D расширяем прямоугольник видимости. Sprite2D получает текстуру с параметрами hframes, vframes и frames. Для CollisionShape2D выбираем круглые формы. RayCast2D позиционируем в нужное место. CPUParticles2D настраиваем: текстура, Amount = 32, Lifetime, включаем One Shot, корректируем Speed Scale и explosiveness. Вкладка Color — градиент от полупрозрачного к прозрачному. Вкладка Visibility — Modulate устанавливаем в прозрачное значение:
Рассмотрим сцену монетки coin.tscn. Узел Area2D испускает сигнал при столкновении с игроком, вызывая функцию _on_body_enter(). Sprite2D содержит текстуру вращающейся монетки с настроенными Hframes и Vframes. AnimationPlayer управляет двумя анимациями: вращение монетки и её взятие. При взятии спрайт становится прозрачным, активируются частицы CPUParticles2D, вызывается queue_free() и запускается AudioStreamPlayer2D. CollisionShape2D имеет круглую форму. AudioStreamPlayer2D содержит звук захвата. CPUParticles2D используют текстуру монетки, настроены на уменьшение частиц со временем через scale_amount_curve, гравитация по Y равна нулю, материал CanvasItemMaterial с blend_mode = add, а в Modulate добавлен фиолетовый оттенок. VisibleOnScreenEnabler2D настроен по размерам монетки:
Рассмотрим сцену заднего фона ParallaxBackground.tscn. Для ParallaxBackground установим scroll_base_scale в (0.7, 0). Каждый ParallaxLayer получает настройки Mirroring по оси X и собственный масштаб: первый слой — Mirroring = 400, второй — Mirroring = 400, Scale = 0.1, третий — Mirroring = 400, Scale = 0.2, четвёртый — Mirroring = 400, Scale = 0.4. Внутри слоёв размещены спрайты облаков, гор и заката. Благодаря разным значениям масштаба слои движутся с разной скоростью, создавая эффект глубины:
Теперь осталось объединить все элементы в одну игровую сцену. Создаём новую сцену с корневым узлом Node2D. Добавляем к нему TileMapLayer, три пустых узла Node2D, экземпляр сцены игрока (Player.tscn), сцену фона (ParallaxBackground.tscn) и AudioStreamPlayer2D для фоновой музыки:
Сохраним сцену как stage.tscn. Теперь перейдём к настройке TileMapLayer и созданию карты уровня. Откроем панель TileMap, выберем тайлсет и начнём расставлять тайлы, формируя платформы, стены и другие элементы окружения:
После добавления физики в тайлы карты, мы можем подключить скрипт к игроку. Теперь персонаж будет корректно падать на тайлы и проигрывать анимацию idle, если не движется и находится на поверхности:
2д игра на годот.Phisics-Based Platformer 2D 3.Конец
Несмотря на возникшие ошибки, мы успешно восстановили работу с TileMapLayer и частицами, разобрались со спрайтовыми анимациями и параллакс-эффектами. Для меня это был ценный и интересный опыт. Надеюсь, что и для вас он оказался таким же полезным. Спасибо за внимание!





































































































































