Движение TOP-DOWN в Godot

Проблема

Вы создаете 2D игру TOP-DOWN в Godot и вам нужно управлять движением персонажа.

Решение

Для данного решения предполагается, что у вас уже определены следующие действия ввода:

Action NameKey(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() для того, чтобы повернуться в направлении движения.

Build a Top-Down 2D GODOT RPG in 20 Minutes!Build a Top-Down 2D GODOT RPG in 20 Minutes!

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

три × пять =

Прокрутить вверх