Říj
02
(LUA, Wherigo Builder) autor: me2d09

První věc co mě štve: CTRL+M, klik, klik, klik, klik, CTRL+E. Nevíte o čem je řeč? V normálních programovacích prostředích se kvůli tomuhle mačká klávesa F5, neboli Run – spusť napsaný program. Ve Wherigo Builderu je na to určená zkratka CTRL+M (Tools -> Publish to my machine). Dále ale musíte odsouhlasit několik naprosto zbytečných oken (na míň než 4 kliky myšítkem to nedávám). Navíc se nespustí emulátor, takže ještě CTRL+E, kliknout na cartridge…uff. Po čase jsem to vyladil v brutální kombo: CTRL+M, TAB, ENTER, ENTER, TAB, ENTER, ESC, CTRL+E, finální kliknutí :) . Vivat Wherigo Builder.

Druhá věc co mě štve: V mých cartridge používám pořád stejné funkce. Nějaké z nich vám v budoucnu ukážu v nějakém dalším článku. Ve většině programovacích jazyků si takové funkce uložíte zvlášť do nějaké knihovny (či aspoň odděleného souboru), aby se v kódu nemotali a lépe se aktualizovali. Při kompilaci programu se taková knihovna nalinkuje a zkompiluje spolu s programem. Wherigo Builder toto neumí a tak mám funkce vždycky napatlané někde v Author function sekci a mám v nich zmatek.

A nyní si ukážeme, jak obě zmíněné věci vyřešit – pomocí příkazu require. Příkaz require se chová podobně jako stejný příkaz v PHP. V každé cartridge máme hned na prvním řádku require „Wherigo“, čímž říkáme, že do kódu se vloží obsah souboru Wherigo (obsahuje objektový model Wherigo prostředí, není nikde přístupný). Obdobně lze do kódu nalinkovat i vlastní soubor. Jak na to?
V adresáři, kde máte svou cartridge (uložená v souboru cart.lua) vytvoříme prázdný soubor a pojmenujeme ho functions.lua. Poté si otevřeme (třeba v PSPadu) náš soubor cart.lua (vytvořený ve Wherigo Builderu) a skoro úplně na začátku doplníme do sekce author directives:

-- #Author Directives Go Here# --
require "functions"
-- #End Author Directives# --

Nezapomeneme soubor uložit. Do souboru functions.lua pak zapíšeme své oblíbené funkce, například:

function Pozdrav()
    Wherigo.MessageBox("Ahoj kamarade!");
end

Poté přepneme do Wherigo Builderu, dáme cartridge znovu načíst (dělali jsme v lua souboru změny). Pak už jen stačí vytvořit Character kamarad, přiřadit mu akci mluv a k ní vytvořit script (new script…) - necháme ho prázdný. Vypadá to pak nějak takto:

kamarad_mluv[1]

Cartridge uložíme (CTRL+S) a otevřeme znovu soubor cart.lua např. ve zmíněném PSPadu. V něm najdeme následující řádek a do něj doplníme volání naší funkce:

function zcharacterkamarad:Onmluv()
-- #GroupDescription=Script --
-- #Comment=Script Comment --
  Pozdrav();
end

Tak a to je vše. Provedeme to strašnou klávesovou kombinaci zmíněnou v úvodu, spustíme emulátor a v něm dáme promluvit s kamarádem. Sláva, funguje to! Zobrazí se nám zpráva definovaná v linkovaném souboru functions.lua. Vezmeme teď GWC soubor, nahrajeme ho do Oregona, spustíme a promluvíme si s kamarádem – error! Jak to, že to v emulátoru tak pěkně šlo a teď to nejde? Je třeba si uvědomit, co přesně příkaz require dělá. Pokud jste četli první díl seriálu o LUA, víte že LUA je scriptovací jazyk a jako takový se nijak nekompiluje. GWC soubor není zkompilovaný program, ale pouze strukturovaný file, obsahující LUA script, přídavná multimédia a nějaké informace. Pokud tedy v Builderu vybereme možnost Compile a cartridge, nejedná se o žádnou skutečnou kompilaci, ale pouze o vytvoření GWC souboru – pojmenování publish cartridge je zde mnohem vhodnější.

Wherigo Builder není tak chytrý, aby se podíval do author directives sekce a přidal do GWC i ostatní requirované soubory. Námi vytvořený soubor cart.gwc tedy neobsahuje intrukce, které jsme napsali do souboru functions.lua. Počkat! Jak to že nám tedy cartridge fungovala v emulátoru? Je to proto, že emulátor vždy při spuštění cartridge, prohledává aktuální adresář a poté ještě domovský adresář builderu (většinou C:\Program Files\Groundspeak\Wherigo\Builder), jestli se v nich nevyskytuje requirovaný soubor. Pokud ho nalezne, nalinkuje ho s aktuálním scriptem a vesele běží.

