Viliam Búr

24. 8. 2008

Plošinovka za štyri dni

Pozvali ma do poroty programátorskej súťaže Špongia. Súťaží sa v programovaní počítačových hier za niekoľko dní. Aby som sa lepšie vcítil do kože súťažiacich, vyzval som organizátora Dana Lováska na programátorský súboj. Jednotlivec proti jednotlivcovi, časový limit 4 dni, presnejšie 3½, téma "plošinovka", programovací jazyk podľa vlastného výberu. Zatiaľ sme nezohnali nezávislú porotu na vyhodnotenie výsledkov, ale na tom až tak nezáleží. Rád som si to vyskúšal, a tu sú moje dojmy a skúsenosti.

Najprv pár slov o súťaži. Špongia znamená "Športové programovanie oči neodpudzujúcich grafických interaktívnych aplikácií", čiže programovanie počítačových hier s dôrazom na nápad, hrateľnosť a estetický dojem. Súťaž vznikla v roku 2006 z iniciatívy študentov Gymnázia pre mimoriadne nadané deti v Bratislave. V roku 2007 sa zapojili aj študenti Gymnázia Jura Hronca a Gymnázia Grösslingová. Ak máte záujem pridať sa aj vy (študenti stredných alebo základných škôl), ozvite sa organizátorom, alebo v komentári k tomuto článku.

Bežné programátorské súťaže sú zamerané na písanie efektívnych algoritmov a pre laika sú nezáživné až nepochopiteľné. V Špongii je algoritmus iba prostriedkom na dosiahnutie cieľa, a hodnotia sa vlastnosti zrozumiteľné laickej (hráčskej) verejnosti. To však neznamená, že programátor má menej práce. Naopak, musí navyše spracovávať vstup z klávesnice a myši, a zobrazovať peknú animovanú grafiku. Špongie sa zúčastňujú skupiny do 6 členov. Väčšia skupina nemusí byť vždy výhodou, ťažšie sa koordinuje spolupráca. Grafikou a hudbou prispievajú aj neprogramátori. V minulom ročníku mali účastníci na vytvorenie hry 18 dní, presné zadanie sa uverejňuje na začiatku súťaže, v októbri. Témy predchádzajúcich ročníkov boli "voda" a "puzzle".

Mojou výhodou oproti účastníkom súťaže je 10 rokov profesionálnej programátorskej praxe, a predtým ďalších takmer desať rokov amatérskeho programovania. Na druhej strane, počítačovú hru som naposledy programoval tuším pred dvanástimi rokmi, v programovacom jazyku Turbo Pascal v operačnom systéme MS DOS. Odvtedy som písal prevažne skripty, knižnice, a webové rozhrania. Naštudovať si nejaké grafické rozhranie nie je veľký problém, ale času je málo a práce veľa. A vedel som, že približne deň stratím nejakými povinnosťami mimo počítača; nechcem sa však vyhovárať, účastníci súťaže zase počas nej musia chodiť do školy.

Vybral som si programovací jazyk Java. Chcel som písať v jazyku, ktorý dôkladne poznám, aby ma technické detaily nebrzdili pri písaní. Do úvahy pripadala Java alebo Perl, ale v Perli som zatiaľ nič grafické interaktívne nepísal, a Java má výborné vývojové prostredie Eclipse. V Jave neviem pracovať so zvukom, ale keďže neviem skladať hudbu, a nechcelo sa mi strácať čas hľadaním vhodne znejúcej voľne použiteľnej skladby na internete, rozhodol som sa, že hra bude bez zvuku. Síce to znižuje celkový dojem, ale snáď to vyvážim niečím iným.

Ako prvý krok som si vytvoril pracovnú plochu 800×600 pixelov, ktorá sa dá spustiť v okne aplikácie alebo na webovej stránke, a vykreslí farebný obdĺžnik. Pre dobrý pocit, že už mám prvý malý tromf proti súperovi píšucemu v C++, a pretože v Jave sa to programuje pomerne jednoducho.

Potom som si v grafickom editore MS Paint nakreslil jednoduchého panáčika: kružnica ako hlava, elipsa ako telo, čiary ako ruky a nohy. V hre som panáčika načítal zo súboru a vykreslil na obrazovku. Pridal som ovládanie pomocou šípok, takže sa pomaly vznášal vo vzduchu. Obrazovka sa aj s panáčikom prekresľovala 50× za sekundu; panáčik pritom blikal, takže som dorobil virtuálnu obrazovku, na ktorej sa vždy vymazal a nakreslil o kúsok vedľa, a až potom sa výsledok prekreslil na skutočnú obrazovku. Aby obrazovka nebola prázdna, vykreslil som na pozadí modrozelený obrázok, a niekoľko tehlových múrov poskladaných zo štvorčekových dlaždíc. Hráč sa stále voľne vznášal aj ponad múry.

