Načítání skriptu hrou, aneb co je potřeba

Jedna z nemála důležitých znalostí pro skriptera je, jak pracuje hra s jeho skriptem a jakou metodou spouští různé callbacky. Díky tomu můžeme dosáhnout vysoké efektivity. Zde si popíšeme jak vytvořit skript do hry a co ho vlastně načítá a kde. Začneme vytvořením struktury skriptu.

Vytvoření souboru se skriptem a jeho obsah

Všechny skripty ve hře jsou uložené do souborů *.lua. Tyto soubory jsou načítány a zpracovávány po spuštění hry do spustitelné podoby. Soubor *.lua je jednoduché vytvořit.

  1. V Notepadu++ (nebo jiném textovém editoru) vytvořte nový dokument
  2. Tento dokument si uložíme do složky se strojem (někde tam)
  3. Dokument pojmenujte třeba mujskript.lua (nesmíme použít diakritiku a speciální znaky)
  4. Máme hotovo

Takto máme vytvořen soubor, do kterého pak budeme zapisovat jednotlivé instrukce (kód) pro hru.

Každý soubor se skriptem pro stroj/zařízení musí mít záklaní sadu callbacků a nějakou třídu přes kterou k nim budeme přistupovat. Uvedu zde příklad a popíšeme si ho.

1
2mujSkript = {};
3
4function mujSkript.prerequisitesPresent(specializations)
5 return true;
6end;
7
8function mujSkript:load(xmlFile)
9 print("Nacetl jsem stroj!");
10end;
11
12function mujSkript:mouseEvent(posX, posY, isDown, isUp, button)
13end;
14
15function mujSkript:keyEvent(unicode, sym, modifier, isDown)
16end;
17
18function mujSkript:update(dt)
19end;
20
21function mujSkript:updateTick(dt)
22end;
23
24function mujSkript:draw()
25end;

Jako první musíme vytvořit třídu pro skript. Jelikož Lua je velice zjednodušení, jsou třídy vytvářeny pomocí tzv. tabulek. Nám zatím postačí to, že takovou třídu vytvoříme pomocí nazevSkriptu = {};, kde název skriptu je cokoli, co je bez diakritiky a nezačíná číslem (jako proměnné ke kterým se dostanem později). Složené závorky ({}) pak označují tabulku. (Řádek 2)

Jako další je soupis callbacků pro hru. Každá s funkcí/metod (které jsou volány jako callbacky) se deklaruje klíčovým slovem function. Některé musí vracet hodnotu (většinou o úspěchu - true - a nebo neúspěchu - false). V následujícím seznamu popíšu povinné funkce/metody které nesmí chybět v žádném skriptu.

  1. prerequisitesPresent - funkce volaná na začátku hry, která ověřuje, zda se v typu vozidla vyskytujou všechny požadované skripty. Vstupním parametrem je specializations - tedy tabulka se všemi specializacemi stroje. V našem případě je klíčovým slovem return vracen úspěch (true)
  2. load - metoda která se volá při načtení stroje. Buď při koupi a nebo při načtení ze savu. Vstupním parametrem je xmlFile, tedy xml soubor stoje.
  3. mouseEvent - callback spouštěn při pohybu myši a její události. Vstupnímy parametry jsou posX, posY, isDown, isUp, button - posX a posY jsou pozice myši na obrazovce. isDown, isUp jsou stavy tlačítka. button je ID tlačítka na myši.
  4. keyEvent - callback na události klávesnice. Vstupními parametry jsou unicode, sym, modifier, isDown. Unicode je kód znaku v Unicode a isDown je status klávesy stiknutá/nestisknutá. Zbylé 2 parametry nepoužívám
  5. update - metoda volaná při každém updatu hry (kolik FPS, tolikrát je volaná za vteřinu). Vstupní parametr dt je počet milisekund od posledního updatu.
  6. updateTick - metoda volaná při každém updatu hry (kolik FPS, tolikrát je volaná za vteřinu). Vstupní parametr dt je počet milisekund od posledního updatu.
  7. draw - metoda určená pro výpis textu na obrazovku, a nebo render layoutů. Nemá vstupní parametry

Ještě bych rád podotkl, že vstupní parametry u funkcí/metod se nesmějí zaměňovat. Lze je ovšem přejmenovat, ale v takovém případě může vzniknout něco naprosto nepřehledného. K funkcím (zde jen jedna) přistupujeme pomocí tečky (.) a k metodám pomocí dvojtečky (:). Před přístupovým znakem je název skriptu a za je název metody/funkce

Vysvětlení zápisu a registrace v modDesc.xml

Pokud máme takto vytvořený skript, pak už ho můžeme velmi jednoduše vložit do stroje přes typy vozidel. Samotný skript se zapisuje do tagu <specializations> pod dceřiným tagem <specialization>. například <specialization name="MujNazevSpecializace" className="mujSkript" filename"MujSkript.lua"/>.

Nyní si rozebereme atributy. Atribut name určuje název skriptu pro pozdější použití v xml - nezasahuje do ničeho jiého jen do modDesc.xml. Atribut className je už o hodně důležitější - určuje třídu v souboru filename od které se má vytvořit instance a kde má hra posílat callbacky.

To by mohlo být vše pro tento díl našeho výukového seriálu. Příště se podíváme na komentáře a proměnné v jazyce Lua.

Související video

Soubory ke stažení

  1. mujskript.lua