Проблема
Вам нужно создать персонажа в стиле 2D-платформера.
Решение
Новые разработчики часто удивляются тому, насколько сложно программировать персонажа для платформера. Godot предоставляет некоторые встроенные инструменты для помощи, но существует столько же решений, сколько и игр. В этом уроке мы не будем углубляться в такие функции, как двойные прыжки, приседания, прыжки по стенам или анимация. Здесь мы обсудим основы движения персонажа в платформере.
Совет. Хотя можно использовать RigidBody2D для создания персонажа для платформера, мы сосредоточимся на CharacterBody2D. Кинематические тела отлично подходят для платформеров, где вам менее важна реалистичная физика, чем отзывчивость и аркадный характер движения.
Начните с узла CharacterBody2D и добавьте к нему Sprite2D и CollisionShape2D.
Присоедините следующий скрипт к корневому узлу персонажа. Обратите внимание, что мы используем действия ввода, которые мы определили в InputMap: «walk_right», «walk_left» и «jump».
extends CharacterBody2D
@export var speed = 1200
@export var jump_speed = -1800
@export var gravity = 4000
func _physics_process(delta):
# Add gravity every frame
velocity.y += gravity * delta
# Input affects x axis only
velocity.x = Input.get_axis("walk_left", "walk_right") * speed
move_and_slide()
# Only allow jumping when on the ground
if Input.is_action_just_pressed("jump") and is_on_floor():
velocity.y = jump_speed
Значения, используемые для скорости, гравитации и jump_speed, сильно зависят от размера спрайта вашего игрока. Текстура игрока в этом примере имеет размер 108×208 пикселей. Если ваш спрайт меньше, вам следует использовать меньшие значения. Мы также хотим использовать высокие значения, чтобы все ощущалось быстро и отзывчиво. Низкая гравитация создает ощущение плавания в игре, в то время как высокое значение означает, что вы быстро возвращаетесь на землю и готовы снова прыгнуть.
Обратите внимание, что мы проверяем is_on_floor() после использования move_and_slide(). Функция move_and_slide() устанавливает значение этого метода, поэтому важно не проверять его до этого, иначе вы получите значение из предыдущего кадра.
Трение и ускорение
Вышеуказанный код — отличное начало и вы можете использовать его в качестве основы для широкого спектра контроллеров платформеров. Однако у него есть проблема — мгновенное перемещение. Для более естественного ощущения лучше, если персонаж ускоряется до своей максимальной скорости и замедляться, когда нет ввода.
Один из способов добавить это поведение — использовать линейную интерполяцию («lerp»). При движении мы будем использовать lerp между текущей скоростью и максимальной скоростью, а при остановке мы будем использовать lerp между текущей скоростью и 0. Регулирование величины lerp даст нам различные стили движения.
extends CharacterBody2D
@export var speed = 1200
@export var jump_speed = -1800
@export var gravity = 4000
@export_range(0.0, 1.0) var friction = 0.1
@export_range(0.0 , 1.0) var acceleration = 0.25
func _physics_process(delta):
velocity.y += gravity * delta
var dir = Input.get_axis("walk_left", "walk_right")
if dir != 0:
velocity.x = lerp(velocity.x, dir * speed, acceleration)
else:
velocity.x = lerp(velocity.x, 0.0, friction)
move_and_slide()
if Input.is_action_just_pressed("jump") and is_on_floor():
velocity.y = jump_speed
Попробуйте изменить значения для трения и ускорения, чтобы увидеть, как они влияют на ощущения в игре. Например, уровень со льдом может использовать очень низкие значения, что сделает управление более сложным.
Заключение
Этот код предоставляет вам отправную точку для создания своего контроллера для платформера. Для более продвинутых функций платформинга, таких как прыжки по стенам, ознакомьтесь с другими рецептами в этом разделе.