5. díl - TomBenova Akademie v Game Makeru: Lenost vynalezla kolo

Ostatní jazyky GameMaker Základy TomBenova Akademie v Game Makeru: Lenost vynalezla kolo

TomBenova akademie v GameMakeru

V minulém díle jste se dozvěděli, jak použít události a akce. Teď bych určitě mohl probírat jednu hromádku ikon po druhé a pěkně bychom do toho zabředli. Ne. Myslím, že teď je důležité něco docela jiného než závody v klikání ikon. Podívejte se zpátky na Xylofon z minulého dílu a taky na animovaná kola na vodě z dílu o grafice. Jsou to sice možná pěkné kousky, ale mají jednu totální vadu: Otrocké klikání!

Lenost vynalezla kolo!

Abych to trochu vysvětlil než vytvořím bezduchého slovního strašáka. Představte si, že máte přichystaný objekt a potřebujete ho do místnosti umístit desetkrát. „To je ale jednoduché! Prostě ho tam 10x kliknu“, říkáte si. Ale co když to bude třeba stokrát nebo pětsetkrát? Pořád budete klikat? To se připravte na mozoly, křeče a syndrom karpálního tunelu (wiki link). Takhle to prostě nedělejte. Programování je tady od toho, aby člověk nemusel makat. Počítač je sice hloupý, ale zato velice vytrvalý a poměrně rychlý. Je proto veliký rozdíl mezi tím, co naklikáte ručně v Game Makeru předem (ve fázi designu) a co necháte vytvořit až za běhu programu, tzv. runtime. Vždycky se na začátku zamyslete, co necháte počítač vytvořit za běhu a co mu předklikáte. Tuhle úvahu nevynechejte u žádné hry ani programu, co kdy budete dělat. A buďte líní! Hlavním motorem programování je a vždycky byla právě lenost. Bez ní bychom dodnes opisovali archy se strojovým kódem a po taškách nosili děrné štítky. Svět se vždycky změnil jen proto, že se někomu něco nechtělo dělat. (nesmíte být ovšem líní myslet)

Cvičení

Vytvoříme 50.000 objektů. (slovy padesát tisíc)

Je jasné, že tohle byste ručně klikali do soudného dne. Využijeme proto vytváření za běhu programu, kde nastavíme, že se během události Step budou tvořit instance objektu samy. Ano, správně. Počítač bude „klikat“ za vás a vy se budete jen koukat, jak mu to jde. :-)

  • vytvořte si nějaký sprite velikosti cca 10x10 nebo menší
  • vytvořte objekt s názvem red (já měl sprite v červené barvě a red je pěkně krátké slovo) a přidělte mu zmíněný sprite. Jinak s tím objektem nedělejte nic. Žádné události, žádné akce. Ani ho vůbec nedávejte do místnosti.
  • vytvořte druhý objekt a nazvěte ho tvurce. Vím, že míchám angličtinu a češtinu. Klidně to dělejte taky. Vybírejte ze všech jazyků, které umíte ta nejkratší a nejvýstižnější slova. Jen se vyhněte diakritice, speciálním znakům a mezerám ve slovech. (pro oddělování slov používejte podtržítko _ nebo střídání velkých a malých písmen ... TotoJeMujNazev001 )
  • objekt tvurce nebude mít žádný sprite (a nebude tudíž po spuštění programu vidět). Vytvořte v něm události Create a Step. Ta první se spouští jednou a to krátce po startu, druhá se spouští pořád, dokud program běží a objekt tvurce existuje. (pozn. spouští se pro každou instanci, takže kdyby byl objekt v místnosti 4x akce v jeho stepu budou provedeny v každém z nich – tedy 4x za step)
  • V Create přidejte akci Set Variable. To bude takové počitadlo, které bude vědět, kolik toho zbývá udělat. Název (horní řádek) dejte písmeno N a hodnotu (value) dejte 50000 (za běhu se pak bude postupně snižovat o jedna s každou vytvořenou instancí). Variable (proměnná) je způsob jak si objekt může „pamatovat“ nějakou hodnotu – číslo nebo text.
  • Ve Stepu přidejte akci Test Variable a vyplňte ji takto:

    variable: N

    value: 1

    operation: smaller than

