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.

Vytvoření prvního skriptu

In this lesson, you will code your first script to make the Godot icon turn in circles. As we mentioned in the introduction, we assume you have programming foundations.

This tutorial is written for GDScript, and the equivalent C# code is included in another tab of each codeblock for convenience.

../../_images/scripting_first_script_rotating_godot.gif

Viz také

To learn more about GDScript, its keywords, and its syntax, head to the GDScript section. To learn more about C#, head to the C#/.NET section.

Příprava projektu

Vytvořte prosím nový projekt, abychom začali s čistým štítem. Váš projekt by měl obsahovat jeden obrázek: ikonu Godotu, kterou v komunitě často používáme při prototypování.

../../_images/scripting_first_script_icon.svg

We need to create a Sprite2D node to display it in the game. In the Scene dock, click the Other Node button.

../../_images/scripting_first_script_click_other_node.webp

Do vyhledávacího pole zadejte "Sprite2D", čímž vyfiltujere uzly a dvojitým kliknutím na Sprite2D vytvořte uzel.

../../_images/scripting_first_script_add_sprite_node.webp

Your Scene tab should now only have a Sprite2D node.

../../_images/scripting_first_script_scene_tree.webp

A Sprite2D node needs a texture to display. In the Inspector on the right, you can see that the Texture property says <empty>. To display the Godot icon, click and drag the file icon.svg from the FileSystem dock onto the Texture slot.

../../_images/scripting_first_script_setting_texture.webp

Poznámka

Uzly Sprite2D můžete také vytvářet automaticky přetažením obrázků do průzoru.

Potom přetáhněte ikonu v průzoru a vycentrujte ji v herním zobrazení.

../../_images/scripting_first_script_centering_sprite.webp

Vytvoření nového skriptu

To create and attach a new script to our node, right-click on Sprite2D in the Scene dock and select Attach Script.

../../_images/scripting_first_script_attach_script.webp

The Attach Node Script window appears. It allows you to select the script's language and file path, among other options.

Change the Template field from Node: Default to Object: Empty to start with a clean file. Leave the other options set to their default values and click the Create button to create the script.

../../_images/scripting_first_script_attach_node_script.webp

Poznámka

Názvy C# skriptů se musí shodovat s názvem jejich třídy. V tomto případě byste soubor měli pojmenovat MySprite2D.cs.

The Script workspace should appear with your new sprite_2d.gd file open and the following line of code:

extends Sprite2D

Každý GDScript soubor je implicitně třídou. Klíčové slovo extends ("rozšiřuje") definuje třídu, kterou tento skript dědí nebo rozšiřuje. V tomto případě je to Sprite2D, což znamená, že náš skript získá přístup ke všem vlastnostem a funkcím uzlu Sprite2D, včetně tříd, které rozšiřuje Sprite2D, jako Node2D ("2D uzel"), CanvasItem ("předmět plátna") a Node ("uzel").

Poznámka

Pokud v GDScriptu vynecháte řádek s klíčovým slovem extends, vaše třída implicitně rozšíří RefCounted ("počítaný podle odkazů"), který Godot používá ke správě paměti vaší aplikace.

Inherited properties include the ones you can see in the Inspector dock, like our node's texture.

Poznámka

By default, the Inspector displays a node's properties in "Title Case", with capitalized words separated by a space. In GDScript code, these properties are in "snake_case", which is lowercase with each word separated by an underscore.

You can hover over any property's name in the Inspector to see a description and its identifier in code.

Ahoj, světe!

Náš skript aktuálně nic nedělá. Pro začátek jej necháme vypsat text "Ahoj, světe!" do na spodního panelu Výstup.

Přidejte do skriptu následující kód:

func _init():
    print("Hello, world!")

Pojďme si ho rozebrat. Klíčové slovo func definuje novou funkci s názvem _init. To je speciální název pro konstruktor naší třídy. Pro každý objekt nebo uzel, kterému definujete _init(), zavolá engine tuto funkci při jeho vytvoření v paměti.

Poznámka

GDScript je jazyk založený na odsazení. Tabulátor na začátku řádku print() ("tisknout"), je pro fungování kódu nezbytný. Pokud jej vynecháte nebo řádek neodsadíte správně, editor jej zvýrazní červeně a zobrazí následující chybovou zprávu: "Expected indented block after function declaration".

Save the scene as sprite_2d.tscn if you haven't already, then press F6 (Cmd + R on macOS) to run it. Look at the Output bottom panel that expands. It should display "Hello, world!".

../../_images/scripting_first_script_print_hello_world.webp

Smažte funkci _init(), aby vám zůstal pouze řádek extends Sprite2D.

Otáčení

It's time to make our node move and rotate. To do so, we're going to add two member variables to our script: the movement speed in pixels per second and the angular speed in radians per second. Add the following after the extends Sprite2D line.

var speed = 400
var angular_speed = PI

