Trocha kódu pro začátečníky v GML
Psal jsem právě kousek celkem rutinního kódu a přestože ho zkušenější programátor vytvoří levou zadní, aniž by musel přemýšlet, napadlo mě: „Co bych před lety dal za kus česky komentovaného slušného kódu…„. A protože kód je to pěkný, tak se podělím.
Tak konečně prozradím, o co jde. Řekněme, že máme nějaký objekt, nasázeli jsme do roomu několik jeho instancí ( kdo neví, co je instance, může si to představit jako klony ). Teď chceme, aby po kliknutí na některou z instancí, se ta jedna nějak označila ( jako že je vybraná ). Po opětovném kliknutí na označenou se zase odznačí. Ale nechceme, aby jich bylo označeno víc než právě jedna, takže při označení jedné, musíme jakoukoli jinou označenou také odznačit. Já jsem to měl na takové lišty s textem. Objekt jenom jeden, texty různé a výběr klikáním.
Příprava:
Je zapotřebí vytvořit jeden sprite s dvěma snímky.
Snímek nula bude obrázek „nevybráno“ a
snímek jedna bude obrázek „vybráno“. – Nepoplést pořadí!
Může to být cokoli. Já měl destičku a destičku s bílým okrajem.
Dáme mu jméno třeba muj_sprite.
Vytvoříme nový objekt ( muj_objekt ) a přiřadíme mu muj_sprite.
Vytvoříme nový room a nasázíme do něj několik instancí objektu muj_objekt, třeba osm kousků.
Tím je příprava hotova.
Kód:
V objektu muj_objekt založíme událost Create, do ní dáme ikonu execute code, která umožní psát GML ( dále už budu psát jen „vložíme kód“ ). Ikonu naplníme následujícím kódem. Událost Create se spouští ve hře jen jednou a to hned na začátku, když instance vznikne. V našem případě prakticky hned po spuštění hry.
// za lomítky je vždy komentář, ten netřeba opisovat 🙂
//Pokud je na prvním řádku trojlomítko a text,
// objeví se ten text v popisce ikony.
Create:
///Začíná ve stavu „nevybráno“
vybrano=false; // true a false znamenají stav ANO/NE neboli 0/1.
//konec kódu Create – ano jenom tak málo. 🙂
Založíme událost Left Released se symbolem myši. Ta nastává vždy, když hráč klikne myší na danou instanci. Spustí se samozřejmě kód jen v té jedné ( kliknuté ) instanci.
Left Released:
///Přepnutí vybráno / nevybráno
//Tento rádoby složitý kód dělá to,
//že nastaví všechny instance ( příkaz with ) na nevybráno,
//v případě, že kliknutá instance byla dosud nevybraná
//a bude tedy po kliknutí jediná vybraná.
if vybrano==false { with (muj_objekt) { vybrano=false; } }
//Tento kód změní true na false a na naopak.
vybrano=!vybrano;
//konec kódu Left Released
Založíme událost Draw, která nastává mnohokrát za vteřinu a během ní se vykresluje sprite zvolený v objektu jako základní. My to teď změníme tím, že do Draw napíšeme vlastní kód.
Draw:
///Vykreslení snímku 0 nebo 1 podle vybráno-nevybráno.
//Využijeme toho, že true a false je v GML také 0 a 1
//a místo čísla snímku na druhé pozici dáme naše vybrano.
//Příkaz draw sprite prostě vykreslí sprite do polohy x,y
//což je místo, kde instance v místnosti leží.
//Tedy není třeba hledat nic číselně.
draw_sprite(sprite_index,vybrano,x,y);
//konec kódu Draw
No, hotovo a ani to nebolelo.
Stačí spustit a mělo by vše fungovat, jak má.
Tak si to užijte. 🙂
TomBen
PS: komu se nechce tvořit sprite, může si stáhnout tento:
9 komentářů
+1, to je asi všechno co můžu napsat.
Pro začátečníky snad užitečné.
Nečekal jsem to, ale dověděl jsem se tam vlastně dost novinek. 🙂 Například ten zápis vybrano=!vybrano; jsem vůbec neznal.
A trojlomítko (respektive jak dosáhnout dané věci) mi dlouho vrtalo hlavou. 🙂
Za mě srozumitelné a obohacující. Takže super! 🙂
Díky. Přesně v tenhle efekt jsem doufal. I když je to jednoduché a začátečnicky srozumitelné, jsou tam dvě, tři věci, které začátečníci skoro nikdy nenapíší správně.
PS: trojlomítko v začátku scriptu zase dělá nápovědu do našeptávače
Teda ale Jindro, to ti chybí základní znalosti z programování! 😀
Jinak Tombene, tenhle řádek mi přijde pro úplné laiky matoucí:
Nebylo by lepší to rozepsat trošku víc, ať je to přehlednější a člověk pochopí, co závorky znamenají?
Jestli to tedy takhle v GML jde, už jsem to delší dobu neviděl. 🙂
Jj, takhle to v GML jde. 🙂 A ano, já se za programátora nepovažuji, takže základy mi zcela jistě chybí. 😀
Paradoxní je, že zrovna v GM to může být výhoda. Otevřít a spustit Lovce krys ve studiové verzi nebyl nejmenší problém, přestože původní Lovec krys vznikal snad ještě v sedmičkové verzi (mám uložené soubory v .GMD, pravda pak i soubory v .GMK a z doby před dvěma lety soubory v .GM81), ale fakt, že většina věcí byla v ikonkách znamenal, že se měnilo jen zadání souřadnic viewu, odmazala se úprava GM tabulky a jinak vlastně všechno běželo normálně. Dneska už se s ikonkami v GM nedá pracovat. Původní Lovec krys jich měl skutečně třeba 300+ v jednom eventu, což současné GM nezvládá (následkem čehož se v tom ještě hůř orientuje, když se to najednou celé cukne nebo na třicet vteřin zasekne), takže se to musí převést do kódu, ale stejně: otevřít bez problému hru starou deset let, to je parádní!
Určitě není problém v GML odřádkovat skoro cokoli, ale pokud se příkaz vejde rozumně na jeden řádek, tak to radši píšu takto. Když je totiž kódu hodně, je nakonec vždycky přehlednější skript, který nemusím moc rolovat. Myslím, že je to o zvyku. Někomu přijdou přehledné odřádkované ify, někomu ne. Někdo používá na všechno for, jiný while. Asi bych to tak nechal, pokud to vysloveně něčím neškodí.
Nepochopils mou myšlenku, já neříkám, že je špatně, abys to tak psal. Piš si to jak chceš, já bych to ostatně napsal kombinací „? : ;“ a LINQu na jeden řádek. 🙂 Šlo mi o to, pokud to má být tutoriál, aby to bylo co nejprimitivnější z hlediska pochopitelnosti. 🙂
V pohodě. On je ten řádek jediné složitější místo a popravdě by si zasloužil několik odstavců textu, abych vysvětlil podmínky, závorky a zacházení příkazu with s instancemi. Článek je bohužel jen takový výkřik do tmy. Logičtější by bylo psát řadu tutoriálů s postupně rostoucí složitostí.
Je to takové elementární… ale můžu napsat více podobných fičur do dalšího dílu svých postřehů 🙂