Оглавление
Проблема
Вы создаете 2D игру TOP-DOWN в Godot и вам нужно управлять движением персонажа.
Решение
Для данного решения предполагается, что у вас уже определены следующие действия ввода:
Action Name | Key(s) |
---|---|
"up" | W,↑ |
"down" | S,↓ |
"right" | D,→ |
"left" | A,← |
"click" | Mouse button 1 |
Мы также предположим, что вы используете узел CharacterBody2D.
Мы можем решить эту проблему разными способами, в зависимости от того, какое поведение вы ищете.
Вариант 1: Движение в 8 направлениях
В этом сценарии игрок использует четыре направляющие клавиши для перемещения (включая диагонали).
extends CharacterBody2D
var speed = 400 # speed in pixels/sec
func _physics_process(delta):
var direction = Input.get_vector("left", "right", "up", "down")
velocity = direction * speed
move_and_slide()
Вариант 2: Поворот и движение
В этом сценарии действия влево/вправо вращают персонажа, а вверх/вниз перемещают персонажа вперед и назад в том направлении, куда он направлен. Иногда это называется движением в стиле «Asteroids».
extends CharacterBody2D
var speed = 400 # move speed in pixels/sec
var rotation_speed = 1.5 # turning speed in radians/sec
func _physics_process(delta):
var move_input = Input.get_axis("down", "up")
var rotation_direction = Input.get_axis("left", "right")
velocity = transform.x * move_input * speed
rotation += rotation_direction * rotation_speed * delta
move_and_slide()
Примечание! Godot считает угол 0 градусов направленным вдоль оси x. Это означает, что направление вперед узла (transform.x) указывает вправо. Убедитесь, что спрайт вашего персонажа также нарисован, указывая вправо.
Вариант 3: Прицеливание с помощью мыши
Похоже на вариант 2, но на этот раз управление вращением персонажа происходит с помощью мыши (т.е. персонаж всегда направлен на мышь). Движение вперед/назад осуществляется с помощью клавиш, как и раньше.
extends CharacterBody2D
var speed = 400 # move speed in pixels/sec
func _physics_process(delta):
look_at(get_global_mouse_position())
var move_input = Input.get_axis("down", "up")
velocity = transform.x * move_input * speed
move_and_slide()
Вариант 4: Клик и движение
В этом варианте персонаж перемещается в место, по которому было произведено нажатие.
extends CharacterBody2D
var speed = 400 # move speed in pixels/sec
var target = null
func _input(event):
if event.is_action_pressed("click"):
target = get_global_mouse_position()
func _physics_process(delta):
if target:
# look_at(target)
velocity = position.direction_to(target) * speed
if position.distance_to(target) < 10:
velocity = Vector2.ZERO
move_and_slide()
Обратите внимание, что мы прекращаем движение, если приближаемся к целевой позиции. Если этого не сделать, персонаж будет «дрожать» туда-сюда, двигаясь немного за пределы цели, возвращаясь, снова двигаясь чуть дальше и так далее. По желанию, вы можете использовать look_at() для того, чтобы повернуться в направлении движения.