Je to tzv. podmínka a pokud za ni dáte nějakou akci, provede se jen tehdy, když je podmínka splněna. Když je u ní akcí víc než jedna, musíte je uzavřít shora a zdola do trojúhelníků Start Block a End Block. Podmínka bude kontrolovat, jestli naše počitadlo menší než jedna. Jinými slovy: "Pokud zbývá méně než jedna instance k výrobě, proveď následující akci".

  • Za podmínku posadíme zmíněné trojúhelníky a mezi ně umístíme akci Destroy Instance. V této akci se nemusí nic nastavovat. Ta prostě zlikviduje tvurce, pokud už bylo vyrobeno dost. Destroy instance znamená pro objekt spáchat harakiri. Zvykněte si uklízet v programech všechno, co už nepotřebujete. Objekt tvurce poté co dotvořil nemá co dělat a je třeba aby uvolnil paměť počítače i strojový čas, který GM spotřebuje ke kontrole toho, že objekt nic nedělá.
  • Za trojúhelník konce bloku posadíme další modrou osmihrannou ikonu. Bude mít název Else. Akce za ní se provede jen tehdy, pokud předchozí podmínka splněna naopak nebyla. U každé podmínky se vždycky zamyslete, co by měl program dělat, když se podmínka nesplní. Uvědomte si, že na rozdíl od člověka, který se bez pokynů obvykle rozhodne nedělat nic, program "nedělat nic" neumí. Vždycky bude něco dělat a jediný rozdíl je, zda to vy budete mít pod kontrolou nebo ne. Else nemůže být bez předchozí podmínky a znamená „v opačném případě udělej...“.
  • Za Else dejte akci Create Instance. Ta bude tvořit objekt red a jediné co musíme, je sdělit, kde na obrazovce si instanci přejeme mít. My musíme měnit místo vytvoření podle toho, kolikátou instanci tvoříme – podle hodnoty N. Tady přijde na řadu kousek "složité" matematiky a proto pokud nejste budoucí matfyzák nebo podobně, přeskočte kurzívu a pokračujte prostým vyplněním řádků ikony.

Operátor mod (čili modulo) dává zbytek po dělení a div dává výsledek dělení zaokrouhlený k nejbližšímu celému číslu. Platí, že A mod B = A-(A div B)*B. Modulo je šikovný operátor, který se často používá když chceme, aby nějaké číslo nebylo vyšší než přípustná hodnota. N mod 10 bude dávat hodnoty menší než deset vždycky. Pokud je N naplněno řadou a, a+1,a+2.. bude ji modulo měnit na 0,1,2,3,4,5,6­,7,8,9,0,1,2,3,4,5,6,7,8­,9,0,1..atd. Níže uvedený vzorec pro x vlastně rozdělí padesátitisícový dav objektů na řady po 220 a div posune řádek kdykoliv je konec řady a tedy překročena hodnota 220. S čísly si můžete později zaexperimentovat. Nebojte se ničeho, save to jistí.

Vyplnění ikony Create Instance:
object: red
x: (N mod 220)*5
y: (N div 220)*2
relative: ano – zaškrtnuto (díky relative bude vykreslování mít pravý horní roh tam, kde položíte do místnosti objekt „tvurce“)

  • Zbývá poslední ikona a tou je zase Set Variable, kterou nastavíte takto:

    variable: N

    value: -1

    relative: ano – zaškrtnuto

Díky zaškrtnutí relative se bude snižovat počitadlo o 1 během každého stepu. Je to tedy mínus jedna relativně k původnímu obsahu počitadla.

Místnost si vyrobte 1135x550, aby se tam všechno vešlo.
Room_speed nastavte na 500.
Objekt „tvurce“ položte do pozice xy(16,16)
a dbejte na to, aby tam byl jen v jedné kopii.

HOTOVO!

Teď si to pusťte a... můžete jít na oběd. :-) Protože jak sami vidíte, jede to neskutečně pomalu a teď možná slabší povahy začnou proklínat GameMaker nebo rozbíjet prasátko na nákup nového počítače. Nechte prasátko žít, ukážu vám kouzlo..

Kouzlo optimalizace

Hned v nadpisu takové sprosté programátorské slovo! Optimalizace znamená zvýšení rychlosti, aniž by se vypařila nějaká funkčnost. A skutečně je to taková malá magie. Každý program jde napsat na více různých způsobů. Programy napsané v prvním hnutí mysli bývají sice pochopitelnější pro člověka, ale počítač s nimi mívá obvykle spoustu práce navíc. U našeho příkladu si musíme uvědomit, jak vlastně GM zpracuje naše zadání. Kromě toho, že ve Stepu tvoří instance našeho objektu, tak ještě pokaždé smaže všechny jejich sprity jen proto, aby je hned zas znovu vykreslil. GM totiž automaticky překresluje všechny objekty pořád dokola, aby bylo vidět případné změny (posun, animaci, změnu průhlednosti, atd.). To je ale u tolika objektů strašná spotřeba času. Nám bude stačit, aby se vykreslovaly změny mnohem pomaleji, protože se na obrazovce stejně skoro nic nehýbe.