Pred kreslením ďalších obrázkov som si chcel premyslieť, aký veľký má byť v hre panáčik, a ako rýchlo sa má pohybovať. Toto rozhodnutie sa dá neskôr v programe ľahko zmeniť, ale bude treba nakresliť nové obrázky a nové miestnosti, čo je strata času, a bol som už zhruba v polovici druhého dňa zo štyroch. Keď som programoval hry pred dvanástimi rokmi, posúval som vždy panáčika o jeden obrazový bod za päťdesiatinu sekundy, čím vznikal krásny plynulý pohyb. Lenže ak by mal takto prejsť 800 pixelov, trvalo by mu to 800÷50= 16 sekúnd, a to mi pripadalo priveľa. Ale keď som vyskúšal rýchlosť väčšiu ako jeden obrazový bod, ten pohyb vyzeral ako pod stroboskopom. Čo s tým?

(C) 2008 Viliam Búr viliam-bur.blogspot.com

Ak sa majú figúrky rýchlo pohybovať, asi ich nemôžem kresliť po jednotlivých bodoch. Použil som teda vektorový editor Inkscape, poskladal som si panáčika z kriviek, a nakoniec som ho exportoval ako bitmapu. A hoci som opäť nakreslil úplne jednoduché tvary, vyzeral omnoho kvalitnejšie ako predchádzajúci model. Dokonca mal na okrajoch kriviek polopriesvitné body, takže nepôsobil kockato na žiadnom pozadí. Bolo mi jasné, že budem takto kresliť všetky obrázky.

Veľkosť panáčika som si určil ako 40×80 pixelov, a terén som poskladal ako mozaiku z dlaždíc veľkosti 40×40 pixelov, čím sa plocha 800×600 pixelov akoby rozdelila na mriežku 15×20 častí. Pri vodorovnom pohybe som nechal panáčika plynulo zrýchľovať až po 7 bodov za päťdesiatinu sekundy, to mi pripadalo dosť rýchle a ešte pomerne plynulé. Do výšky skákal rýchlosťou 16 bodov, aby pri gravitačnom zrýchlení 1 bod zvládol vyskočiť o tri riadky mriežky. K týmto hodnotám som došiel skúšaním, dokiaľ mi nepripadalo, že pohyb panáčika vyzerá správne.

Okrem múrov som dorobil trávnatú zem. Musel som kvôli nej úplne prerobiť algoritmus zrážok. Múr je totiž pre panáčika nepriepustný; nemôže sa cezeň prepadnúť, prejsť ním zboku, ani ho preraziť hlavou. Trávnatá plošina je polopriepustná; ak je panáčik nad ňou, nemôže sa prepadnúť, ale ak stojí nižšie, môže chodiť popred ňu, alebo na ňu zdola vyskočiť. Múr tesne nad hlavou je ako strop, cez ktorý sa nedá prejsť a možno ho iba obísť; trávnatá plošina tesne nad hlavou je ako priečka rebríka, na ktorú sa dá vyskočiť.

Bol som príjemne prekvapený, že sa celá obrazovka stíha prekresliť päťdesiatkrát za sekundu. Môj počítač by zvládol až 65 záberov za sekundu, a to som si kúpil pred dvoma rokmi jeden z tých lacnejších (1 GB pamäte, 1,6 GHz procesor). Vedel som, že Java je pomalý jazyk, a mal som v úmysle prerobiť program, aby sa každú päťdesiatinu sekundy prekresľovali iba tie časti obrazovky, kde sa niečo pohlo; ale odkladal som túto úpravu na neskôr, a bol som prekvapený, že to ide aj bez nej. Neskôr som program aj tak upravil, len kvôli dobrému pocitu, že zbytočne neplytvám silami počítača. Až po skončení programátorského súboja a odoslaní výsledku som zistil, že som v tej úprave urobil logickú chybu, takže sa naďalej prekresľovala celá obrazovka. Nuž čo, hlavne, že to funguje. ;-)