Tato vlastnost emulátoru vnáší do tvorby cartridgí skvělou výhodu. Spusťte naši cartridge znovu v emulátoru, promluvte s kamarádem. Cartridge v emulátoru zavřete (jen cartridge, emulátor nechte spuštěný). Otevřete si soubor functions.lua a přepište v něm hlášku Ahoj kamaráde na Ahoj zkušený LUA programátore a uložte. Nyní stačí ve stále zapnutém emulátoru otevřít naší cartridge, promluvit s kamarádem … a zobrazí se námi změněný text!

Závěr:

  1. Používejte příkaz require
  2. Soubor functions.lua si uložte do adresáře C:\Program Files\Groundspeak\Wherigo\Builder (zkrátka tam kde máte builder nainstalovaný). Ve Vistě a novějších místo toho používejte adresář C:\Users\[vase_username]\AppData\Local\VirtualStore\Program Files\Groundspeak\Wherigo\Builder. V tomto souboru si pak snadno můžete udržovat knihovničku vlastních používaných funkcí/objektů.
  3. Pokud ladíte nějakou složitější funkci, pište jí v requirovaném souboru. Ušetříte si tu ďábelskou klávesovou zkratku nutnou k Publish cartridge, neboť jak už víme LUA se nekompiluje.
  4. Před publikací cartridge je třeba smazat require příkaz (házel by chybu) a celý kód z functions.lua vložit do sekce Author script v hlavním lua souboru. GWC soubor neobsahuje requirované soubory.

To je pro dnešek vše, příště si něco povíme o ochraně cartridge před podvodníky.

VN:F [1.9.5_1105]
Hodnocení: 5.0/5 (celkem 2 hlasů)
Kouzelný příkaz require, 5.0 out of 5 based on 2 ratings
Sdílej s přáteli:
  • Facebook
  • Twitter
  • Digg
  • del.icio.us
  • Google Bookmarks


Komentáře:
4 komentářů k článku "Kouzelný příkaz require"
matejcik napsal 3. 10. 2009 v 1:22

ale kompiluje, ale kompiluje. GWC rozhodně neobsahuje zdroják, nýbrž zkompilovaný bytecode.
to, že require funguje takhle, je taková magie ;e)

dokonce někteří šikovní lidé zvládli do gwc souboru jako media přidat další soubor s bytecodem a requirovat ho tak. (ale tuším že to fungovalo jen na PPC)


me2d09 napsal 3. 10. 2009 v 8:37

matejcik: Tohle je hodně o terminologii, přiznávám, že jsem to do článku napsal dosti ledabyle. Ve skutečnosti: LUA se prekompiluje do LUA bytecode (což je jak víš jednoduše vratná operace – třeba pomocí luadec, kahlua…). Tím že se nekompiluje jsem myslel, že se nekompiluje do pomocí ANSI C do assembleru (což taky lze). Ale je pravda že obojí se dá nazvat kompilace :) . Magie to zase taková není, myslím že kdybych functions.lua zkompiloval do functions.luac (nebo lbc?) tak by to player zchroustal taky…

Hmm, četl jsem o pokusu přidat txt soubory kvůli jazykovým verzím, i jsem to zkoušel, ale dávat tam zkompilovaný soubor ještě ne :) . Bylo by super, kdyby to šlo, ale Colorado engine se zdá neumí tyhle soubory načítat – i když přes require jsem to nezkoušel, jen přes file open.


me2d09 napsal 4. 10. 2009 v 15:32

UPDATE: tak když soubor functions.lua zkompilujeme do LUA bytecode (já použil utilitku luac.exe), tak to Wherigo builder vezme taky a soubor requiruje. Jen mě nenapadá žádné rozumné použití :) . Na Garminech zkouším všechno možné, ale příkaz require se mi nedaří rozběhat.


matejcik napsal 5. 10. 2009 v 23:58

garmini totiž mají zřejmě úplně nefunkční io knihovnu, a ta je potřeba i na requirování…

tou magií jsem myslel spíš to, že zrovna ta lua, která je v playeru, obsahuje kromě VM i interpret (tedy kompilátor), což třeba kahlua nemá – a umí tedy requirovat skripty i bytecode …

…no to je jedno, my dva si asi rozumíme a pro tvůrce to nemá praktický dopad :e)


Zaslat komentář


8 - = seven

Jméno: 
Email: 
URL: 
Text komentáře: