Проблема
Вам нужны перемещающиеся платформы в вашей 2D-платформере.
Решение
Существует несколько способов решения этой проблемы. В этом рецепте мы будем использовать AnimatableBody2D для нашей платформы и перемещать её с помощью Tween. Это позволяет использовать различные стили движения, минимизируя количество необходимого кода.
Вы также можете реализовать эту технику перемещения платформ с использованием AnimationPlayer вместо tween. Большая часть настройки будет такой же, но вместо кода tween вы будете анимировать свойство позиции тела.
Настройка
Мы начнем с базовой настройки платформера, используя статью из Рецептов Godot — персонаж платформера. Основное движение из этого рецепта будет хорошо работать с платформами.
Создание платформы
Сцена платформы содержит следующие узлы:
- Node2D («MovingPlatform»): Родительский узел Node2D служит «якорем» или стартовой точкой для платформы. Мы будем анимировать позицию платформы относительно этого родительского узла.
- AnimatableBody2D представляет собой саму платформу. Этот узел будет перемещаться.
- Sprite2D: Здесь можно использовать спрайт-лист, отдельные изображения или даже TileMap.
- CollisionShape2D: Не делайте хитбокс слишком большим, иначе игрок будет казаться «парящим» у края платформы.
- AnimatableBody2D представляет собой саму платформу. Этот узел будет перемещаться.
Настройте текстуру Sprite2D и форму столкновения соответствующим образом. В AnimatableBody2D установите свойство «Sync to Physics» в «Включено». Поскольку мы перемещаем тело в коде, это гарантирует, что оно перемещается во время физического шага, оставаясь в синхронизации с игроком и другими физическими телами.
Теперь добавьте сценарий к корневому узлу Node2D:
extends Node2D
@export var offset = Vector2(0, -320)
@export var duration = 5.0
func _ready():
start_tween()
func start_tween():
var tween = get_tree().create_tween().set_process_mode(Tween.TWEEN_PROCESS_PHYSICS)
tween.set_loops().set_parallel(false)
tween.tween_property($AnimatableBody2d, "position", offset, duration / 2)
tween.tween_property($AnimatableBody2d, "position", Vector2.ZERO, duration / 2)
Мы использовали несколько опций Tween здесь, чтобы сделать все более плавным:
- set_process_mode(): гарантирует, что весь процесс движения происходит во время обработки физики.
- set_loops(): это делает повторение tween.
- set_parallel(false): по умолчанию все изменения tween_property() происходят одновременно. Это заставляет их происходить один за другим: сначала перемещение в один конец смещения, затем обратно к началу.
Используя два экспортированных свойства, вы можете настроить движение платформы. Установите смещение, чтобы определить, куда двигается tween относительно своей стартовой точки, и длительность, чтобы определить, как долго занимает завершение цикла.
Добавьте несколько платформ на ваш уровень/мир и опробуйте их:
Скачайте этот проект
Скачайте код проекта здесь: https://github.com/godotrecipes/2d_moving_platforms