Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

Panoramica del movimento 2D

Introduzione

Ogni principiante si sarà chiesto: "Come faccio a muovere il mio personaggio?". A seconda dello stile di gioco che stai creando, potresti avere esigenze particolari, ma in generale il movimento nella maggior parte dei giochi 2D si basa su un piccolo numero di stili.

Utilizzeremo CharacterBody2D per questi esempi, ma i principi si applicheranno anche ad altri tipi di nodi (Area2D, RigidBody2D).

Configura

Ciascuno degli esempi seguenti usa la stessa configurazione della scena. Comincia con un CharacterBody2D con due figli: Sprite2D e CollisionShape2D. Puoi usare l'icona di Godot (icon.svg) come texture per lo Sprite2D o qualsiasi altra immagine 2D a tua disposizione.

Apri Progetto -> Impostazioni del progetto e seleziona la scheda "Mappa di input". Aggiungi le seguenti azioni di input (vedi InputEvent per i dettagli):

../../_images/movement_inputs.webp

Movimento a 8 direzioni

In questo scenario, vorresti che l'utente prema i quattro tasti direzionali (su/sinistra/giù/destra o W/A/S/D) e si muova nella direzione selezionata. Il nome "8-way movement" (movimento a 8 direzioni) deriva dal fatto che il giocatore può muoversi in diagonale premendo due tasti allo stesso tempo.

Aggiungi uno script al character body e aggiungi il seguente codice:

extends CharacterBody2D

@export var speed = 400

func get_input():
    var input_direction = Input.get_vector("left", "right", "up", "down")
    velocity = input_direction * speed

func _physics_process(delta):
    get_input()
    move_and_slide()

Nella funzione get_input(), usiamo Input get_vector() per verificare i quattro eventi da tastiera e sommarli per restituire un vettore di direzione.

Possiamo poi impostare la nostra velocità moltiplicando questo vettore di direzione, che ha lunghezza 1, per la velocità desiderata.

Suggerimento

Se non hai esperienza di matematica vettoriale, o necessiti di un ripasso, puoi dare un'occhiata alla spiegazione sull'utilizzo dei vettori in Godot in Matematica vettoriale.

Nota

Se il codice sopra non fa niente quando premi i tasti, ricontrolla di aver configurato correttamente le azioni di input come descritto nella sezione Configura di questo tutorial.

Rotazione + Movimento

Questo tipo di movimento viene chiamato a volte "Stile-Asteroids" perché è riconducibile al classico gioco arcade. Premendo sinistra/destra si ruota il personaggio mentre su/giù si muove in avanti o indietro nella direzione in cui sta puntando.

extends CharacterBody2D

@export var speed = 400
@export var rotation_speed = 1.5

var rotation_direction = 0

func get_input():
    rotation_direction = Input.get_axis("left", "right")
    velocity = transform.x * Input.get_axis("down", "up") * speed

func _physics_process(delta):
    get_input()
    rotation += rotation_direction * rotation_speed * delta
    move_and_slide()

Qui abbiamo aggiunto due nuove variabili per monitorare la rotazione e la velocità. La rotazione verrà applicata direttamente alla proprietà rotation del corpo.

Per impostare la velocità, utilizziamo la transform.x del corpo, che è un vettore che punta nella direzione "avanti" del corpo, e la moltiplichiamo per la velocità.

Rotazione + Movimento (mouse)

Questo metodo di spostamento è molto simile al precedente. Questa volta, la direzione è determinata dalla posizione del mouse anziché dalla tastiera. Il personaggio guarderà ("look_at") sempre al puntatore del mouse. Comunque gli input avanti/indietro non varieranno.

extends CharacterBody2D

@export var speed = 400

func get_input():
    look_at(get_global_mouse_position())
    velocity = transform.x * Input.get_axis("down", "up") * speed

func _physics_process(delta):
    get_input()
    move_and_slide()

Qui utilizziamo il metodo di Node2D look_at() per puntare il giocatore verso la posizione del mouse. Senza utilizzare questa funzione, puoi ottenere lo stesso risultato impostando l'angolo come segue:

rotation = get_global_mouse_position().angle_to_point(position)

Clicca e muovi

Questo ultimo esempio utilizza solo il mouse per controllare il personaggio. Cliccando sullo schermo provocherà lo spostamento del giocatore verso la posizione designata.

extends CharacterBody2D

@export var speed = 400

var target = position

func _input(event):
    # Use is_action_pressed to only accept single taps as input instead of mouse drags.
    if event.is_action_pressed(&"click"):
        target = get_global_mouse_position()

func _physics_process(delta):
    velocity = position.direction_to(target) * speed
    # look_at(target)
    if position.distance_to(target) > 10:
        move_and_slide()

Nota la verifica a distance_to() che facciamo prima del movimento. Senza di essa, il corpo "tremolerebbe" una volta raggiunta la posizione di destinazione, in quanto si sposta leggermente oltre la posizione e torna indietro, per poi spostarsi troppo lontano e ripetere il ciclo.

Togliendo il commento alla riga look_at() farà anche girare il corpo per puntare nella direzione del suo movimento, se preferisci.

Suggerimento

Questa tecnica può anche essere utilizzata come base per un personaggio "che segue". La posizione target può essere quella di qualsiasi oggetto si desideri raggiungere.

Riepilogo

Troverai questi esempi di codice utili come punto di partenza per i tuoi progetti personali. Sentiti libero di utilizzarli e sperimentare con questi per scoprire cosa puoi fare.

È possibile scaricare questo progetto di esempio qui: 2d_movement_starter.zip