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.

Poslouchání pro hráčský vstup

V návaznosti na předchozí lekci, Vytvoření prvního skriptu, se nyní podívejme na další důležitou funkci každé hry: možnost ji ovládat hráčem. Abychom toto umožnili, musíme upravit náš kód sprite_2d.gd.

../../_images/scripting_first_script_moving_with_input.gif

Godot vám poskytuje dva hlavní nástroje pro zpracování hráčského vstupu:

  1. Vestavěné funkce zpětného volání v reakci na vstup, zejména _unhandled_input() ("nezpracovaný vstup"). Tak jako u _process() jde o vestavěnou virtuální funkci. Godot ji volá pokaždé, když hráč stiskne libovolnou klávesu. Je vhodná pro reagování na události, které se typicky nedějí v každém snímku, jako například stisknutí Mezerník pro skákání. Více se o funkcích zpětného volání při vstupu můžete dovědět v Používání vstupních událostí (InputEvent).

  2. Singleton Input ("vstup"). Singleton je globálně přístupný objekt. Godot poskytuje ve skriptech přístup k několika takovým objektům. Input je vhodný pro kontrolu vstupu v každém snímku.

My nyní využijeme právě singleton Input, protože potřebujeme v každém snímku vědět, jestli se hráč chce pohnout nebo otočit.

Pro otáčení bychom měli využít novou proměnnou: direction (směr). Ve funkci _process() nahraďte řádek rotation += angular_speed * delta následujícím kódem.

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

Naše místní proměnná direction je násobitel představující směr, ve kterém se hráč chce otočit. Hodnota 0 znamená, že hráč nedrží levou ani pravou šipku. Hodnota 1 znamená, že se chce otočit doprava a -1, že se chce otočit doleva.

To produce these values, we introduce conditional statements and the use of Input. A conditional statement starts with the if keyword in GDScript and ends with a colon. The condition is specifically the expression between the keyword and the colon at the end of the line.

Abychom zjistili, zda byla v aktuálním snímku stisknuta klávesa, zavoláme Input.is_action_pressed() ("je akce stisknuta"). Tato metoda vezme textový řetězec představující vstupní akci a vrátí true, pokud je odpovídající akce stisknuta. Pokud tomu tak není, vrátí false.

Dvě akce, které jsme výše použili, "ui_left" a "ui_right", jsou v každém Godot projektu předdefinované. Spouštějí se, když hráč stiskne levou a pravou šipku na klávesnici nebo levé a pravé směrové tlačítko na herním ovladači.

Poznámka

You can see and edit input actions in your project by going to Project > Project Settings and clicking on the Input Map tab.

Nakonec použijeme direction jako násobitel při aktualizaci rotace uzlu: rotation += angular_speed * direction * delta.

Zakomentujte řádky var velocity = Vector2.UP.rotated(rotation) * speed a position += velocity * delta takto:

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

#position += velocity * delta

Tímto budeme ignorovat kód z předchozího cvičení, který posouval pozici ikony v kruhu bez zásahu uživatele.

Když nyní spustíte scénu s tímto kódem a stisknete Doleva nebo Doprava, ikona by se měla otáčet.

Pohyb při stisku "nahoru"

Aby se ikona pohybovala pouze při stisknutí klávesy, musíme dále upravit kód, který vypočítává rychlost. Odkomentujte kód a nahraďte řádek začínající var velocity následujícím kódem.

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

Rychlost velocity nyní inicializujeme na hodnotu Vector2.ZERO. To je další konstanta vestavěného typu Vector a představuje 2D vektor délky 0.

Když hráč stiskne akci "ui_up", aktualizujeme hodnotu rychlosti, což způsobí, že se sprite posune vpřed.

Kompletní skript

Zde je pro vaši kontrolu celý soubor sprite_2d.gd.

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

Spustíte-li scénu nyní, měli byste se moci otáčet pomocí levé a pravé šipky a hýbat se dopředu stisknutím Nahoru.

../../_images/scripting_first_script_moving_with_input.gif

Shrnutí

Pro shrnutí, každý skript v Godotu představuje třídu, která rozšiřuje jednu z vestavěných tříd enginu. Typy uzlů, ze kterých vaše třídy dědí, vám poskytují přístup ke svým vlastnostem, jako je v případě našeho spritu rotace rotation a pozice position. Stojí také za zmínku, že děděny jsou také mnohé funkce, byť ty jsme v tomto příkladu nepoužili.

V GDscriptu jsou proměnné, které umisťujete na začátek souborů, vlastnosti třídy. Říkáme jim také proměnné členy. Mimo proměnné můžete definovat i funkce, které budou z většiny metodami vašich tříd.

Godot poskytuje několik virtuálních funkcí, které můžete definovat a propojit tak vaše třídy s enginem. Patří mezi ně _process(), která na daný uzel aplikuje změny v každém snímku a _unhandled_input(), který přijímá vstupní události, jako je stisknutí kláves a tlačítek uživatelem. Vedle těchto dvou existuje poměrně dost dalších.

The Input singleton allows you to react to the player's input anywhere in your code. In particular, you'll get to use it in the _process() loop.

V příští lekci, Používání signálů, budeme dále stavět na vztahu mezi skripty a uzly tím, že necháme naše uzly spouštět kód ve skriptech.