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.

Ascoltare l'input del giocatore

Continuando dalla lezione precedente, Creare il tuo primo script, diamo un'occhiata a un'altra caratteristica importante di qualsiasi gioco: dare il controllo al giocatore. Per farlo, dobbiamo modificare il nostro codice in sprite_2d.gd.

../../_images/scripting_first_script_moving_with_input.gif

Hai due strumenti principali per elaborare gli input del giocatore in Godot:

  1. I callback di input integrati, principalmente _unhandled_input(). Come _process(), è una funzione virtuale integrata che Godot richiama ogni volta che il giocatore preme un tasto. È lo strumento che si desidera utilizzare per reagire a eventi che non si verificano a ogni frame, come premere Spazio per saltare. Per saperne di più sui callback di input, consulta Utilizzo di InputEvent.

  2. Il singleton Input. Un singleton è un oggetto accessibile globalmente. Godot fornisce l'accesso a numerosi di questi negli script. È lo strumento giusto per verificare gli input a ogni frame.

Qui useremo il singleton Input perché dobbiamo sapere se il giocatore vuole girare o muoversi a ogni frame.

Per girare dovremmo usare una nuova variabile: direction. Nella nostra funzione _process(), sostituisci la riga rotation += angular_speed * delta con il codice seguente.

var direction = 0
if Input.is_action_pressed("ui_left"):
    direction = -1
if Input.is_action_pressed("ui_right"):
    direction = 1

rotation += angular_speed * direction * delta

La nostra variabile locale direction è un moltiplicatore che rappresenta la direzione in cui il giocatore vuole girare. Un valore di 0 significa che il giocatore non sta premendo il tasto della freccia sinistra o destra. Un valore di 1 significa che il giocatore vuole girare a destra, e -1 significa che vuole girare a sinistra.

Per produrre questi valori, introduciamo le istruzioni condizionali e l'utilizzo di Input. Un'istruzione condizionale comincia con la parola chiave if in GDScript e termina con due punti. Nello specifico, la condizione è l'espressione compresa tra la parola chiave e i due punti alla fine della riga.

Per verificare se un tasto è stato premuto in questo frame, chiamiamo Input.is_action_pressed(). Il metodo accetta una stringa di testo che rappresenta un'azione di input e restituisce true se l'azione è stata premuta, false altrimenti.

Le due azioni che usiamo sopra, "ui_left" e "ui_right", sono predefinite in ogni progetto Godot. Si attivano rispettivamente quando il giocatore preme le frecce sinistra e destra sulla tastiera oppure sinistra e destra sul D-pad di un gamepad.

Nota

È possibile visualizzare e modificare le azioni di input nel proprio progetto andando su Project > Project Settings e cliccando sulla scheda Input Map.

Infine, utilizziamo direction come moltiplicatore quando aggiorniamo la rotation del nodo: rotation += angular_speed * direction * delta.

Commenta le righe var velocity = Vector2.UP.rotated(rotation) * speed e position += velocity * delta in questo modo:

#var velocity = Vector2.UP.rotated(rotation) * speed

#position += velocity * delta

Così verrà ignorato il codice, dall'esercizio precedente, che muove la posizione dell'icona in un cerchio senza l'input dell'utente.

Se esegui la scena con questo codice, l'icona dovrebbe ruotare quando premi Sinistra e Destra.

Movimento premendo "su"

Per muoverci solo alla pressione di un tasto, dobbiamo modificare il codice che calcola la velocità. Togliamo il commento dal codice e sostituiamo la riga che comincia con var velocity con il codice seguente.

var velocity = Vector2.ZERO
if Input.is_action_pressed("ui_up"):
    velocity = Vector2.UP.rotated(rotation) * speed

Inizializziamo velocity con un valore di Vector2.ZERO, un'altra costante del tipo integrato Vector che rappresenta un vettore 2D di lunghezza 0.

Se il giocatore preme l'azione "ui_up", aggiorniamo il valore della velocità, facendo muovere in avanti lo sprite.

Script completo

Ecco il file sprite_2d.gd completo per riferimento.

extends Sprite2D

var speed = 400
var angular_speed = PI


func _process(delta):
    var direction = 0
    if Input.is_action_pressed("ui_left"):
        direction = -1
    if Input.is_action_pressed("ui_right"):
        direction = 1

    rotation += angular_speed * direction * delta

    var velocity = Vector2.ZERO
    if Input.is_action_pressed("ui_up"):
        velocity = Vector2.UP.rotated(rotation) * speed

    position += velocity * delta

Se esegui la scena, dovresti riuscire a ruotare con i tasti freccia sinistra e destra e ad andare avanti premendo Su.

../../_images/scripting_first_script_moving_with_input.gif

Riepilogo

Riassumendo, ogni script in Godot rappresenta una classe ed estende una delle classi integrate del motore. I tipi di nodo da cui le classi ereditano danno accesso a proprietà come rotation e position nel caso del nostro sprite. Si ereditano anche molte funzioni, che non abbiamo potuto utilizzare in questo esempio.

In GDScript, le variabili inserite in alto al file sono le proprietà della classe, chiamate anche variabili membro. Oltre alle variabili, è possibile definire funzioni, che, per lo più, saranno metodi della propria classe.

Godot fornisce varie funzioni virtuali che puoi definire per connettere la tua classe al motore. Queste includono _process(), per applicare modifiche al nodo a ogni frame, e _unhandled_input(), per ricevere eventi di input come la pressione di tasti e pulsanti dagli utenti. Ce ne sono molte altre.

Il singleton Input ti permette di reagire all'input del giocatore in qualsiasi parte del tuo codice. In particolare, potrai usarlo nel ciclo _process().

Nella prossima lezione, Utilizzo dei segnali, approfondiremo la relazione tra script e nodi facendo in modo che i nostri nodi attivino codice negli script.