Dorobil som nepriateľského slimáka, ktorý sa pohybuje rovnakým spôsobom ako hráč, iba o trochu pomalšie, a nemôže skákať. Dorobil som jablká, ktoré hráč môže zbierať. Mal som v úmysle neskôr dorobiť viacero nepriateľov a viacero zberateľných predmetov, ale už som nestihol. Dorobil som vznášadlo, ktoré funguje ako trávnatá zem, ale sa vodorovne pohybuje, takže panáčik po ňom musí opatrne kráčať, aby nespadol.

V posledný deň sa mi veľmi nedarilo, lebo som sa bál blížiaceho termínu, nechcelo sa mi už programovať, a tešil som sa, až to skončí a oddýchnem si. Rozšíril som obrazovku na 820×660 pixelov; na vnútornej časti 800×600 pixelov prebiehal dej hry, okolo bol rám a spodná časť, v ktorej sa mali zobrazovať pozbierané kľúče a iné špeciálne predmety. Ak panáčik pozbieral všetky jablká, dostal sa do ďalšej miestnosti; ak sa ho dotkol slimák, musel miestnosť opakovať. Dorobil som ešte úvodnú a záverečnú obrazovku. Zabralo mi to niekoľko hodín, a potom už mi nezostal čas na naprogramovanie naplánovaných kľúčov a odomykateľných dverí, takže niektoré úpravy som z hľadiska súťaže robil celkom zbytočne. Texty na začiatku a na konci hry sú uložené ako obrázky; je to plytvanie miestom na disku, ale tak sa to dalo naprogramovať najrýchlejšie. Pôvodne mali byť po slovensky a po anglicky, ale keď Inkscape nevedel správne zobraziť slovenské písmená, nechal som iba anglický text, nemal som čas hľadať riešenie.

Prišla noc, tak som narýchlo nadizajnoval päť miestností; v prvých štyroch postupne predstavujem jednotlivé herné prvky, a posledná piata je náročná, aby som hráča na rozlúčku potrápil, nech mu hra nepripadá príliš krátka. Miestnosti sú naeditované priamo v zdrojovom kóde; nemal som čas písať editor. Výsledok som zabalil a odoslal cez e-mail.

Programátorský súboj teda skončil, ale snáď si niekedy ešte nájdem čas na dokončenie tejto hry, a prípadne na nejaké ďalšie hry. Keď zvážim, čo som sa za tie roky naučil, a aké sú dnes počítače výkonné, je to veľká výzva. (Dnes by sa dala v Jave bez problémov napísať napríklad hra ako Warcraft 2.) A teším sa na Špongiu 2008, na ktorej sa síce nemôžem zúčastniť oficiálne, ale pokúsim sa ukecať nejakého grafika, aby mi pomohol s neoficiálnym mimosúťažným príspevkom.

Myslím si, že niečo podobné by si mal vyskúšať každý človek alebo tím, ktorý sa pokúša vytvoriť nejakú hru. Na internete je mnoho herných projektov, aj od slovenských autorov, ktoré začali vytvorením webovej stránky, napísaním príbehu a nakreslením ukážkových obrázkov, po ktorých nasledovali už len správy typu "pracujeme na tom, vydržte chvíľku" a prípadne o niekoľko rokov záverečná správa "momentálne na projekte nepracujeme, vošli nám do toho nejaké povinnosti, projekt sa odkladá na neurčito". Takýto športový štýl programovania neľútostne preverí vaše tímové schopnosti, nájde vaše slabé miesta, a ukáže vám, aký výsledok môžete očakávať v akom čase. Bez ohľadu na to, aký typ hry idete robiť, skúste najprv za týždeň vyrobiť kompletné mikrodemo. Oplatí sa obetovať jeden týždeň, aby ste zistili, či sa nasledujúce roky nebudete namáhať zbytočne.

Hru "Platform 2008" (lepší názov som nevymyslel) si môžete stiahnuť zo serveru SourceForge.net pod licenciou GNU GPLv3 aj so zdrojovým kódom.

8 komentárov:

Blogger dusoft povedal(a)...

vyborne. ani nie samotna hra (no disrespect), ale realizacia konceptu na slovensku.

vo svete su podobne programovacie sutaze bezne. inak na hry sa daju pouzivat vyvojove prostredia typu Adventure Game Studio, ktore robia vela prace za programatora:
http://www.adventuregamestudio.co.uk/

26. 8. 2008, 22:41:00  
Blogger Viliam Búr povedal(a)...