Proměnné členy umisťujeme do horní části skriptu; za řádkem "extends", ale před funkcemi. Každá instance uzlu, ke které je připojen tento skript, bude mít svou vlastní kopii vlastností speed ("rychlost") a angular_speed ("úhlová rychlost").

Poznámka

S úhly v Godotu pracujeme zpravidla v radiánech. Pokud dáváte přednost výpočtu úhlů ve stupních, máte k dispozici vestavěné funkce a vlastnosti.

Abychom naši ikonu rozhýbali, musíme v každém snímku smyčky hry aktualizovat její polohu a otočení. K tomu můžeme použít virtuální funkci _process() třídy Node. V jakékoli třídě, která rozšiřuje třídu Node (jako to dělá i Sprite2D) a definujete v ní tuto funkci ji Godot zavolá v každém snímku a předá jí argument s názvem delta, což je čas, který uplynul od minulého snímku.

Poznámka

Hry fungují tak, že ve smyčce vykreslují mnoho obrázků (kterým říkáme snímky) za sekundu. Rychlost, jakou hra produkuje obrázky, měříme ve snímcích za sekundu (frames per second, FPS). Většina her usiluje o 60 FPS, i když na pomalejších mobilních zařízeních můžete najít i čísla jako 30 FPS, nebo naopak 90 až 240 pro hry ve virtuální realitě.

Vývojáři enginu a her se snaží herní svět aktualizovat a vykreslovat obrázky v konstantním časovém intervalu, ale v době vykreslování snímků vždy existují malé odchylky. Proto nám engine poskytuje tuto hodnotu času delta, díky čemuž je náš pohyb nezávislý na naší snímkové frekvenci.

Ve spodní části skriptu definujte tuto funkci:

func _process(delta):
    rotation += angular_speed * delta

Klíčové slovo func definuje novou funkci. Po něm musíme napsat název funkce a do závorek její argumenty. Definici ukončuje dvojtečka a odsazené řádky, které následují definici, jsou její instrukce.

Poznámka

Všimněte si, že _process() a _init() začínají úvodním podtržítkem. Podle konvence začínají podtržítkem všechny virtuální funkce Godotu. To jsou vestavěné funkce, které můžete přepsat pro komunikaci s enginem.

Řádek uvnitř funkce, rotation += angular_speed * delta, zvyšuje hodnotu rotace našeho spritu v každém snímku. rotation je zde vlastnost zděděná z třídy Node2D, kterou Sprite2D rozšiřuje. Řídí rotaci našeho uzlu a pracuje s radiány.

Tip

In the code editor, you can Ctrl + Click (Cmd + Click on macOS) on any built-in property or function like position, rotation, or _process to open the corresponding documentation in a new tab.

Spusťte scénu a uvidíte, jak se ikona Godotu otáčí na místě.

../../_images/scripting_first_script_godot_turning_in_place.gif

Poznámka

V C# si všimněte, že argument delta funkce _Process() je typu double (desetinné číslo s dvojitou přesností). Když jej aplikujeme na rotaci, musíme jej nejprve převést na float (desetinné číslo s jednoduchou přesností).

Pohyb vpřed

Nyní náš uzlu rozpohybujeme. Do funkce _process() přidejte následující dva řádky a ujistěte se, že nové řádky jsou odsazeny stejným způsobem jako řádek rotation += angular_speed * delta před nimi.

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

position += velocity * delta

Jak jsme již viděli, klíčové slovo var definuje novou proměnnou. Pokud jej umístíte na začátek skriptu, definuje vlastnost třídy. Uvnitř funkce definuje místní proměnnou, která existuje pouze v rámci rozsahu funkce.

Definujeme místní proměnnou s názvem velocity ("rychlost") jako 2D vektor, který představuje směr a rychlost. Aby se uzel posunul vpřed, začneme konstantou třídy Vector2 Vector2.UP, což je vektor směřující nahoru. Ten otočíme voláním metody Vector2 rotated() ("otočený"). Tento výraz, Vector2.UP.rotated(rotation), je vektor směřující dopředu vzhledem k naší ikoně. Vynásobeno vlastností speed nám to dává rychlost, kterou můžeme použít k pohybu uzlu dopředu.

Přičteme velocity * delta k position ("pozici") uzlu, abychom jej posunuli. Samotná pozice je typu Vector2, což je vestavěný typ Godotu představující 2D vektor.

Spusťte scénu a uvidíte hlavu Godotu běhat v kruhu.

../../_images/scripting_first_script_rotating_godot.gif

Poznámka

Takový pohyb uzlu nebere v úvahu kolize se stěnami nebo podlahou. V návodu Vaše první 2D hra se naučíte jiný přístup k pohybování objektů se současnou detekcí kolizí.

Náš uzel se aktuálně pohybuje sám od sebe. V příští části, Poslouchání pro hráčský vstup, použijeme k jeho ovládání hráčský vstup.

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):
    rotation += angular_speed * delta

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

    position += velocity * delta