Had v J2ME Martina M´alkov´a∗ 15. ˇcervence 2007
´ Uvod
1
C´ılem t´eto pr´ace bylo sezn´amit se s J2ME a naprogramovat standardn´ı hru had rozˇs´ıˇrenou o nˇejak´e prvky. Rozhodla jsem se do sv´eho d´ıla zabudovat n´asleduj´ıc´ı rozˇs´ıˇren´ı: • grafika had nen´ı jen z barevn´ ych pol´ıˇcek, ale prostˇred´ı se skl´ad´a z obr´azk˚ u • mapy hra se dˇel´ı na nˇekolik kol, pro kaˇzd´e kolo se naˇc´ıt´a ze souboru mapa • speci´ aln´ı pˇ redmˇ ety had neˇzere jen z´akladn´ı potravu, ale objevuj´ı se speci´aln´ı pˇredmˇety maj´ıc´ı (h)r˚ uzn´e u ´ˇcinky • zvuk a moˇznost zapnut´ı/vypnut´ı zvuku hry • nejlepˇ s´ı v´ ysledky a jejich ukl´ad´an´ı v pamˇeti telefonu
2
Programov´ a dokumentace
Program jsem se rozhodla vyv´ıjet v prostˇred´ı Eclipse 3.2.1 s pˇr´ıdavn´ ym pluginem, nicm´enˇe pro vytv´aˇren´ı koncov´ ych bal´ıˇck˚ u .jar a .jad jsem pouˇzila Sun Java(TM) Wireless Toolkit 2.5 for CLDC, protoˇze v Eclipse jsem nenaˇsla rozumn´e nastavov´an´ı verz´ı CLDC/MIDP. Uˇz na zaˇc´atku jsem si pro jistotu zvolila c´ılov´e zaˇr´ızen´ı (Ericsson K300i), protoˇze nˇekter´e vˇeci v programu jsou silnˇe z´avisl´e na zaˇr´ızen´ı, na kter´em bude program spuˇstˇen (napˇr. rozliˇsen´ı u map, zvuky, ukl´ad´an´ı do RMS). ∗
[email protected]
1
Pˇri psan´ı programu jsem nezaˇc´ınala od p´ıky, ale ˇr´ıdila se seri´alem doporuˇcen´ ym na str´ank´ach MKZ (Kdo si J2ME, nezlob´ı: http://interval.cz/vyvoj-aplikaci/j2me/). Proto se tak´e v m´em programu nach´az´ı kousky programu z tˇechto str´anek. Struktura programu je zn´azornˇena na n´asleduj´ıc´ım sch´ematu:
2.1
Tˇ r´ıda GameMIDlet
Hlavn´ım prvkem programu je GameMIDlet, kter´ y obstar´av´a n´asleduj´ıc´ı: • zobrazen´ı u ´ vodn´ı obrazovky hry pomoc´ı tˇr´ıdy SplashScreen • inicializaci hry vol´an´ı pˇr´ısluˇsn´ ych metod tˇr´ıdy GameCanvas • zobrazen´ı hlavn´ıho menu pouˇzit´ı tˇr´ıdy MenuList • zobrazen´ı nejlepˇ s´ıch v´ ysledk˚ u pouˇzit´ı tˇr´ıdy Best • ovl´ ad´ an´ı nastaven´ı obt´ıˇ znosti a zvuk˚ u vnitˇrn´ı tˇr´ıdy GameDiff, SetSounds
2.2
Tˇ r´ıda GameCanvas
´ Hlavn´ı obrazovku hry spravuje tˇr´ıda GameCanvas, kter´a dˇed´ı od tˇr´ıdy Canvas. Uzce spolupracuje s tˇr´ıdou GameSpace, kter´a ale pracuje nad matic´ı hrac´ı plochy (uˇz odproˇstˇen´a od bˇeˇzn´ ych formul´aˇrov´ ych starost´ı). Tˇr´ıda GameCanvas tak´e obstar´av´a pl´anov´an´ı pohybu (napl´anuje periodick´e opakov´an´ı metody sv´e vnitˇrn´ı tˇr´ıdy GameTask).
2.3
Tˇ r´ıda GameSpace
Vlastn´ı j´adro hry leˇz´ı v tˇr´ıdˇe GameSpace. Ta rozdˇel´ı zobrazovac´ı plochu na ˇctvereˇcky o dan´e velikosti (konstanta, protoˇze obr´azky se mi ve v´ıce rozliˇsen´ıch dˇelat nechtˇely). Podle toho vyrob´ı jednorozmˇern´e pole, kde kaˇzd´ y prvek znaˇc´ı dan´e pol´ıˇcko obrazovky. D´ale obsahuje ˇradu celoˇc´ıseln´ ych konstant, urˇcuj´ıc´ı co vˇsechno se m˚ uˇze na pol´ıˇcku obrazovky nach´azet - ˇc´asti hada, zdi, speci´aln´ı pˇredmˇety atp. Dalˇs´ı konstanty potom odkazuj´ı na obr´azky k pˇr´ısluˇsn´ ym pˇredmˇet˚ um. Pouˇzit´ı obr´azk˚ u pro kaˇzd´ y pˇredmˇet vyvolalo nov´ y probl´em - s poot´aˇcen´ım pˇredmˇet˚ u. Speci´aln´ı pˇredmˇety mohou b´ yt poloˇzeny jen jedn´ım smˇerem, ale napˇr. u hadovy hlavy uˇz tomu tak nen´ı. Nastaly tak dva moˇzn´e smˇery programu - prvn´ım bylo pouˇz´ıt Sprite, kter´ y um´ı obr´azky ot´aˇcet, coˇz by ale znamenalo bud’ dˇelat vˇsechny obr´azky pˇres Sprite, nebo nˇejak´ ym zp˚ usobem rozliˇsovat v matici plochy oˇc se jedn´a a podle toho rozhodovat. Zd´alo
2
se, ˇze by to byla sloˇzitˇejˇs´ı cesta (coˇz uˇz si ted’ u ´plnˇe nemysl´ım), proto jsem zvolila druh´ y zp˚ usob - vyrobit uˇz pˇredem natoˇcen´e obr´azky a rozliˇsovat je pouze konstantami. S rozliˇsen´ım moˇzn´ ych kus˚ u hada vznikla ˇrada dalˇs´ıch servisn´ıch poˇzadavk˚ u: pˇri kaˇzd´em pohybu hada nestaˇc´ı jen umazat pol´ıˇcko vepˇredu a smazat vzadu, mus´ı se pˇrepoˇc´ıt´avat, jak´e pol´ıˇcko bude vpˇredu na pozici hlavy (budouc´ı pozice za hlavou) a jak bude vypadat hlava a ocas. Pro ukl´ad´an´ı pozice hada a typu ˇcl´ank˚ u jsem pouˇzila dvourozmˇern´e pole (prvn´ı ˇc´ast - poloha dan´eho ˇcl´anku v mapˇe, druh´a ˇc´ast - konstanta urˇcuj´ıc´ı typ ˇcl´anku). Tento styl ukl´ad´an´ı (pozice&typ) pro kaˇzd´ y ˇcl´anek m´a v´ yhodu v tom, ˇze kaˇzd´ y ˇcl´anek hada m˚ uˇze vypadat jinak, kdybychom si to nˇekdy v budoucnu usmysleli. Pˇri kaˇzd´em tiknut´ı hodin je v tˇr´ıdˇe GameSpace vol´ana pˇr´ısluˇsn´a metoda. Rozliˇsuje se, zda se had pohybuje rovnˇe, nebo zatoˇcil. V pˇr´ıpadˇe zatoˇcen´ı se zavol´a metoda move(int new head), kter´a znaˇc´ı, ˇze se mus´ı zmˇenit obr´azek hlavy hada a nav´ıc oˇsetˇrit pol´ıˇcko za hlavou, kter´e tak´e nebude stejn´e (bude nˇekam zatoˇcen´e). Na konci metody se pˇrenastav´ı zmˇenˇen´a pol´ıˇcka plochy (space[]) a oˇsetˇr´ı kolize (ty se oˇsetˇruj´ı jen na nov´em m´ıstˇe hlavy, protoˇze jinde nastat nemohly). Um´ıst’ov´an´ı speci´aln´ıch pˇredmˇet˚ u ovivˇ nuje tak´e tˇr´ıda GameSpace. V tˇr´ıdˇe GameCanvas se urˇc´ı n´ahodn´ y ˇcas um´ıstˇen´ı dalˇs´ıho pˇredmˇetu, po jeho uplynut´ı se vyvol´a metoda setSpecial(), kter´a n´ahodnˇe um´ıst´ı do plochy speci´aln´ı pˇredmˇet. Pˇreb´ır´a parametr old, kter´ y znaˇc´ı, zda se jeˇstˇe ve hˇre nach´az´ı speci´aln´ı pˇredmˇet, pˇr´ıpadnˇe kde.
2.4
Tˇ r´ıda Best
Obstar´av´a nejlepˇs´ı v´ ysledky, jejich z´ısk´an´ı, porovn´av´an´ı a ukl´ad´an´ı. Na zaˇc´atku otevˇre RecordStore dan´eho jm´ena (konstanta) a zjist´ı, zda tam nejsou uloˇzeny nˇejak´e v´ ysledky. V pˇr´ıpadˇe ˇze ano, uloˇz´ı si je do sv´ ych lok´aln´ıch promˇenn´ ych. Pokud ne, vytvoˇr´ı nov´ y prostor. Do v´ ysledk˚ u se vˇzdy ukl´ad´a trojice [poˇrad´ı, jm´eno, sk´ore]. Snaˇzila jsem se bojovat s ˇrazen´ım dat v u ´loˇziˇsti, ale nakonec zjistila, ˇze ukl´ad´an´ı poˇrad´ı bude nejjednoduˇsˇs´ı zp˚ usob jak obstarat ˇrazen´ı. D´ıky poli, do kter´ ych se prvky ukl´adaj´ı, tak nakonec nen´ı potˇreba prvky pˇri naˇc´ıt´an´ı ˇradit, naˇcten´e poˇrad´ı hr´aˇce urˇcuje index do dan´eho pole. Probl´emy byly s nastavov´an´ım existuj´ıc´ıch v´ ysledk˚ u. Z d˚ uvod˚ u vlastn´ı neschopnosti rozchodit funkci nastavuj´ıc´ı star´e v´ ysledky, jsem tak skonˇcila u ˇreˇsen´ı pˇri uloˇzen´ı vymazat v´ ysledky z RMS a nov´e tam zase uloˇzit. Tak´e s maz´an´ım byly probl´emy, ˇreˇsila jsem ho pomoc´ı RecordEnumeration, kter´a ale pˇri smaz´an´ı jedn´e poloˇzky z RMS asi pˇrest´avala b´ yt aktu´aln´ı, kaˇzdop´adnˇe nesmazala nikdy vˇse. Proto j´ı nyn´ı zcela nesofistikovanˇe vol´am dokud v datab´azi existuje nˇejak´ y v´ ysledek.
2.5
Tˇ r´ıdy SetSound a GameDiff
Uˇz byly se znalostmi ze tˇr´ıdy best jednoduch´e, protoˇze si ukl´adaj´ı pouze jeden v´ ysledek. Myˇslenky pouˇz´ıvat pro to jeden record store jsem se velmi rychle vzdala.
3
2.6
Tˇ r´ıda Map
Naˇc´ıt´a mapy ze souboru a ukl´ad´a si lok´alnˇe u ´roveˇ n, podle kter´e urˇcuje kterou mapu naˇc´ıtat. V konstruktoru dostane parametr, jak by mˇela b´ yt mapa dlouh´a, a dan´ y soubor (pokud ho najde) ˇcte bud’ tak dlouho, dokud v nˇem nˇeco je, nebo do konce pole. T´ım se trochu omez´ı z´avislost aplikace na dan´em rozliˇsen´ı telefonu, bohuˇzel mapy vypadaj´ı na r˚ uzn´ ych rozliˇsen´ıch r˚ uznˇe, takˇze je aplikace stejnˇe z´avisl´a. Vyrobit si ale mapu v textov´em souboru um´ı kaˇzd´ y.
2.7
Tˇ r´ıda GameSounds
Obstar´av´a zvuky hry. Protoˇze zvuky jsou silnˇe z´avisl´e na dan´em zaˇr´ızen´ı, tato tˇr´ıda je pouze abstraktn´ı a vytv´aˇr´ı rozhran´ı pro tˇr´ıdy, kter´e budou pˇrehr´avat dan´e zvuky. V m´em pˇr´ıpadˇe to je tˇr´ıda EriscconSounds. Tato tˇr´ıda obsahuje pouze jednu metodu - play(), kter´a zahraje zvuk uloˇzen´ y na dan´e cestˇe. Zvuk pˇrehr´av´a pomoc´ı knihovny javax.microedition.media.*, tud´ıˇz tradiˇcn´ı cestou. Zvuky m´a aplikace uloˇzena ve form´atu amr, probl´emy byly pouze menˇs´ı pˇri pˇrevodech a tak´e s t´ım, ˇze v Eclipse emul´atoru zvuky nefungovaly, zat´ımco na fyzick´em zaˇr´ızen´ı ano, coˇz mi trvalo chv´ıli zjistit.
3
Uˇ zivatelsk´ a dokumentace
Aby ˇsla aplikace na c´ılov´em telefonu spustit, mˇelo by staˇcit, aby telefon zvl´adal MIDP 2.0 a CLDC 1.0. Zvuky a ukl´ad´an´ı v pamˇeti telefonu byly zat´ım vyzkouˇseny pouze na telefonu Ericsson k300i. Po spuˇstˇen´ı programu se zobraz´ı hlavn´ı menu hry (obr. 1).
Obr´azek 1: Hlavn´ı menu hry Jednotliv´e poloˇzky menu: • Hr´ at Spust´ı hru. Hra je pops´ana v kapitole 3.1.
4
• Nejlepˇ s´ı v´ ysledky Zobraz´ı nejlepˇs´ı v´ ysledky (viz obr 2, pˇri prvn´ım spuˇstˇen´ım hry bude obrazovka samozˇrejmˇe pr´azdn´a). V´ ysledky lze vˇsechny vymazat pomoc´ı volby menu ”Vymaˇz”
Obr´azek 2: Uk´azka obrazovky s nejlepˇs´ımi v´ ysledky • N´ apovˇ eda Zobraz´ı n´apovˇedu popisuj´ıc´ı pˇrev´aˇznˇe speci´aln´ı pˇredmˇety. • Obt´ıˇ znost Umoˇzn ˇuje nastavit obt´ıˇznost. Rozmez´ı je 1-50. Optim´aln´ı hrateln´a obt´ıˇznost se pohybuje okolo ˇc´ısla 6. • Zvuk Umoˇzn ˇuje vypnout/zapnout zvuky hry. • Konec Ukonˇc´ı hru.
3.1
Hra
Po spuˇstˇen´ı hry z menu se objev´ı mapa prvn´ıho levelu a pohybuj´ıc´ı se had. Had lze ovl´adat smˇerov´ ymi ˇsipkami telefonu. V pˇr´ıpadˇe, ˇze se neobjev´ı ˇz´adn´e zdi, znamen´a to, ˇze se nenaˇcetla ˇz´adn´a mapa. Moˇzn´e ˇreˇsen´ı - pˇrid´av´an´ı a mˇenˇen´ı map je pops´ano v kapitole 3.2. Moˇzn´ y vzhled hry je uk´az´an na obr´azku 3. 1. Zobrazen´ı sk´ ore. Obˇcas se objev´ı lom´ıtko a za n´ım dalˇs´ı ˇc´ıslo. Pokud je na obrazovce nˇejak´a speci´aln´ı vˇec, znaˇc´ı toto ˇc´ıslo ˇcas zmizen´ı vˇeci. V pˇr´ıpadˇe poˇzit´ı bomby ˇci zelen´eho bomb´onku znaˇc´ı ˇc´ıslo dobu trv´an´ı u ´ˇcinku tˇechto vˇec´ı. 2. Had ovl´ adan´ y tlaˇ c´ıtky. Hlava nesm´ı nabourat do zd´ı ani do vlastn´ıho tˇela, ale m˚ uˇze proj´ıˇzdˇet krajem obrazovky. 5
Obr´azek 3: Vlastn´ı hra 3. Myˇ s. Z´akladn´ı potrava hada. Za kaˇzdou seˇzranou myˇs pˇribude do sk´ore poˇcet bod˚ u rovn´ yu ´rovni. Za patn´act seˇzran´ ych myˇs´ı had postupuje do dalˇs´ıho levelu a zvyˇsuje se rychlost (ale ne u ´roveˇ n). 4. Speci´ aln´ı pˇ redmˇ et. Na obr´azku zelen´ y bomb´onek. Speci´aln´ı pˇredmˇety maj´ı r˚ uzn´e u ´ˇcinky, budou pops´any d´ale v textu. 5. Zed’. 6. Odpadl´ y kus hada. Z˚ ust´av´a na obrazovce po vybouchnut´ı bomby, m´a stejnou funkci jako zed’. Speci´ aln´ı pˇ redmˇ ety Speci´aln´ı pˇredmˇety jsou zobrazen´e na obr´azku 4. • Bomba Bomba zaˇcne po seˇzr´an´ı odtik´avat n´ahodn´ y ˇcas. Tento ˇcas tak´e znamen´a, v jak´e ˇc´asti tr´avic´ıho syst´emu hada vybouchne. Zbyl´ y ocas (pokud had nestihne bombu str´avit) z˚ ustane leˇzet na hrac´ım poli a p˚ usob´ı jako zdi. 6
Obr´azek 4: Speci´aln´ı pˇredmˇety (zleva: bomba, podivn´ y bomb´onek, ˇcerven´ y bomb´onek, voda, d´arek, hrobeˇcek). • Podivn´ y bomb´ onek Podivn´ y bomb´onek prohod´ı hadovi ovl´ad´an´ı. Pˇri pokusu jet vpravo pojede vlevo, atp. ˇ • Cerven´ y bomb´ onek Do bod˚ u se pˇripoˇc´ıt´a pˇetin´asobek poˇctu ˇcl´ank˚ u hada. • Voda Hadovi pˇribude ˇcl´anek, jinak se nic nedˇeje. • D´ arek D´arek n´ahodnˇe vybere jeden ze speci´aln´ıch pˇredmˇet˚ u a pouˇzije. • Hrobeˇ cek Zp˚ usob´ı, ˇze had bude uˇz jen nar˚ ustat (ocas z˚ ust´av´a na stejn´em m´ıstˇe). Proces lze zastavit seˇzr´an´ım dalˇs´ıho hrobeˇcku, kdy se nar˚ ust´an´ı zastav´ı..
3.2
Mapy
V pˇr´ıpadˇe, ˇze chceme upravovat mapy, mus´ıme si bal´ıˇcek se hrou st´ahnout na poˇc´ıtaˇc a zmˇenit pˇr´ıponu .jar na .zip. V bal´ıˇcku by mˇel existovat adres´aˇr maps. Pokud neexistuje, je potˇrebaho vytvoˇrit. V tomto adres´aˇri se pak nach´az´ı oˇc´ıslovan´e soubory. Ty pˇredstavuj´ı jednotliv´e mapy. Map m˚ uˇze b´ yt libovoln´ y poˇcet. Soubory lze zmˇenit napˇr. v pozn´amkov´em bloku. ˇıˇrku i v´ Pro vytvoˇren´ı ˇci zmˇenˇen´ı mapy potˇrebujete zn´at rozliˇsen´ı vaˇseho telefonu. S´ yˇsku pak vydˇelte (bezezbytkovˇe) 12 a vyjdou v´am rozmˇery budouc´ı plochy hada, tud´ıˇz i potˇrebn´e mapy. Po upraven´ı ˇci vytvoˇren´ı map pˇrejmenujte pˇr´ıponu bal´ıˇcku zpˇet na .jar.
4
Z´ avˇ er
D´ıky t´eto semestr´aln´ı pr´aci jsem se nauˇcila pracovat v J2ME, coˇz jsem chtˇela zkusit uˇz d´avno. Byla to pro mˇe mnohem vˇetˇs´ı v´ yzva neˇz pouˇzit´ı .NETu, kter´ y nav´ıc nen´ı dostupn´ y na ”obyˇcejn´ ych” telefonech. Zjistila jsem, ˇze sice nen´ı pˇr´ıliˇs tˇeˇzk´e napsat aplikaci pro mobiln´ı telefon, ale ve chv´ıli, kdy chce ˇclovˇek od programu ”nˇeco v´ıc”, tak nar´aˇz´ı na rozd´ıly jednotliv´ ych zaˇr´ızen´ı, nepˇr´ıliˇs srozumiteln´e dokumentace od v´ yrobc˚ u telefon˚ u atp.
7