Pravidlá Špongie umožňujú použiť aj legálne získané cudzie prostriedky. Autor ich musí presne uviesť, aby porota vedela, ktorá časť hry je jeho vlastná pridaná hodnota. Je teda možné použiť aj Adventure Game Studio, porota však nebude hodnotiť kvalitu enginu, ale grafiku, hudbu, príbeh. Pokiaľ viem, zatiaľ sa nič podobné nestalo; najsilnejší využitý engine bolo Imagine Logo.

27. 8. 2008, 16:43:00  
Anonymous Anonymný povedal(a)...

idealny programovaci nastroj
pre podobne veci:
http://scratch.mit.edu/

28. 8. 2008, 4:34:00  
Anonymous Anonymný povedal(a)...

trochu ot: java nie je pomaly jazyk. Len nie je prave najvhodnejsi na male a rychle desktopove aplikacie, kedze tam sa vyhoda JIT neukaze.

28. 8. 2008, 10:08:00  
Anonymous Anonymný povedal(a)...

"trochu ot: java nie je pomaly jazyk. Len nie je prave najvhodnejsi na male a rychle desktopove aplikacie, kedze tam sa vyhoda JIT neukaze" -myslim ze si protirecis

29. 8. 2008, 19:54:00  
Anonymous Anonymný povedal(a)...

Pekny clanok ;-) Rad by som videl aj vysledky sutaziacich...

P.S.: Nerad by som tu videl flame o Jave, ale ked tu s tym uz zacali - v prvom rade, Java (ako programovaci jazyk) nie je vobec pomala. Jazyk nemoze byt pomaly - moze byt mozno ukecany, primitivny, objektovy, atd... Pomala je vsak JVM.

2. 9. 2008, 10:39:00  
Blogger Viliam Búr povedal(a)...

Súhlasím, formulácia o pomalej Jave je nepresná; môžeme sa baviť o rýchlosti VM, a prípadne o efektivite kompilátora. Ale laicky povedané, keď niekto v roku 1995 naprogramoval v Jave s využitím štandardných prostriedkov grafickú aplikáciu, zrejme to nevyzeralo ako dobrá platforma na vývoj hier (možno nejakých logických, kde na rýchlosti až tak nezáleží). Dnes je z rôznych dôvodov situácia iná, pokiaľ nechcem vyslovene programovať 3D hru na hranici možností grafických kariet.

Súťažiaci sme boli dvaja. Moja hra sa dá z článku stiahnuť aj pozrieť na videu, Dano svoju zatiaľ zverejniť nechce, ale výsledky sú veľmi vyrovnané. Dajú sa stiahnuť aj všetky hry zo Špongie 2006 a dve hry zo Špongie 2007. Niektoré sa dosť ťažko inštalujú; vlastne kvôli tomu sa do hodnotenia Špongie 2008 pridala kategória "jednoduchosť inštalácie". ;-)
http://www.smnd.sk/main/o-skole/spongia-2006/
http://smnd.sk/mikey/PHP/spongia/spongia_2007/results.php

2. 9. 2008, 17:35:00  
Anonymous Anonymný povedal(a)...

"Bol som príjemne prekvapený, že sa celá obrazovka stíha prekresliť päťdesiatkrát za sekundu. Môj počítač by zvládol až 65 záberov za sekundu, a to som si kúpil pred dvoma rokmi jeden z tých lacnejších (1 GB pamäte, 1,6 GHz procesor)" - takže len 1000 MHz, 32 bit architektúra, určite aspoň niekoľko sto kB Cache, grafický procesor na VGA a ono to predsa chodí ????? Neuveriteľné ...

By si sa čudoval, že to sa dá naprogramovať aj na procesore za 1 Eur, ktorý maš v myši. Bude to farebné, bude to stíhať refresh obrazovky v rálnom čase a na rozdiel od Tvojej aplikácie to bude plynulé :)))
PS možno nevieš, že USA pred ešte pred 15-timi rokmi embargovali procesory Pentium pre východnú Európu s dovetkom, že majú taký výpočtový výkon, že jes ich pomocou možnú určiť z bežných dát meteorologických satelitov aktuálne polohy US jadrových ponoriek. A to nehovorím o Pentium IV, III, II, či I - ale o tom najstaršom 5V Pentiu s 50MHz zbernicou, veľkom ako obkladačka do kúpeľne, ktoré si pravdepodobne v živote nevidel. Asi by som sa mal ísť nechať zavrieť do Britského múzea k tomu dinosaurovi :(

14. 2. 2010, 9:25:00  

Zverejnenie komentára

Prihlásiť na odber Zverejniť komentáre [Atom]

<< Domov