Provedení optimalizace

  1. Do eventu Step objektu tvurce úplně na začátek přidáme akci Repeat, která jednoduše zopakuje to, co po ní následuje tolikrát, kolik má číselně zadáno. Nastavte times na 1000. (times znamená anglicky nejen časy, ale i krát ve smyslu násobení, čili kolikanásobně budeme opakovat)
  2. Všechny původní ikony uzavřeme do bloku pomocí trojúhelníků, jinak by se opakovala jen jedna ikona a to ta bezprostředně následující po ikoně Repeat.

A teď si to pusťte. To, co trvalo desítky minut, bude hotovo během chvilky. Proč je to rychlejší, když se skoro nic nezměnilo? Akce jsme neubrali, naopak přidali a přitom je to rychlejší. Jak to? Akce umístěné v události se provedou vždy všechny najednou a na další událost dojde až po vykonání všeho zadaného. Tzn. nejprve se provedou všechny události ve Stepu a teprve pak dojde na „prázdný“ Draw, který vykresluje. Místo pokusu o vykreslování všech dosud nakreslených objektů pokaždé s vytvořením nového, bude program něco vykreslovat pouze jedenkrát za každých tisíc vytvořených objektů. Takže po 50ti vykresleních je všechno hotovo. Když při 50K objektech bude GM stíhat vykreslovat třeba i 1x za vteřinu. (čili fps 1), nebude to vadit, protože to znamená, že objekty budou připraveny za 50 vteřin, což se dá přežít. Je třeba si uvědomit, že GM ty objekty považuje za potenciálně pohyblivé, případně animovatelné a provádí na prázdno spousty činností. Od některých mu můžeme pomoci, od jiných ne. Ale cokoli mu ušetříme, to se bude hodit. GM bez základních optimalizací nepoužijete téměř na nic a kdejaké pexeso bude potřebovat počítač budoucnosti. Každopádně se vždycky zamyslete nad tím, co všechno můžete nechat udělat počítač za vás, abyste to nemuseli klikat během tvorby a abyste přitom zase nezavařili i superpočítač CRAY.

Takže s pozdravem "Buďte líní!" zas příště u dalšího dílu TBA. :-)


 

Stáhnout

Staženo 251x (2.42 MB)
Aplikace je včetně zdrojových kódů v jazyce GameMaker

 

  Aktivity (1)

Článek pro vás napsal TomBen
Avatar
-

Jak se ti líbí článek?
Celkem (3 hlasů) :
55555


 



 

 

Komentáře

Avatar
Neaktivní uživatel:

for (a=0 a<50001 a+=1) {instance_cre­ate(random(ro­om_height),ran­dom(room_width),____)

:)
Odpovědět 5.8.2013 8:24
Neaktivní uživatelský účet
Avatar
TomBen
Redaktor
Avatar
Odpovídá na Neaktivní uživatel
TomBen:

Nepředbíhej, tenhle díl ještě nemá gml obsahovat. :-)
Je sice hezké, že víš jak na to, ale díly obsahují
informace s postupně rostoucí náročností.

Odpovědět 5.8.2013 16:36
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
Odpovídá na TomBen
Neaktivní uživatel:

Mě jen přišlo proč učit začátečníky (já dělám v gml 2 roky) poměrně složitou cestou jeden řádek kódu když to jde jednoduše.
Na pochopení podmínky for není nic složitého.

Ps: Teď koukám že mi na konci chybí složená závorka. :)

Editováno 5.8.2013 16:45
Odpovědět 5.8.2013 16:44
Neaktivní uživatelský účet
Avatar
TomBen
Redaktor
Avatar
Odpovídá na Neaktivní uživatel
TomBen:

Protože jde právě o tu cestu, ne o výsledek.
Taková věc je jinak reálně celkem bez užitku.
Tvůj kód stejně dělá něco jiného.

PS: for není podmínka

Editováno 5.8.2013 16:50
Odpovědět  +2 5.8.2013 16:49
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
Grimor
Člen
Avatar
Grimor:

Ahoj, nevím proč, ale nějak mi to nefunguje. Mám GM 12.

 
Odpovědět 23.3.2014 11:00
Avatar
Grimor
Člen
Avatar
Odpovídá na Grimor
Grimor:

Dělal jsem to přesně podle tutoriálu.

Editováno 23.3.2014 14:37
 
Odpovědět 23.3.2014 14:36
Avatar
Nate_2
Člen
Avatar
Nate_2:

Super.. Jde to :)

 
Odpovědět 4.7.2015 0:12
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.