Za´padoˇceska´ univerzita v Plzni Fakulta aplikovany´ch vˇed Katedra informatiky a vy´poˇcetn´ı techniky
Diplomov´ a pr´ ace Multiplatformn´ı konverze hry pro platformy iOS a Android
Plzeˇ n 2013
Josef Vlach
Podˇ ekov´ an´ı Chtˇel bych podˇekovat sv´e maminˇe za podporu a p´eˇci, kterou mi bˇehem cel´eho studia vˇenovala.
Prohl´ aˇ sen´ı Prohlaˇsuji, ˇze jsem diplomovou pr´aci vypracoval samostatnˇe a v´ yhradnˇe s pouˇzit´ım citovan´ ych pramen˚ u. V Plzni dne 13. srpna 2013 Josef Vlach
Abstract Pr´ace se zab´ yv´a konverz´ı poˇc´ıtaˇcov´e hry Beruˇsky na mobiln´ı platformy iOS a Android. Prob´ır´ana je obecn´a moˇznost psan´ı multiplatformn´ıho k´odu pomoc´ı dostupn´ ych knihoven a framework˚ u. Jsou zde pops´any moˇznosti bˇehu C/C++ k´odu na obou platform´ach. V realizaˇcn´ı ˇca´sti pr´ace je probr´ana moˇznost sd´ılen´ı zdrojov´eho k´odu pro obˇe platformy a jsou zde probr´any probl´emy spojen´e s implementac´ı hry pro mobiln´ı zaˇr´ızen´ı.
Obsah ´ 1 Uvod
1
2 Teoretick´ aˇ c´ ast 2.1 Pˇredstaven´ı hry Beruˇsky . . . . . . . . . . . 2.2 Pˇredstaven´ı mobiln´ıch platforem . . . . . . . 2.2.1 iOS . . . . . . . . . . . . . . . . . . . 2.2.2 Android . . . . . . . . . . . . . . . . 2.3 Reˇserˇse multiplatformn´ıch framework˚ u . . . 2.3.1 HTML5/CSS hern´ı frameworky . . . 2.3.2 Adobe AIR (Flash) hern´ı frameworky 2.3.3 C/C++ hern´ı frameworky . . . . . . 2.3.4 Ostatn´ı frameworky . . . . . . . . . . 2.3.5 Vyhodnocen´ı reˇserˇse . . . . . . . . . 3 Popis platforem Android a iOS 3.1 Popis architektury Androidu . . . . . . 3.1.1 Vol´an´ı nativn´ıho k´odu z Javy . 3.1.2 Vol´an´ı Javy z nativn´ıho k´odu . 3.1.3 Tvoˇren´ı n´azv˚ u metod a signatur 3.2 Popis architektury iOS . . . . . . . . . 3.2.1 Architektura iOS . . . . . . . . 3.3 Zhodnocen´ı platforem . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . . metod . . . . . . . . . . . .
. . . . . . . . . .
. . . . . . .
4 Realizaˇ cn´ı ˇ c´ ast 4.1 V´ yvojov´e prostˇred´ı pro Android . . . . . . . . . 4.2 V´ yvojov´e prostˇred´ı pro iOS . . . . . . . . . . . 4.3 Struktura projektu pro dvˇe platformy/dvˇe IDE 4.3.1 Struktura Android projektu . . . . . . . 4.3.2 Struktura iOS projektu . . . . . . . . . . 4.4 Portace . . . . . . . . . . . . . . . . . . . . . . 4.4.1 Zmˇeny SDL 2.0 oproti SDL 1.2 . . . . .
. . . . . . . . . .
. . . . . . .
. . . . . . .
. . . . . . . . . .
. . . . . . .
. . . . . . .
. . . . . . . . . .
. . . . . . .
. . . . . . .
. . . . . . . . . .
. . . . . . .
. . . . . . .
. . . . . . . . . .
. . . . . . .
. . . . . . .
. . . . . . . . . .
. . . . . . .
. . . . . . .
. . . . . . . . . .
2 . 2 . 4 . 4 . 6 . 8 . 8 . 9 . 12 . 20 . 20
. . . . . . .
. . . . . . .
22 22 25 31 34 36 36 39
. . . . . . .
40 40 43 43 44 45 45 46
. . . . . . .
OBSAH
OBSAH 4.4.2 4.4.3
Uzp˚ usoben´ı dotykov´emu ovl´ad´an´ı . . . . . . . . . . . . 51 Zmˇena z obrazovky na mal´ y displej . . . . . . . . . . . 57
5 Z´ avˇ er
60
A Seznam pouˇ zit´ ych zkratek
61
B Instalaˇ cn´ı pˇ r´ıruˇ cka
62
C Obsah pˇ riloˇ zen´ eho CD
63
5
´ 1 Uvod C´ılem t´eto pr´ace je portace logick´e hry Beruˇsky, napsan´e p˚ uvodnˇe pro operaˇcn´ı syst´em MS-DOS 5.x, na modern´ı mobiln´ı operaˇcn´ı syst´emy. Konkr´etnˇe se jedn´a a portaci na mobiln´ı operaˇcn´ı syst´em iOS od spoleˇcnosti Apple Inc. a na mobiln´ı operaˇcn´ı syst´em Android od spoleˇcnosti Google Inc. C´ılem je udˇelat z p˚ uvodn´ı DOSov´e hry modern´ı multiplatformn´ı hru a pˇribl´ıˇzit ji ˇsirok´emu publiku v podobˇe odpov´ıdaj´ıc´ı modern´ım trend˚ um. Pr´ace byla zad´ana spoleˇcnost´ı Red Hat, Inc. ve spolupr´aci s p˚ uvodn´ım autorem hry. Na zaˇca´tku pr´ace si podrobnˇe pˇredstav´ıme hru Beruˇsky a pot´e si kr´atce pop´ıˇseme oba dva mobiln´ı operaˇcn´ı syst´emy, pro kter´e portaci hry Beruˇsky provedeme. Pot´e se v sekci Reˇserˇse multiplatformn´ıch framework˚ u pod´ıv´ame na to, jak´e technologie se pro psan´ı multiplatformn´ıch her nab´ızej´ı. Projdeme rozliˇsn´e technologie, od HTML pˇres Flash aˇz po jazyk C/C++. Po t´eto sekci bude n´asledovat podrobn´ y popis obou dvou platforem a moˇznost´ı, kter´e pro bˇeh program˚ u napsan´ ych v jazyce C ˇci C++ nab´ızej´ı. V realizaˇcn´ı ˇc´asti pr´ace se podrobnˇeji pod´ıv´ame na v´ yvojov´a prostˇred´ı pro jednotliv´e platformy a pop´ıˇseme si, jak´e probl´emy multiplatformn´ı v´ yvoj pˇrin´aˇs´ı a jak je vyˇreˇsit. Z´avˇereˇcn´e kapitoly budou patˇrit popisu zmˇen ve hˇre Beruˇsky, kter´e byly v r´amci portace z klasick´eho poˇc´ıtaˇce na mobiln´ı telefon nutn´e uˇcinit. Na z´avˇer zhodnot´ıme dosaˇzen´e v´ ysledky t´eto pr´ace.
1
2 Teoretick´a ˇc´ast 2.1
Pˇ redstaven´ı hry Beruˇ sky
Poˇc´ıtaˇcov´a hra Beruˇsky [16] je volnˇe ˇsiˇriteln´a logick´a hra, vydan´a pod GNU Public licenc´ı. Hra Beruˇsky, uk´azka viz obr´azek 2.1, vych´az´ı sv´ ymi principy z logick´e hern´ı klasiky Sokoban. Principem hry Sokoban je pˇrem´ıstit v hern´ım levelu krabice z jejich poˇc´ateˇcn´ıho rozloˇzen´ı do urˇcen´ ych u ´loˇzn´ ych m´ıst. Hra Sokoban byla vytvoˇrena japonsk´ ym autorem jm´enem Hiroyuki Imabayashi v roce 1981 a n´asleduj´ıc´ıho roku doˇslo k jej´ımu komerˇcn´ımu vyd´an´ı. Uk´azka ze hry Sokoban viz obr´azek 2.2. Uk´azka je z verze hry z roku 1989 urˇcen´e pro hern´ı konzole Sega Mega Drive/Sega Genesis.
Obr´azek 2.1: Uk´azka ze hry Beruˇsky Hra je hr´ana na hern´ım poli sloˇzen´em ze ˇctverc˚ u, z nichˇz kaˇzd´ y ˇctverec je podlaha, nebo stˇena. Nˇekter´e ze ˇctverc˚ u podlahy jsou oznaˇceny jako u ´loˇziˇstˇe a nˇekter´e obsahuj´ı krabice. 2
Teoretick´a ˇc´ast
Pˇredstaven´ı hry Beruˇsky
Obr´azek 2.2: Uk´azka ze hry Sokoban
Hr´aˇc se m˚ uˇze pohybovat pouze po jednotliv´ ych ˇctverc´ıch hern´ıho pole horizont´alnˇe ˇci vertik´alnˇe a to pouze na pr´azdn´a m´ısta podlahy (nikdy skrze stˇenu ˇci krabici). Hr´aˇc m˚ uˇze t´eˇz odtlaˇcit krabici na pr´azdn´ y ˇctverec podlahy za krabic´ı. Krabice nem˚ uˇze b´ yt tlaˇcena do dalˇs´ı krabice ˇci stˇeny a t´eˇz nem˚ uˇze b´ yt taˇzena. Hern´ı u ´roveˇ n je vyˇreˇsena, kdyˇz jsou vˇsechny krabice uloˇzeny v u ´loˇziˇst´ıch. Sokoban byl studov´an v teorii sloˇzitosti a bylo dok´az´ano, ˇze ˇreˇsen´ı Sokobanov´ ych u ´rovn´ı je NP sloˇzit´ y probl´em. Dalˇs´ı studie dokonce uk´azala, ˇze se jedn´a aˇz o PSPACE-´ upln´ y probl´em [24]. Hra Beruˇsky rozˇsiˇruje hern´ı princip Sokobanu o dalˇs´ı hern´ı mechanizmy a prvky, kter´e si nyn´ı uvedeme: V´ ybuˇ snina zniˇc´ı krabici, na kterou je natlaˇcena, K´ amen nelze odtlaˇcit, ale lze ho zniˇcit krump´aˇcem, Krump´ aˇ c lze sebrat a n´aslednˇe pouˇz´ıt na rozbit´ı kamene, Barevn´ y kl´ıˇ c potˇrebn´ y pro otevˇren´ı barevn´e br´any. Pouze beruˇska shodn´e barvy jej m˚ uˇze sebrat,
3
Teoretick´a ˇc´ast
Pˇredstaven´ı mobiln´ıch platforem
Barevn´ e dveˇ re lze je otevˇr´ıt pouze za pouˇzit´ı odpov´ıdaj´ıc´ıho barevn´eho kl´ıˇce, Barevn´ a br´ ana br´ana, kterou m˚ uˇze proj´ıt pouze beruˇska s odpov´ıdaj´ıc´ı barvou, Br´ ana pro jedno pouˇ zit´ı br´ana, kterou lze proj´ıt pouze jednou. Vedle tˇechto prvk˚ u je hlavn´ı designovou zmˇenou hry Beruˇsky rozˇs´ıˇren´ı hry o kooperativn´ı prvek, pˇri kter´em hr´aˇc ovl´ad´a aˇz pˇet rozliˇsn´ ych beruˇsek (beruˇska je hrateln´a postava) a jednotliv´e beruˇsky si musej´ı vz´ajemnˇe pom´ahat ku ´spˇeˇsn´emu vyˇreˇsen´ı jednotliv´ ych hern´ıch u ´rovn´ı. Dalˇs´ı konceptu´aln´ı odliˇsnost od p˚ uvodn´ıho Sokobanu je nutnost sebr´an´ı pˇeti kl´ıˇc˚ u, kter´e odemykaj´ı dveˇre od domeˇcku, ke kter´emu se mus´ı alespoˇ n jedna z beruˇsek dostat, coˇz samo o sobˇe m˚ uˇze b´ yt velik´a v´ yzva. Nen´ı tud´ıˇz nutno umist’ovat jednotliv´e krabice do u ´loˇzn´ ych m´ıst. Hra byla vyvinuta ˇcesk´ ym nez´avisl´ ym hern´ım t´ ymem Anakreon [7] pod veden´ım Martina Str´ansk´eho. Hra byla p˚ uvodnˇe vyd´ana pro MS DOS 5.x, ale pro sv˚ uj u ´spˇech byla pozdˇeji pˇredˇel´ana na dalˇs´ı operaˇcn´ı syst´emy a nyn´ı Beruˇsky bˇeˇz´ı na operaˇcn´ım syst´emu Linux i Windows. Pro grafick´e pozad´ı je vyuˇzito multimedi´aln´ı knihovny SDL. Hra obsahuje 120 hern´ıch u ´rovn´ı.
2.2
Pˇ redstaven´ı mobiln´ıch platforem
Pro naplnˇen´ı pˇredmˇetu t´eto pr´aci si nyn´ı pˇredstav´ıme obˇe dvˇe mobiln´ı platformy, na kter´e hru Beruˇsky pˇrevedeme. Pov´ıme si nˇeco o z´akladn´ıch rysech a historii.
2.2.1
iOS
Operaˇcn´ı syst´em iOS dˇr´ıve iPhone OS, viz obr. 2.3, je operaˇcn´ı syst´em urˇcen´ y pro mobiln´ı zaˇr´ızen´ı, kter´ y byl a neust´ale je vyv´ıjen´ y a distribuovan´ y spoleˇcnost´ı Apple Inc. Jeho prvotn´ı pˇredstaven´ı se odehr´alo v roce 2007 spoleˇcnˇe s mobiln´ım telefonem iPhone. Postupnˇe byl syst´em iOS rozˇs´ıˇren na ostatn´ı Apple zaˇr´ızen´ı, jako iPod Touch (z´aˇr´ı 2007), iPad (leden 2010) a druhou generaci Apple TV (z´aˇr´ı 2010). V pr˚ ubˇehu tˇechto let se z´aroveˇ n s uv´adˇen´ım 4
Teoretick´a ˇc´ast
Pˇredstaven´ı mobiln´ıch platforem
dalˇs´ıch zaˇr´ızen´ı, na kter´ ych iOS bˇeˇzel, ˇci nov´ ych verz´ı st´avaj´ıc´ıch zaˇr´ızen´ı, vyv´ıjela i verze samotn´eho syst´emu iOS. Prvn´ı verz´ı byla verze 1.0, kter´a se objevila souˇcasnˇe s uveden´ım prvn´ıho mobiln´ıho telefonu iPhone. Tato verze proˇsla postupnˇe nˇekolika updaty, z nichˇz posledn´ı nesl oznaˇcen´ı 1.1.5. Postupnˇe v pr˚ ubˇehu let n´asledovali verze 2.x, 3.x, 4.x, 5.x a 6.x. V dobˇe psan´ı t´eto pr´ace je aktu´aln´ı verze operaˇcn´ıho syst´emu iOS verze s oznaˇcen´ım 6.1.3. V ˇcervnu 2013 byla ozn´amena verze iOS 7.0, kter´a se objev´ı na podzim roku 2013 [44].
Obr´azek 2.3: Uk´azka operaˇcn´ıho syst´emu iOS Na rozd´ıl od syst´emu Windows Phone od spoleˇcnosti Microsoft ˇci Android od spoleˇcnosti Google nenab´ız´ı Apple syst´em iOS ostatn´ım v´ yrobc˚ um hardwaru a jedn´a se tedy o uzavˇrenou platformu, kter´a se i pˇresto tˇeˇs´ı ve svˇetˇe velk´e oblibˇe. 5
Teoretick´a ˇc´ast
Pˇredstaven´ı mobiln´ıch platforem
Uˇzivatelsk´e rozhran´ı operaˇcn´ıho syst´emu iOS je zaloˇzeno na konceptu pˇr´ım´e manipulace za pouˇzit´ı multidotykov´ ych gest. Prvky uˇzivatelsk´eho rozhran´ı tvoˇr´ı posuvn´ıky, pˇrep´ınaˇce a tlaˇc´ıtka. Interakce s operaˇcn´ım syst´emem prob´ıh´a pomoc´ı gest jako swipe (t´ahnut´ı prstem), tap (poklep´an´ı prstem), pinch (pˇribl´ıˇzen´ı dvou prst˚ u), ˇci reverse pinch (odd´alen´ı dvou prst˚ u), kter´e maj´ı speci´aln´ı v´ yznam v z´avislosti na kontextu operaˇcn´ıho syst´emu a jeho multidotykov´eho rozhran´ı. iOS je mobiln´ı verz´ı operaˇcn´ıho syst´emu OS X zn´am´eho z osobn´ıch poˇc´ıtaˇc˚ u Apple. Z d˚ uvodu uzavˇrenosti platformy a d´ıky tomu, ˇze spoleˇcnost Apple vyv´ıj´ı pro sv´e telefony (a ostatn´ı zaˇr´ızen´ı, kter´e jsou poh´anˇeny syst´emem iOS) i vlastn´ı hardware, dok´aˇze spoleˇcnost Apple maxim´alnˇe vyladit a optimalizovat spolupr´aci mezi t´ımto hardwarem a softwarem a t´ım nab´ıdnout uˇzivatel˚ um nejv´ıce optimalizovan´ y operaˇcn´ı syst´em na trhu. K tomu napom´ah´a i vlastnictv´ı nˇekolika d˚ uleˇzit´ ych patent˚ u jako napˇr´ıklad zn´am´ y patent ˇc´ıslo 7,786,975 [8]. Pomoc´ı tohoto patentu je doc´ıleno plynul´eho ovl´ad´an´ı taˇzen´ım bodem kontaktu, zejm´ena v situac´ıch, kdy se dostaneme na konec obsahu na obrazovce a d´ale jiˇz nen´ı co zobrazovat. V ten moment je moˇzn´e s obsahem d´ale t´ahnout, ale pouze do urˇcit´e u ´rovnˇe a ˇc´ım d´ale t´ahneme, t´ım m´ame vizu´aln´ı pocit st´ale vˇetˇs´ıho tˇren´ı a taˇzen´ı d´ale je st´ale n´aroˇcnˇejˇs´ı a po puˇstˇen´ı bodu taˇzen´ı se obsah plynule zhoupne zpˇet, tak aby zaplnil celou plochu telefonu, jeˇz m´a k dispozici.
2.2.2
Android
Android (viz obr. 2.4) je operaˇcn´ı syst´em od spoleˇcnosti Google Inc., zaloˇzen´ y na operaˇcn´ım syst´emu Linux. Android je prim´arnˇe zamˇeˇren na mobiln´ı zaˇr´ızen´ı vybaven´e dotykovou obrazovkou jako napˇr´ıklad chytr´e telefony nebo tablety. Android byl p˚ uvodnˇe vyvinut spoleˇcnost´ı Android Inc., jej´ımˇz hlavn´ım investorem byla spoleˇcnost Google. Pozdˇeji v roce 2005 doˇslo ke koupi spoleˇcnosti Android Inc. pr´avˇe spoleˇcnost´ı Google. Operaˇcn´ı syst´em Android byl pˇredstaven v roce 2007 a z´aroveˇ n s jeho pˇredstaven´ım byla zaloˇzena aliance Open Handset Alliance [6]. Jedn´a se o konsorcium hardwarov´ ych, softwarov´ ych a telekomunikaˇcn´ıch spoleˇcnost´ı vˇenuj´ıc´ı se prosazov´an´ı otevˇren´ ych standard˚ u v oblasti mobiln´ıch zaˇr´ızen´ı. V dobˇe sv´eho prvn´ıho uveden´ı se nach´azel syst´em Android v beta verzi. Prvn´ı komerˇcn´ı verze se objevila v z´aˇr´ı 2008 a jednalo se o verzi 1.0. Od t´e doby doznal syst´em Android ˇrady vˇetˇs´ıch ˇci menˇs´ıch vylepˇsen´ı od zmˇeny
6
Teoretick´a ˇc´ast
Pˇredstaven´ı mobiln´ıch platforem
Obr´azek 2.4: Uk´azka operaˇcn´ıho syst´emu Android
linuxov´eho j´adra z verze 2.6.x na verzi 3.0.x, pˇres r˚ uzn´a zrychlen´ı syst´emu, pamˇet’ov´e optimalizace, aˇz po kompletn´ı pˇrepracov´an´ı uˇzivatelsk´eho ovl´ad´an´ı. V ˇcervenci 2013 byla pˇredstavena verze Androidu 4.3 s k´odov´ ym oznaˇcen´ım Jelly Bean. Operaˇcn´ı syst´em Android je open source a je vyd´an pod Apache licenc´ı. To umoˇznuje, aby byl zdrojov´ y k´od volnˇe upravov´an a distribuov´an v´ yrobci zaˇr´ızen´ı a z´aroveˇ n v pˇr´ıpadˇe propriet´arn´ıch vylepˇsen´ı jednotliv´ ych v´ yrobc˚ u, nemuseli v´ yrobci tato vylepˇsen´ı vyd´avat zp´atky open source komunitˇe a tud´ıˇz si kaˇzd´ y v´ yrobce m˚ uˇze chr´anit svoje know-how. V dobˇe sv´eho pˇredstaven´ı nebyl Android vn´ım´an jako v´aˇzn´a hrozba [11], v t´e dobˇe zabˇehnut´ ymi spoleˇcnostmi na mobiln´ım trhu jako Nokia, Microsoft ´ ˇci Apple. Uspˇech Androidu ale vˇsechny pˇrekvapil, coˇz na jedn´e stranˇe vedlo 7
Teoretick´a ˇc´ast
Reˇserˇse multiplatformn´ıch framework˚ u
ku ´stupu ze sl´avy do t´e doby dominantn´ı Nokie a na druh´e stranˇe ke spoustˇe patentov´ ych spor˚ u okolo Androidu, z nichˇz nejzn´amˇejˇs´ı je spor mezi Googlem a Oraclem ohlednˇe poruˇsen´ı autorsk´ ych pr´av Oraclu t´ ykaj´ıc´ıch se vyuˇzit´ı jazyka Java pro bˇeh uˇzivatelsk´ ych aplikac´ı [41].
2.3
Reˇ serˇ se multiplatformn´ıch framework˚ u
V pˇr´ıpadˇe v´ yvoje pro mobiln´ı platformy je nutn´e br´at v potaz, proˇc zam´ yˇslenou aplikaci dˇel´ame a co je naˇs´ım c´ılem. Pokud je naˇs´ım c´ılem oslovit pouze uˇzivatele jedn´e konkr´etn´ı platformy, nemus´ıme se starat, jestli n´ami zvolen´ y framework, tj. sada knihoven a n´astroj˚ u usnadˇ nuj´ıc´ıch v´ yvoj pro danou platformu, podporuje moˇznost v´ yslednou aplikaci pˇrev´est i na jin´e platformy. V opaˇcn´em pˇr´ıpadˇe, kdy zam´ yˇsl´ıme v´ yslednou aplikac´ı oslovit uˇzivatele v´ıce mobiln´ıch platforem, je dobr´e zvolit takov´ y framework, kter´ y n´am v´ yvoj pro v´ıce platforem dovol´ı. Takov´ y framework naz´ yv´ame multiplatformn´ı framework. Kdybychom takov´ y framework nepouˇzili a chtˇeli bychom napsat multiplatformn´ı aplikaci, znamenalo by to napsat tuto aplikaci pro kaˇzdou platformu zvl´aˇst’, coˇz se s rostouc´ım poˇctem platforem st´av´a ne´ unosn´ ym a v t´eto situaci je vidˇet v´ yhoda multiplatformn´ıch framework˚ u. Pˇri v´ ybˇeru vhodn´eho multiplatformn´ıho hern´ıho frameworku nab´ız´ı trh ˇsirokou ˇsk´alu moˇznost´ı. Dle kl´ıˇcov´ ych technologi´ı, kter´e tyto frameworky vyuˇz´ıvaj´ı je lze rozdˇelit do tˇr´ı z´akladn´ıch skupin: HTML5/CSS, Adobe AIR (Flash) a 2D/3D frameworky. V n´asleduj´ıc´ı ˇc´asti si pˇribl´ıˇz´ıme z´astupce z kaˇzd´e t´eto skupiny.
2.3.1
HTML5/CSS hern´ı frameworky
Prvn´ı potencion´aln´ı skupinu technologi´ı pro multiplatformn´ı v´ yvoj tvoˇr´ı webov´e technologie, kdy se vyuˇz´ıv´a bˇehu aplikac´ı ve webov´em prohl´ıˇzeˇci. Bˇehem ve webov´em prohl´ıˇzeˇci nen´ı myˇsleno, ˇze by aplikace bˇeˇzela na nˇejak´em webov´em serveru a pˇristupovalo se k n´ı pˇres www str´anky pomoc´ı webov´eho prohl´ıˇzeˇce, jako napˇr´ıklad pomoc´ı prohl´ıˇzeˇce Chrome od Googlu, ˇci Safari od Applu. Aˇckoliv toto je taky jeden z moˇzn´ ych pˇr´ıstup˚ u, my m´ame na mysli aplikace, kter´e pro sv˚ uj bˇeh vyuˇz´ıvaj´ı webov´ y prohl´ıˇzeˇc na sv´em pozad´ı a jejich instalace prob´ıh´a klasick´ ym zp˚ usobem pˇres obchody s aplikacemi jednotliv´ ych platforem (App Store v pˇr´ıpadˇe iOS a Google Play v pˇr´ıpadˇe Androidu). 8
Teoretick´a ˇc´ast
Reˇserˇse multiplatformn´ıch framework˚ u
Sencha Touch Sencha Touch [43] je javascriptov´a UI knihovna navrˇzen´a speci´alnˇe pro psan´ı mobiln´ıch aplikac´ı. Jej´ım typick´ ym pouˇzit´ım je psan´ı mobiln´ıch webov´ ych aplikac´ı, kter´e maj´ı look and feel jako nativn´ı aplikace na podporovan´ ych zaˇr´ızen´ıch. Je zcela zaloˇzen´a na webov´ ych standardech jako HTML5, CSS3 a JavaScript. Zamˇeˇren´ım Sencha Touch knihovny je nab´ıdnut´ı v´ yvoj´aˇr˚ um rychl´e a snadn´e vytvoˇren´ı HTML5 aplikac´ı, kter´e funguj´ı na Androidech, iOS a BlackBerry zaˇr´ızen´ıch a poskytnout zkuˇsenost zn´amou z nativn´ıch aplikac´ı uprostˇred webov´eho prohl´ıˇzeˇce.
Apache Cordova Apache Cordova [15] je open source mobiln´ı v´ yvojov´ y framework umoˇzn ˇuj´ıc´ı vyuˇzit´ı standardn´ıch webov´ ych technologi´ı jako HTML5, CSS3 a JavaScript pro multiplatformn´ı v´ yvoj. Umoˇznuje tak vyhnout se nativn´ımu jazyku kaˇzd´e mobiln´ı platformy. Z´aroveˇ n s t´ım ale nab´ız´ı moˇznost pˇr´ıstupu k sensor˚ um mobiln´ıch zaˇr´ızen´ı, jako napˇr´ıklad akcelerometr, kamera, kompas atd. pomoc´ı javascriptov´ ych API. Je moˇzn´a kombinace z r˚ uzn´ ymi UI frameworky jako napˇr´ıklad jQuery Mobile [25], Dojo Mobile [29] nebo Sencha Touch [43]. Apache Corodova je k dispozici pro tyto platformy: iOS, Android, Blackberry, Windows Phone, Palm WebOS, Bada a Symbian.
2.3.2
Adobe AIR (Flash) hern´ı frameworky
Dalˇs´ı moˇzn´ ym ˇreˇsen´ım multiplatformn´ıho v´ yvoje je technologie Adobe Integrated Runtime (Adobe AIR) [5] od spoleˇcnosti Adobe Systems Inc. Adobe AIR je bˇehov´e prostˇred´ı, pro kter´e lze vyv´ıjet aplikace za pomoc´ı Adobe Flash, Apache Flex (dˇr´ıve Adobe Flex), HTML a Ajax. Aplikace napsan´a pro Adobe AIR m˚ uˇze b´ yt nasazen´a jak na desktopov´e prostˇred´ı, tak na mobiln´ı zaˇr´ızen´ı. Z desktopov´ ych prostˇred´ı je podporov´ano Windows (XP a novˇejˇs´ı) a OS X. Ofici´aln´ı podpora pro Linux byla ukonˇcena v ˇcervnu roku 2011. Mezi podporovan´e mobiln´ı operaˇcn´ı syst´emu patˇr´ı Android (od verze 2.3), Apple iOS (od verze 4.3) a BlackBerry Tablet OS. Programovac´ım jazykem prostˇred´ı Adobe AIR je ActionScript, coˇz je dialekt ECMAScriptu.
9
Teoretick´a ˇc´ast
Reˇserˇse multiplatformn´ıch framework˚ u
starling.events.EventDispatcher
starling.display.DisplayObject
starling.display.DisplayObjectContainer
starling.display.Quad
starling.display.Image
starling.display.Button
starling.display.Sprite
starling.display.Stage
starling.text.TextField
starling.display.MovieClip
Obr´azek 2.5: Hierarchie tˇr´ıd zobrazovac´ıch objekt˚ u
Starling Starling [42] je open source hern´ı engine vyuˇz´ıvaj´ıc´ı Adobe AIR. Jak bylo ˇreˇceno v pˇredchoz´ım odstavci, Adobe AIR vyuˇz´ıv´a Adobe Flash a fundament´aln´ı souˇca´st´ı Adobe Flashe je tzv. display tree architecture viz obr´azek 2.5. Ta popisuje jak a kam kreslit objekty na obrazovku. Starling byl inspirov´an touto architekturou do t´e u ´rovnˇe, ˇze mnoho tˇr´ıd a funkc´ı maj´ı stejn´a jm´ena jako jejich origin´aln´ı Flashov´e ekvivalenty. Koˇrenov´a tˇr´ıda vˇseho co lze zobrazit na obrazovku je DisplayObject. Jedn´a se o abstraktn´ı tˇr´ıdu, takˇze od n´ı nelze vytvoˇrit instanci. Ale poskytuje metody a vlastnosti, kter´e kaˇzd´ y zobrazovac´ı objekt sd´ıl´ı, viz n´asleduj´ıc´ı v´ yˇcet: • position (x, y) • size (width, height) • scale factor (scaleX, scaleY) • rotation • opacity (alpha) Pod´ıv´ame-li se bl´ıˇze na konkr´etn´ı tˇr´ıdy dˇed´ıc´ı z DisplayObject, vid´ıme nˇekolik tˇr´ıd, jeˇz m˚ uˇzou b´ yt pouˇzity, tak jak jsou: Quad, Image, TextField, Button ˇci MovieClip. Je pomˇernˇe zˇrejm´e co s kaˇzdou tˇr´ıdou m˚ uˇzeme doc´ılit. 10
Teoretick´a ˇc´ast
Reˇserˇse multiplatformn´ıch framework˚ u
Dalˇs´ı abstraktn´ı tˇr´ıdou je DisplayObjectContainer, kter´a slouˇz´ı jako kontejner pro dalˇs´ı objekty, kter´e chceme zobrazit. Dovoluje organizovat zobrazovan´e objekty do logick´eho syst´emu - tzv. display tree, kde pomoc´ı jednoduˇsˇs´ıch objekt˚ u m˚ uˇzeme skl´adat objekty sloˇzitˇejˇs´ı. Programovac´ım jazykem knihovny Starling je ActionScript 3.
Citrus Citrus [19] je multiplatformn´ı hern´ı engine akcelerovan´ y pomoc´ı GPU coˇz zajiˇstuje Stage3D [3] technologie od firmy Adobe. Pro zobrazen´ı 2D grafiky se vyuˇz´ıv´a knihovna Starling (pˇredstaven´a v pˇredeˇsl´e sekci). Pro zobrazen´ı 3D grafiky je vyuˇz´ıv´a engine Away3d [18].
Obr´azek 2.6: Architektura Citrus Enginu [19] Vedle 2D ˇci 3D grafiky nab´ız´ı tento engine i podporu fyziky, kde si lze vybrat z nˇekolika fyzik´aln´ıch knihoven: Box2D [13], Nape [20], AwayPhysics [33] a jednoduch´ y detektor koliz´ı. Dalˇs´ımi z podporovan´ ych n´astroj˚ u pro jednoduˇsˇs´ı v´ yvoj her jsou editory level˚ u: Tiled Map Editor [17] a Generic LEvel EDitor 2D [2]. 11
Teoretick´a ˇc´ast
2.3.3
Reˇserˇse multiplatformn´ıch framework˚ u
C/C++ hern´ı frameworky
Dalˇs´ım a pravdˇepodobnˇe nejrozˇs´ıˇrenˇejˇs´ım ˇreˇsen´ım multiplatformn´ıho v´ yvoje pro mobiln´ı syst´emy je vyuˇzit´ı C/C++ framework˚ u. Tyto frameworky vˇetˇsinou nab´ızej´ı moˇznost v´ yvoje 2D a 3D grafiky pomoc´ı OpenGL ES rozhran´ı.
OpenGL ES OpenGL for Embedded Systems (OpenGL ES) [21] je podmnoˇzinou OpenGL 3D grafick´eho aplikaˇcn´ıho programov´eho rozhran´ı navrˇzen´eho pro vestavˇen´e syst´emy jako napˇr´ıklad mobiln´ı telefony, PDA zaˇr´ızen´ı ˇci kapesn´ı hern´ı konzole (napˇr. Nintendo 3DS). V souˇcasn´e dobˇe existuje nˇekolik verz´ı OpenGL specifikace. OpenGL ES 1.0 je vztaˇzeno k OpenGL 1.3, OpenGL ES 1.1 je odvozeno od OpenGL 1.5 specifikace a OpenGL ES 2.0 je odvozeno od OpenGL 2.0 specifikace. To znamen´a, ˇze napˇr´ıklad aplikace napsan´a pro OpenGL ES 1.0 by mˇela b´ yt jednoduˇse portovateln´a do desktopov´eho OpenGL 1.3, jelikoˇz OpenGL ES je zredukovan´a verze tohoto API. Opak m˚ uˇze a nemus´ı b´ yt pravda, z´aleˇz´ı na pouˇzit´ı jednotliv´ ych vlastnost´ı.
Cocos2D Python Cocos2D je 2D open source hern´ı framework. P˚ uvodn´ı Cocos2D framework je naps´an v Pythonu, ale byl portov´an do dalˇs´ıch jazyk˚ u a na dalˇs´ı platformy. Cocos2D (Python) umoˇznuje ps´at hry pro platformy Mac, Windows a Linux a na tˇechto tˇrech platform´ach lze tak´e hry vyv´ıjet. Svou jednoduchost´ı pouˇzit´ı, t´ım jak jednoduˇse lze vytv´aˇren animace, pˇrechody, jednoduchou prac´ı se sprity, podporuj´ıc´ı operace jako move, rotate, scale, sequence, spawn atd., si tento framework z´ıskal velkou popularitu a doˇckal se mnoha port˚ u na jin´e platformy.
Cocos2D iPhone V˚ ubec nejzn´amˇejˇs´ım a nej´ uspˇeˇsnˇejˇs´ım portem je Cocos2d iPhone. N´azev s´am jiˇz napov´ıd´a, ˇze jde o port na platformu iOS a kromˇe t´eto platformy lze pomoc´ı tohoto portu hry publikovat jeˇstˇe pro Mac. Cocos2D iPhone se doˇckal 12
Teoretick´a ˇc´ast
Reˇserˇse multiplatformn´ıch framework˚ u
takov´e popularity, ˇze se dnes v podstatˇe stal synonymem pro pojem Cocos2D. Pokud se tedy nˇekde mluv´ı o Cocos2D, maj´ı lidi vˇetˇsinou na mysli Cocos2D iPhone, nikoliv p˚ uvodn´ı pythonovsk´ y Cocos2D. Rozd´ıl mezi pythonovsk´ ym Cocos2D a Cocos2D iPhone je zejm´ena v tom, ˇze Cocos2D iPhone je kompletnˇe napsan´ y v programovac´ım jazyce ObjectiveC a lze v nˇem vyv´ıjet pouze v prostˇred´ı operaˇcn´ıho syst´emu Mac OS. Cocos2D iPhone m´a kolem sebe jak rozs´ahlou komunitu uˇzivatel˚ u, tak i v´ yvoj´aˇr˚ u a bylo v nˇem naprogramov´anu mnoho u ´spˇeˇsn´ ych titul˚ u jako napˇr´ıklad u ´spˇeˇsn´a hra Badland [10]. Cocos2D je hern´ı API, kter´e vyuˇz´ıv´a OpenGL ES, je snadno rozˇsiˇrovateln´e a jednoduˇse integrovateln´e s knihovnami tˇret´ıch stran. Nab´ız´ı t´eˇz snadnou integraci s fyzik´aln´ımi knihovnami Chipmunk ˇci Box2D. Pˇri ˇreˇsen´ı naˇseho probl´emu je nezbytn´a vedle iOS t´eˇz podpora platformy Android. Jiˇz z n´azvu tohoto portu Cocos2D frameworku je patrn´e, ˇze to s Platformou Android nebude v˚ ubec jednoduch´e. A to se tak´e ukazuje v praxi. Cocos2D portov´an´ı na Android nepodporuje. Existuje sice sluˇzba Apportable [9], pomoc´ı kter´e lze aplikace napsan´e v Cocos2D iPhone pˇrev´est na platformu Android, ale jedn´a se o komerˇcn´ı sluˇzbu a ta jako takov´a nen´ı zadarmo. Naˇstˇest´ı popularita Cocos2D iPhone vzrostla natolik, ˇze se objevili dalˇs´ı porty Cocos2D zaloˇzen´e pr´avˇe na Cocos2D iPhone.
Cocos2D-x Cocos2D-x je open source multiplatformn´ı 2D hern´ı framework, kter´ y vych´az´ı z Cocos2D iPhone. Podporovan´e platformy tohoto frameworku jsou: iOS stabiln´ı, otestovan´ y na iOS 5.x ∼ 6.x SDK. Android stabiln´ı, otestovan´ y na 2.0 ∼ 4.x, ndk r5 ∼ r8 Windows Phone 8 a Win8 Metro stabiln´ı Bada d´ale nepodporov´ano od cocos2d-x v2.0 BlackBerry stabiln´ı, podporuje Playbook a BB10 Marmalade stabiln´ı od cocos2d-x v0.11.0 Windows stabiln´ı, otestov´ano na WinXP/Vista/Win7 13
Teoretick´a ˇc´ast
Reˇserˇse multiplatformn´ıch framework˚ u
Linux podporov´an, ale obˇcas nestabiln´ı Hlavn´ım programovac´ım jazykem Cocos2D-x je jazyk C++. Vedle jazyka C++ ale nab´ız´ı t´eˇz binding pro jazyky Lua a Javascript a d´ıky tomu lze hry snadno ps´at i pro c´ılovou platformu HTML5. Na n´asleduj´ıc´ım obr´azku 2.7 je zobrazena rodina Cocos2D framework˚ u (pouze ty nejzn´amˇejˇs´ı vˇetve).
Obr´azek 2.7: Vztahy mezi Cocos2d frameworky Frameworky zobrazen´e modˇre (Cocos2d-iPhone, Cocos2d-x, Cocos2d-HTML5, a Cocos Builder [14]) vz´ajemnˇe spolupracuj´ı v tom smyslu, ˇze nov´e verze tˇechto framework˚ u vych´azej´ı koordinovanˇe s frekvenc´ı cca 4 releas˚ u do roka.
Marmalade Marmalade SDK [39] je multiplatformn´ı framework od firmy Ideaworks3D Limited. Marmalade SDK byl dˇr´ıve zn´am pod n´azvem Airplay SDK, ale 14
Teoretick´a ˇc´ast
Reˇserˇse multiplatformn´ıch framework˚ u
v ˇcervenu 2011 spoleˇcnˇe s vyd´an´ım verze 5.0.0. doˇslo k pˇrejmenov´an´ı na Marmalade SDK. SDK bylo nejdˇr´ıve vyuˇz´ıv´ano a vyv´ıjeno pro intern´ı v´ yvoj video her ve spoleˇcnosti Ideaworks3D, ale pozdˇeji se zmˇenilo na samostatn´ y produkt. Z´akladn´ı myˇslenkou Marmalade SDK je napiˇs jednou, spust’ vˇsude, tak aby jeden k´od mohl b´ yt zkompilov´an a spuˇstˇen na vˇsech podporovan´ ych platform´ach, m´ısto toho, aby bylo nutn´e pro kaˇzdou platformu ps´at program v jin´em jazyce za pouˇzit´ı rozliˇsn´ ych API. Tohoto je doc´ıleno poskytnut´ım C/C++ API, kter´e slouˇz´ı jako abstraktn´ı vrstva pro kl´ıˇcov´e API jednotliv´ ych platforem. V u ´noru 2013 byl vyd´an RAD n´astroj Marmalade Quick. Jedn´a se o n´astroj pro rychl´ y a flexibiln´ı v´ yvoj 2D her a aplikac´ı. Je zaloˇzen na nejlepˇs´ıch open source komponent´ach jako napˇr´ıklad Cocos2D-x ˇci fyzik´aln´ım enginu Box2D. Jako programovac´ı jazyk je pouˇzit scriptovac´ı jazyk Lua [28]. Pomoc´ı Marmalade frameworku bylo naprogramov´ano spoustu u ´spˇeˇsn´ ych her, mezi nimiˇz je i jedna z nej´ uspˇeˇsnˇejˇs´ıch her na mobiln´ı platformy hra Cut the Rope [37]. Nev´ yhodou tohoto frameworku je nutnost poˇr´ızen´ı licence. Podporovan´e platformy jsou: iOS Vˇsechny licence Android Vˇsechny licence BlackBerry PlayBook Indie licence a vyˇsˇs´ı LG Smart TV Profesion´al licence a licencovan´ı LG v´ yvoj´aˇri Mac OS X Plus licence a vyˇsˇs´ı Windows Plus licence a vyˇsˇs´ı Windows Phone 8 Indie licence a vyˇsˇs´ı
Corona SDK Corona SDK [38] multiplatformn´ı framework pro v´ yvoj aplikac´ı pro mobiln´ı platformy iOS, Android, Amazon Kindle Fire a Barnes & Noble NOOK. 15
Teoretick´a ˇc´ast
Reˇserˇse multiplatformn´ıch framework˚ u
Corona SDK vyuˇz´ıv´a programovac´ı/skriptovac´ı jazyk Lua jako vrstvu abstrakce nad C++/OpenGL ˇca´st´ı knihovny. V dubnu 2013 byla uvolnˇena verze Corona SDK Free, pomoc´ı kter´e lze programovat a n´aslednˇe publikovat hry zcela zdarma. Zpoplatnˇeny z˚ ustaly speci´aln´ı funkce jako pˇr´ıstup k InApp n´akup˚ um apod. Corona SDK podporuje rozliˇsn´e n´astroje tˇret´ıch stran pro jeˇstˇe rychlejˇs´ı a komfortnˇejˇs´ı v´ yvoj aplikac´ı. Mezi tˇemito n´astroji jsou napˇr´ıklad: Lua Glider je IDE pro jazyk Lua obsahuj´ıc´ı vˇse co program´ator od modern´ıho IDE oˇcek´av´a vˇcetnˇe debuggeru. Corona Complete je vizu´aln´ı debugger, editor k´odu a projektov´ y manaˇzer. Nab´ız´ı chytr´ y autocomplete, konzolov´ y v´ ystup, management soubor˚ u, error a breakpoint management. SpriteHelper je aplikace pro MAC OS pom´ahaj´ıc´ı s tvorbou textur, animac´ı a fyzik´aln´ıho modelu. LevelHelper je editor u ´rovn´ı pro MAC OS, kter´ y lze snadno pouˇz´ıvat dohromady se SpriteHelper. Particle Candy je ˇca´sticov´ y editor pro tvorbu speci´aln´ıch efekt˚ u. PhysicsEditor usnadˇ nuje v´ yvoj´aˇri vytv´aˇret a editovat fyzik´aln´ı tvary hern´ıch entit. V z´akladn´ı neplacen´e verzi nab´ız´ı Corona SDK vynikaj´ıc´ı moˇznosti pro v´ yvoj na mobiln´ı zaˇr´ızen´ı a obzvl´aˇstˇe pokud chceme program c´ılit nejenom na nejrozˇs´ıˇrenˇejˇs´ı platformy iOS a Android, ale tak´e na st´ale popul´arnˇejˇs´ı ˇcteˇcky knih, je Corona SDK ide´aln´ı volbou.
Unity Unity (t´eˇz zn´am´e pod n´azvem Unity3D) je multiplatformn´ı hern´ı engine obsahuj´ıc´ı sv´e vlastn´ı IDE, viz obr´azek 2.8, vyvinut´e spoleˇcnost´ı Unity Technologies. Unity lze vyuˇz´ıt jak pro v´ yvoj webov´ ych, desktopov´ ych a konzolov´ ych her, tak pro v´ yvoj her na mobiln´ı platformy. Posledn´ı verze Unity 4.2, kter´a byla vyd´ana v ˇcervenci 2013, podporuje konkr´etnˇe tyto platformy: iOS, Android, Windows, Blackberry 10, MAC OS X, Linux, webov´e prohl´ıˇzeˇce, Flash, PlayStation 3, Xbox 360, Windows Phone 8 a Wii U. 16
Teoretick´a ˇc´ast
Reˇserˇse multiplatformn´ıch framework˚ u
Prvn´ı verze Unity byla pˇredstavena v roce 2005 na Apple Worldwide Developers Conference (WWDC). V t´e dobˇe engine Unity podporoval pouze platformu MAC OS X, ale doˇckal se velk´e podpory od v´ yvoj´aˇr˚ u, takˇze se postupnˇe rozˇs´ıˇril i na dalˇs´ı platformy. Unity 3 bylo pˇredstaven´e v roce 2010 se zamˇeˇren´ım na poskytnut´ı v´ yvoj´aˇr˚ um n´astroje odpov´ıdaj´ıc´ı tomu, co maj´ı k dispozici velk´e hern´ı studia. T´ım si z´ıskalo jeˇstˇe vˇetˇs´ı pozornost a nejen od mal´ ych studi´ı, ale tak´e od velk´ ych v´ yvoj´aˇrsk´ ych dom˚ u. Hern´ı engine Unity je k dispozici ke staˇzen´ı ve dvou rozliˇsn´ ych verz´ıch: Unity a Unity Pro. Jakou verzi Unity si poˇr´ıdit z´avis´ı na tom, na kterou platformu chtˇej´ı v´ yvoj´aˇri svoj´ı hru c´ılit. Platformy jako PlayStation 3, Xbox 360 jsou k dispozici pouze s Unity Pro a do ned´avn´e doby byla tato verze jedin´a moˇznost jak vyv´ıjet pro platformy iOS a Android. Dne 21. kvˇetna 2013 ale pˇriˇsla zmˇena a od t´eto chv´ıle je z´akladn´ı verze Unity k dispozici zdarma i pro mobiln´ı platformy iOS a Android [46]. Unity vyuˇz´ıv´a pro sv˚ uj grafick´ y engine Direct3D (Windows, XBOX 360), OpenGL (Mac, Windows, Linux, PS3), OpenGL ES (Android, iOS), a propriet´arn´ı API (Wii). Unity podporuje souborov´e form´aty model˚ u, textur a jin´ ych hern´ıch prvk˚ u z n´asleduj´ıc´ıch grafick´ ych program˚ u a n´astroj˚ u: 3ds Max, Maya, Softimage, Blender, modo, ZBrush, Cinema 4D, Cheetah3D, Adobe Photoshop, Adobe Fireworks a Allegorithmic Substance. Tyto hern´ı modely, textury atd. mohou b´ yt pˇrid´any do projektu a spravov´any pomoc´ı grafick´eho uˇzivatelsk´eho rozhran´ı syst´emu Unity. Unity podporuje nativnˇe tˇri programovac´ı jazyky: C# je univerz´aln´ı objektovˇe orientovan´ y programovac´ı jazyk vyvinut´ y spoleˇcnosti Microsoft. UnityScript jazyk speci´alnˇe navrˇzen´ y pro pouˇzit´ı s Unity. Jedn´a se o jazyk po syntaktick´e str´ance podobn´ y Javascriptu, ale s´emanticky se jedn´a o zcela odliˇsn´ y jazyk. (V Unity komunitˇe jsou pojmy UnityScript a Javascript synonyma). Boo objektovˇe orientovan´ y, staticky typovan´ y jazyk z rodiny .NET se syntax´ı inspirovanou jazykem Python.
17
Teoretick´a ˇc´ast
Reˇserˇse multiplatformn´ıch framework˚ u
Obr´azek 2.8: Uk´azka Unity IDE
Unity t´eˇz nab´ız´ı podporu fyzik´aln´ıho enginu PhysX od spoleˇcnosti Nvidia s podporou simulace ˇsat˚ u v re´aln´em ˇcase. Pˇresto, ˇze je Unity 3D hern´ı framework, lze pomoc´ı nˇej vytv´aˇret i 2D hry. Jedn´ım z nej´ uspˇeˇsnˇejˇs´ıch pˇr´ıklad˚ u je hra Bad Piggies [34] od zn´am´eho hern´ıho studia Rovio.
SDL SDL neboli Simple DirectMedia Layer [27] je open source multiplatformn´ı multimedi´aln´ı knihovna navrˇzen´a tak, aby poskytla n´ızko u ´rovˇ nov´ y programov´ y pˇr´ıstup k souborov´emu syst´emu, vl´akn˚ um, poˇc´ıtaˇcov´e s´ıti, k hardwarov´ ym perif´eri´ım jako je kl´avesnice, myˇs, joystick, CD-ROM, audio atd., d´ale
18
Teoretick´a ˇc´ast
Reˇserˇse multiplatformn´ıch framework˚ u
pˇr´ıstup k 3D hardwaru prostˇrednictv´ım OpenGL API a v neposledn´ı ˇradˇe pˇr´ıstup pˇr´ımo k 2D video framebufferu. SDL podporuje Mac OS X, Linux, Windows, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, iOS a Android. Zdrojov´ y k´od obsahuje t´eˇz podporu pro dalˇs´ı operaˇcn´ı syst´emy (napˇr. AmigaOS, Dreamcast, Atari, AIX, OSF/Tru64, RISC OS, SymbianOS a OS/2), ale tyto nejsou ofici´alnˇe podporov´any a z dneˇsn´ıho pohledu uˇz se jedn´a pouze o raritu urˇcenou milovn´ık˚ um zaˇsl´ ych ˇcas˚ u. SDL je naps´ano v jazyce C, ale pracuje nativnˇe s jazykem C++ a obsahuje binding pro spousty dalˇs´ıch jazyk˚ u, napˇr. Ada, C#, Eiffel, Erlang, Euphoria, Go, Guile, Haskell, Java, Lisp, Lua, ML, Objective-C, Pascal, Perl, PHP, Pike, Pliant, Python, Ruby a Smalltalk.
Obr´azek 2.9: Architektura Simple DirectMedia Layer
SDL m´a ve sv´em n´azvu slovo “layer” (vrstva), protoˇze z technick´eho hlediska se jedn´a o wrapper okolo specifick´ ych funkˇcnost´ı operaˇcn´ıch syst´em˚ u viz obr´azek 2.9. Hlavn´ım u ´ˇcelem SDL knihovny je poskytnout spoleˇcn´ y pˇr´ıstup k tˇemto funkcionalit´am.
19
Teoretick´a ˇc´ast
2.3.4
Reˇserˇse multiplatformn´ıch framework˚ u
Ostatn´ı frameworky
Vedle pr´avˇe probran´ ych moˇznost´ı pro multiplatformn´ı mobiln´ı v´ yvoj hern´ıch aplikac´ı existuje jeˇstˇe cel´a ˇrada dalˇs´ıch, zde neprobran´ ych moˇznost´ı, z nichˇz se na jedn´e stranˇe jedn´a povˇetˇsinou o placen´e frameworky, ˇc´ımˇz se jejich pouˇzit´ı pro u ´ˇcely t´eto pr´ace st´av´a nepraktick´e. Na druhou stranu se jedn´a o skupinu framework˚ u a knihoven kter´e jsou sice zdarma, ale u kter´ ych by jejich osvojen´ı a nauˇcen´ı bylo velice obt´ıˇzn´e z d˚ uvodu jejich menˇs´ıho rozˇs´ıˇren´ı, nedostateˇcn´e dokumentace a dalˇs´ıch d˚ uvod˚ u postihuj´ıc´ı mal´e projekty. U spousty z tˇechto ostatn´ıch knihoven hroz´ı t´eˇz nebezpeˇc´ı, ˇze se d´ale nebudou rozˇsiˇrovat, nebot’ se povˇetˇsinou jedn´a o projekty, za kter´ ymi stoj´ı mal´ y poˇcet lid´ı (one man show projekty nejsou v´ yjimkou).
2.3.5
Vyhodnocen´ı reˇ serˇ se
Uk´azali jsme, ˇze nab´ıdka framework˚ u pro multiplatformn´ı v´ yvoj pro mobiln´ı zaˇr´ızen´ı je ˇsirok´a a kdyˇz se zamˇeˇr´ıme pouze na dvˇe hlavn´ı platformy iOS a Android, je nab´ıdka jeˇstˇe ˇsirˇs´ı, coˇz je zp˚ usobeno hlavnˇe procentu´aln´ım zastoupen´ım obou platforem na mobiln´ım trhu, kde obˇe dvˇe platformy dohromady cel´emu trh jasnˇe dominuj´ı [30]. Zodpovˇedˇet ot´azku, kterou technologii pro multiplatformn´ı v´ yvoj her zvolit nen´ı jednoduch´e. Je zapotˇreb´ı zv´aˇzit povahu hry, kterou pl´anujeme na mobiln´ı platformy pˇrin´est, zdali se jedn´a o 3D hru nebo si vystaˇc´ıme s jednoduˇsˇs´ım 2D. Dalˇs´ı ot´azkou je, zdali bude potˇreba podpory fyzik´aln´ıho enginu, ˇci charakter hry s takovou funkcionalitou nepoˇc´ıt´a. Nem´enˇe d˚ uleˇzitou ot´azkou pˇred zaˇca´tkem projektu je zv´aˇzen´ı pˇr´ıpadn´eho budouc´ıho rozvoje i na jin´e platformy neˇzli iOS a Android. A v neposledn´ı ˇradˇe je zapotˇreb´ı vz´ıt do u ´vahy schopnosti a moˇznosti vˇsech ˇclen˚ u t´ ymu. Dalˇs´ı alternativou je zaˇc´ıt na zelen´e louce a napsat vlastn´ı framework, jeˇz bude pokr´ yvat vˇsechny potˇreby naˇseho projektu. Pro tuto alternativu je ale rozumn´e se rozhodnou jen po pˇredchoz´ıch zkuˇsenostech a se znalost´ı omezen´ı st´avaj´ıc´ıch ˇreˇsen´ı. Z ekonomick´eho hlediska je toto ˇreˇsen´ı nejm´enˇe v´ yhodn´e a je velice nepravdˇepodobn´e, ˇze by st´avaj´ıc´ı frameworky nepokryli potˇreby naˇseho projektu alespoˇ n do urˇcit´e m´ıry. V naˇsem pˇr´ıpadˇe je ale tato moˇznost prvn´ı, kterou mus´ıme zavrhnout z d˚ uvodu nedostateˇcn´ ych znalost´ı probran´ ych framework˚ u, z nichˇz nˇekter´e nab´ız´ı skuteˇcnˇe l´akav´e vlastnosti.
20
Teoretick´a ˇc´ast
Reˇserˇse multiplatformn´ıch framework˚ u
V naˇsem pˇr´ıpadˇe m´ame dan´e koncov´e platformy iOS a Android, takˇze m˚ uˇzeme vybrat jak´ ykoliv z pˇredstaven´ ych framework˚ u. Co se t´ yˇce fyziky, tak ˇza´dn´e fyzik´aln´ı prvky hra Beruˇsky neobsahuje. St´ale jsme, tud´ıˇz v situaci kdy m˚ uˇzeme zvolit libovoln´ y z framework˚ u. V naˇsem pˇr´ıpadˇe je ale velice d˚ uleˇzit´ ym faktorem to, ˇze se jedn´a o konverzi hry, jeˇz je napsan´a v C++ pomoc´ı knihovny SDL. Verze knihovny SDL ve kter´e jsou Beruˇsky naprogramov´any je 1.2. Koˇreny t´eto verze sahaj´ı aˇz do roku 2000, tedy do doby kdy pojem chytr´ y telefon nikomu nic neˇr´ıkal a tak nen´ı divu, ˇza ani v t´eto verzi knihovny SDL jak´akoliv podpora mobiln´ıch platforem sch´az´ı. To vˇsechno se zmˇenilo s pˇr´ıchodem SDL verze 2.0, jeˇz byla ozn´amena 14. ˇcervence 2012 [22]. Framework SDL 2.0 (p˚ uvodn´ı oznaˇcen´ı bylo SDL 1.3) je znaˇcn´e rozˇs´ıˇren´ı p˚ uvodn´ıho k´odu SDL 1.2, kter´e nen´ı s touto verz´ı zpˇetnˇe kompatibiln´ı. Framework SDL 2.0 je vyd´an pod zlib licenc´ı [47]. Z d˚ uvodu znaˇcn´e z´avislosti Beruˇsek na tomto frameworku (zejm´ena v oblasti renderov´an´ı v´ ysledn´e sc´eny) by volba jin´eho frameworku znamenala kompletn´ı pˇreps´an´ı cel´e hry Beruˇsky, takˇze by v´ ysledn´ y k´od s t´ım p˚ uvodn´ım mˇel jen m´alo spoleˇcn´eho. Z tohoto d˚ uvodu jsme se rozhodli pro ˇreˇsen´ı pov´ yˇsen´ım verze frameworku SDL z verze 1.2 na verzi 2.0 a vyˇreˇsit probl´emy s nekompatibiln´ım API, kter´e se ve zdrojov´ ych k´odech hry Beruˇsky objev´ı. Aˇckoliv oˇcek´av´ame, ˇze tˇechto nekompatibilit se objev´ı cel´a ˇrada, st´ale jejich oprava bude vyˇzadovat nepatrn´e mnoˇzstv´ı ˇcasu oproti mnoˇzstv´ı ˇcasu, co by si vyˇza´dalo kompletn´ımu pˇreps´an´ı zdrojov´ ych k´od˚ u. Takto uˇsetˇren´ y ˇcas vˇenujeme pˇredˇel´an´ı ovl´ad´an´ı a uˇzivatelsk´eho prostˇred´ı pro dotykov´e telefony.
21
3 Popis platforem Android a iOS 3.1
Popis architektury Androidu
Jak jiˇz bylo ˇreˇceno v kapitole 2.2.2, operaˇcn´ı syst´em Android je zaloˇzen na operaˇcn´ım syst´emu Linux verze 2.6. S verz´ı Androidu 4.0 pˇriˇsla zmˇena i v t´eto oblasti a Android v t´eto verzi vych´az´ı z verze Linuxu 3.x spolu s middleware knihovnami viz obr´azek 3.1. Linuxov´e j´adro slouˇz´ı jako abstrakce nad hardwarem, pro spr´avu pamˇeti a dalˇs´ı n´ızko u ´rovˇ nov´e vˇeci a spoleˇcnˇe s middleware knihovnami je tato ˇca´st Androidu naps´ana v jazyce C. Aplikaˇcn´ı software naproti tomu bˇeˇz´ı za pomoc´ı aplikaˇcn´ıho frameworku, kter´ y je naps´an v jazyce Java a t´ım p´adem i prim´arn´ı programovac´ı jazyk pro aplikaˇcn´ı software pro Android je jazyk Java. Aplikaˇcn´ı framework poskytuje aplikac´ım sluˇzby jako napˇr´ıklad: Activity Manager star´a se o ˇzivotn´ı cyklus aplikace. Content providers zapouzdˇruje data, kter´a jsou sd´ılen´a (napˇr. seznam kontakt˚ u). Resource manager star´a se o vˇsechny zdroje. Location manager poskytuje lokaci telefonu (pomoc´ı GPS, GSM, WiFi). Notification manager spravuje vˇsechny ud´alosti, jako napˇr. pˇr´ıchod sms, sch˚ uzky atd. Bˇeh samotn´ ych Java aplikac´ı je zajiˇstˇen pomoc´ı virtu´aln´ıho stroje Dalvik [45] obsahuj´ıc´ı just-in-time kompil´ator. Na rozd´ıl od virtu´aln´ıho stroje Javy, kter´ y vykon´av´a program po jeho kompilaci do Java Byte Code pomoc´ı javac kompil´atoru, Dalvik VM tento byte code nespouˇst´ı pˇr´ımo. Java Byte Code je nejprve pomoc´ı dex kompil´atoru pˇreveden do Dalvik Byte Code (Dalvik Executable) a aˇz pot´e je tento Dalvik k´od spuˇstˇen pomoc´ı Dalvik VM. Rozd´ıl viz obr´azek 3.2. D˚ uvodem pro pˇreklad Java Byte Code do Dalvik Byte Code je z´asadn´ı rozd´ıl mezi implementac´ı Java VM a Dalvik VM. Zat´ımco Java VM je stroj vyuˇz´ıvaj´ıc´ı z´asobn´ıkovou architekturu, Dalvik VM je stroj vyuˇz´ıvaj´ıc´ı architekturu registr˚ u viz tabulka 3.1 [40], zn´amou z rea´ln´ ych procesor˚ u. Dalvik je optimalizov´an pro syst´emy s n´ızkou n´aroˇcnost´ı 22
Popis platforem Android a iOS
Popis architektury Androidu
Applications Home
Contacts
Phone
Browser
Other
Application Framework Activity Manager
Window Manager
Content Providers
View System
Package Manager
Telephony Manager
Resource Manager
Location Manager
Media Framework
SQLite
Notification Manager
Libraries Surface Manager OpenGL
FreeType
Android Runtime Core Libraries
WebKit
Dalvik VM SGL
SSL
libc
Display Driver
Camera Driver
Flash Driver
Binder (IPC) Driver
Keypad Driver
WiFi Driver
Audio Driver
Power Mgmt
Linux Kernel
Obr´azek 3.1: Android architektura
23
Popis platforem Android a iOS Stack-based bytek´od iload 1 iload 2 iadd istore 3
Popis architektury Androidu Register-based bytek´od move r10, r1 move r11, r2 iadd r10, r10, r11 move r3, r10
Tabulka 3.1: Pˇreklad bytek´odu
na pamˇet’. V´ yhodou architektury zaloˇzen´e na registrech je potˇreba menˇs´ıho poˇctu vykonan´ ych instrukc´ı v pr˚ ubˇehu v´ ypoˇctu algoritmu. Na druhou stranu z´asobn´ıkov´a architektura umoˇzn ˇuje menˇs´ı VM k´od, takˇze v´ ysledn´ y byte k´od je menˇs´ı.
Obr´azek 3.2: Android a Java Pokud chceme v mobiln´ım zaˇr´ızen´ı s OS Android volat nativn´ı k´od, mus´ıme udˇelat dvˇe vˇeci.
24
Popis platforem Android a iOS
Popis architektury Androidu
Zaprv´e mus´ıme porozumˇet skuteˇcnosti, ˇze vol´an´ı nativn´ıho k´odu nen´ı vhodn´e pro kaˇzdou aplikaci a stejnˇe tak to nemus´ı b´ yt vhodn´e ani pro n´as. Vol´an´ı nativn´ıho k´odu s sebou pˇrin´aˇs´ı zvˇetˇsen´ı komplexnosti aplikace a v´ ysledn´ y efekt a zrychlen´ı nemus´ı b´ yt t´emˇeˇr ˇz´adn´ y. Vol´an´ı nativn´ıho k´odu je vhodn´e zejm´ena pˇri algoritmech, kter´e vyˇzaduj´ı pln´e zat´ıˇzen´ı procesoru a jeˇz nealokuj´ı moc pamˇeti, napˇr. zpracov´an´ı sign´al˚ u, fyzik´aln´ı simulace atd. Druh´a vˇec, kterou mus´ıme udˇelat (v pˇr´ıpadˇe, ˇze jsme si to v bodu jedna nerozmysleli) je obalit naˇse vol´an´ı nativn´ı funkce JNI wrapperem. JNI (Java Native Interface) je programov´ y framework, kter´ y dovoluje Java k´odu, jeˇz bˇeˇz´ı v JVM, volat nativn´ı k´od (a b´ yt z nativn´ıho k´odu vol´an). Dovoluje t´eˇz volat knihovny napsan´e v jin´em jazyce, jako napˇr. v C/C++ ˇci assembleru. Jak vytv´aˇren´ı takov´eho wrapperu prob´ıh´a lze vidˇet na obr´azku 3.3 a cel´ y proces si nyn´ı podrobnˇeji pop´ıˇseme.
3.1.1
Vol´ an´ı nativn´ıho k´ odu z Javy
Jedn´ım z ide´aln´ıch kandid´at˚ u pro vol´an´ı nativn´ı funkce je program pro v´ ypoˇcet n-t´eho prvku fibonacciho posloupnosti [36], jeˇz je definovan´a rekurentn´ı rovnic´ı
Fn = Fn−1 + Fn−2 kde F1 = F2 = 1 a F0 = 0. Tedy slovnˇe ˇreˇceno kaˇzd´ y prvek posloupnosti je roven souˇctu pˇredchoz´ıch dvou prvk˚ u posloupnosti (poˇc´ınaje tˇret´ım prvkem posloupnosti). ˇ Reknˇ eme, ˇze chceme napsat program pro uk´azku rychlosti bˇehu nativn´ıho k´odu v porovn´an´ı s java k´odem na pˇr´ıkladu naivn´ıho rekurzivn´ıho algoritmu v´ ypoˇctu n-t´eho ˇclena fibonacciho posloupnosti. V javˇe n´am pro to staˇc´ı jednoduch´a metoda, kter´a m˚ uˇze b´ yt definovan´a napˇr´ıklad takto: public static int fibJ(int n) { if (n <= 0) return 0; if (n == 1) return 1; return fibJ(n - 1) + fibJ(n - 2); 25
Popis platforem Android a iOS
Popis architektury Androidu
Obr´azek 3.3: Spuˇstˇen´ı JNI k´odu
} Nyn´ı chceme v naˇsem programu porovnat dobu bˇehu t´eto metody pro dan´e n s dobou bˇehu funkce v nativn´ım k´odu pro to sam´e n. Proto mus´ıme, jak bylo ˇreˇceno v´ yˇse, obalit vol´an´ı nativn´ı funkce JNI wrapperem. Prvn´ı vˇec, kterou pro to mus´ıme udˇelat, je deklarovat signaturu metody v naˇsem java programu (bod 1 na obr´azku 3.3). To m˚ uˇzeme udˇelat n´asledovnˇe (pro vˇetˇs´ı srozumitelnost uv´ad´ıme kompletn´ı pˇrepis java tˇr´ıdy): package cz.vlach.berusky;
26
Popis platforem Android a iOS
Popis architektury Androidu
public class FibLib { public native static long fibN(long n); } Kl´ıˇcov´ ym prvkem je modifik´ator native, kter´ y ˇr´ık´a, ˇze se jedn´a o vol´an´ı nativn´ı funkce. Takto definovanou metodu m˚ uˇzeme z naˇseho java programu norm´alnˇe volat, jako by se jednalo o kteroukoliv jinou metodu a s v´ ysledkem naloˇzit jak si pˇrejeme. Rozd´ıl oproti jin´ ym metod´am je v tom, ˇze vykon´an´ı t´eto metody zaˇr´ıd´ı JNI v nativn´ım k´odu. Nyn´ı zkompilujeme tˇr´ıdu FibLib.java pomoc´ı javac kompil´atoru do byte k´odu javy (bod 2 na obr´azku 3.3). Touto kompilac´ı dostaneme soubor FibLib.class (bod 3 na obr´azku 3.3) v n´asleduj´ıc´ı adres´aˇrov´e struktuˇre. classes cz vlach berusky FibLib.class Nyn´ı ze souboru FibLib.class pomoc´ı pˇr´ıkazu javah vygenerujeme hlaviˇckov´ y soubor jazyka C. Program javah je standardn´ı souˇca´st´ı JDK. Vygenerov´an´ı hlaviˇckov´eho souboru doc´ıl´ıme t´ımto pˇr´ıkazem (bod 4 na obr´azku 3.3): [vlach@macos:classes]$ javah -jni cz.vlach.berusky.FibLib Pˇri vykon´an´ı tohoto pˇr´ıkazu vygeneruje program javah v aktu´aln´ım adres´aˇri hlaviˇckov´ y soubor s n´azvem cz vlach berusky FibLib.h (bod 5 na obr´azku 3.3), takˇze naˇse adres´aˇrov´a struktura bude vypadat takto: classes cz vlach berusky FibLib.class cz_vlach_berusky_FibLib.h 27
Popis platforem Android a iOS
Popis architektury Androidu
Jm´eno hlaviˇckov´eho souboru a jeho vnitˇrn´ı struktura jsou odvozeny ze jm´ena tˇr´ıdy. V pˇr´ıpadˇe, ˇze tato tˇr´ıda je um´ıstˇena uvnitˇr bal´ıˇcku, jm´eno tohoto bal´ıˇcku je pˇrid´ano jak pˇred jm´eno tˇr´ıdy, tak pˇred jm´ena struktur uvnitˇr souboru. Podtrˇz´ıtka ( ) jsou pouˇzita jako oddˇelovaˇce. Implicitnˇe vytv´aˇr´ı program javah hlaviˇckov´ y soubor pro kaˇzdou tˇr´ıdu jmenovanou na pˇr´ıkazov´e ˇr´adce a vytv´aˇr´ı hlaviˇckov´e soubory v aktu´aln´ım adres´aˇri. V naˇsem pˇr´ıpadˇe je obsah hlaviˇckov´eho souboru cz vlach berusky FibLib.h n´asleduj´ıc´ı: /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class cz_vlach_berusky_FibLib */ #ifndef _Included_cz_vlach_berusky_FibLib #define _Included_cz_vlach_berusky_FibLib #ifdef __cplusplus extern "C" { #endif /* * Class: cz_vlach_berusky_FibLib * Method: fib * Signature: (J)J */ JNIEXPORT jlong JNICALL Java_cz_vlach_berusky_FibLib_fibN (JNIEnv *, jclass, jlong); #ifdef __cplusplus } #endif #endif Vedle includu hlaviˇckov´eho souboru jni.h je z hlediska dalˇs´ı implementace nejd˚ uleˇzitˇejˇs´ı signatura metody Java_cz_vlach_berusky_FibLib_fib, kterou je nutn´e implementovat. Prvn´ı parametr metody datov´eho typu JNIEnv je ukazatel na rozhran´ı JVM, jeˇz obsahuje vˇsechny funkce potˇrebn´e pro interakci s JVM a pro pr´aci s java objekty. Druh´ y parametr, kter´ y je datov´eho typu jclass, je objekt tˇr´ıdy obsahuj´ıc´ı naˇs´ı metodu. O objekt tˇr´ıdy se jedn´a 28
Popis platforem Android a iOS Nativn´ı datov´ y typ unsigned char signed char unsigned short short long long long int64 float double void
Popis architektury Androidu
Datov´ y typ v Javˇe Popis jboolean 8 bit˚ u, bez znam´enka jbyte 8 bit˚ u, se znam´enkem jchar 16 bit˚ u, bez znam´enka jshort 16 bit˚ u, se znam´enkem jint 32 bit˚ u, se znam´enkem jlong 64 bit˚ u, se znam´enkem jfloat 32 bit˚ u jdouble 64 bit˚ u
Tabulka 3.2: Pˇred´av´an´ı dat
z toho d˚ uvodu, ˇze v javˇe jsme metodu fibN(long n) oznaˇcili modifik´atorem static a tud´ıˇz se jedn´a o metodu tˇr´ıdy a nikoliv metodu instance. V pˇr´ıpadˇe, ˇze by metoda fibN(long n) nebyla statick´a tj. neobsahovala ve sv´e deklaraci modifik´ator static, vypadala by jej´ı signatura v hlaviˇckov´em souboru takto: JNIEXPORT jlong JNICALL Java_cz_vlach_berusky_FibLib_fib (JNIEnv *, jobject, jlong); Tedy druh´ ym parametrem by nebyl datov´ y typ jclass, ale jednalo by se o datov´ y typ jobject. Datov´ y typ jobject by byl tomto pˇr´ıpadˇe objekt instance tˇr´ıdy FibLib. Posledn´ım parametrem (v obou uveden´ ych pˇr´ıpadech) je parametr datov´eho typu jlong. Jedn´a se o JNI ekvivalent primitivn´ıho datov´eho typu long. V naˇsem pˇr´ıpadˇe se jedn´a o jedin´ y parametr n metody fibN(long n). JNI poskytuje ekvivalenty pro vˇsechny primitivn´ı datov´e typy javy, a proto lze s primitivn´ımi datov´ ymi typy pracovat v nativn´ım k´odu pˇr´ımo, viz tabulka 3.2. Objektov´e datov´e typy (tj. neprimitivn´ı datov´e typy) jsou pˇred´av´any jako ukazatele na vnitˇrn´ı datov´e struktury virtu´aln´ıho stroje. Uspoˇr´ad´an´ı tˇechto struktur, ale z˚ ust´av´a nativn´ımu programu skryto. Jedin´ y zp˚ usob, jak s tˇemito daty smysluplnˇe manipulovat, je pomoc´ı metod, kter´e rozhran´ı JNI poskytuje. Ty jsou pˇr´ıstupn´e pˇres ukazatel JNIEnv. V tomto momentˇe m´ame k dispozici hlaviˇckov´ y soubor se signaturou me29
Popis platforem Android a iOS
Popis architektury Androidu
tody v jazyce C, takˇze zb´ yv´a pouze tuto metodu v jazyce C implementovat (bod 6 na obr´azku 3.3). #include "cz_vlach_berusky_FibLib.h" jint fibN(jlong n) { if(n<=0) return 0; if(n==1) return 1; return fibN(n-1) + fibN(n-2); } JNIEXPORT jlong JNICALL Java_cz_vlach_berusky_FibLib_fibN (JNIEnv *env, jclass obj, jlong n) { return fibN(n); } Nyn´ı staˇc´ı tento zdrojov´ y soubor zkompilovat (bod 7 na obr´azku 3.3) a vytvoˇrit dynamickou knihovnu (bod 8 na obr´azku 3.3). S tˇemito kroky n´am pom˚ uˇze NDK, obsahuj´ıc´ı odpov´ıdaj´ıc´ı toolchain s potˇrebn´ ymi n´astroji. Z obr´azku 3.3 to zcela nevypl´ yv´a, ale kdyˇz z javy vol´ame nativn´ı k´od, tak tento k´od nevol´ame pˇr´ımo, ale prostˇrednictv´ım Java VM. Veˇsker´e vol´an´ı metod za n´as udˇel´a Java VM, my pouze v naˇsem programu ˇrekneme, ˇze chceme zavolat metodu s danou signaturou. Aby Java VM mohla zavolat poˇzadovanou funkci, potˇrebuje m´ıt k dispozici potˇrebnou dynamicky linkovanou knihovnu (tj. knihovnu s pˇr´ıponou .dll na Windows, .so na Unixu nebo .jnilib na Mac OS). Pro jej´ı nahr´an´ı do naˇseho java programu vyuˇzijeme programov´ y blok static { ... }, jeˇz je zavol´an na u ´pln´em poˇca´tku spouˇstˇen´ı naˇseho programu jeˇstˇe pˇred main metodou. Pro samotn´e nahr´an´ı dynamick´e knihovny m´ame k dispozici nˇekolik moˇznost´ı. Mezi nejjednoduˇsˇs´ı zp˚ usoby nahr´an´ı dynamick´e knihovny patˇr´ı vyuˇzit´ı metody System.loadLibrary(String libname). JVM se pokus´ı nal´ezt knihovnu jm´enem libname v adres´aˇr´ıch obsaˇzen´ ych v syst´emov´e promˇenn´e java. library.path. Tuto promˇennou je moˇzn´e nastavit na pˇr´ıkazov´em ˇr´adku pomoc´ı volby -D. V pˇr´ıpadˇe, ˇze danou knihovnu JVM nenalezne, vyhod´ı v´ yjimku java.lang.UnsatisfiedLinkError. Dalˇs´ı z moˇznost´ı, jak nahr´at dynamicky linkovanou knihovnu, je metoda System.load(String libname). Od metody System.loadLibrary(String 30
Popis platforem Android a iOS
Popis architektury Androidu
libname) se liˇs´ı v tom, ˇze nehled´a knihovnu pomoc´ı syst´emov´e promˇenn´e java.library.path, ale parametr libname mus´ı b´ yt v tomto pˇr´ıpadˇe absolutn´ı cestou k souboru v patˇriˇcn´em souborov´em syst´emu. V pˇr´ıpadˇe chybn´e cesty bude vyhozena stejn´a v´ yjimka jako v pˇredchoz´ım pˇr´ıpadˇe. Obˇe dvˇe moˇznosti jsou de facto ekvivalenty k vol´an´ı metod Runtime. getRuntime().loadLibrary(libname) respektive Runtime.getRuntime(). load(libname). Naˇse tˇr´ıda FibLib bude v kompletn´ı podobˇe vypadat n´asledovnˇe: package cz.vlach.berusky; public class FibLib { public native long fibN(long n); static { System.loadLibrary("cz_vlach_berusky_FibLib"); } } Nyn´ı m˚ uˇzeme pouˇz´ıt tˇr´ıdy FibLib a pomoc´ı jej´ı nativn´ı metody fibN a metody fibL uveden´e na stranˇe 26, napsat jednoduch´ y program kter´ y zmˇeˇr´ı dobu bˇehu tˇechto dvou metod pro zadan´e n a porovnat rozd´ıl ve v´ ykonu. T´ımto jsme pokryli ale jen jednu ˇc´ast probl´emu, konkr´etnˇe vol´an´ı nativn´ı funkce z java programu. Co kdyˇz ale potˇrebujeme j´ıt opaˇcn´ ym smˇerem? Co kdyˇz chceme z nativn´ı funkce zavolat nˇejakou metodu v javˇe? Pˇredstavme si napˇr´ıklad teplotn´ı senzor, co sn´ım´a venkovn´ı teplotu a pˇri jej´ı zmˇenˇe chceme poslat informaci o zmˇenˇe do java programu. Jak tohoto doc´ıl´ıme, se dozv´ıme v n´asleduj´ıc´ı sekci.
3.1.2
Vol´ an´ı Javy z nativn´ıho k´ odu
Vol´an´ı Javy z nativn´ıho k´odu doc´ıl´ıme opˇet pomoc´ı JNI (Java Native Interface) a jiˇz dˇr´ıve zm´ınˇen´eho datov´eho typu JNIEnv. Z hlediska implementace se jedn´a o ukazatel na strukturu obsahuj´ıc´ı vˇsechny JNI ukazatele na posky31
Popis platforem Android a iOS
Popis architektury Androidu
tovan´e funkce (tedy ukazatel na ukazatele), kter´ y je v hlaviˇckov´em souboru jni.h definov´an takto: typedef const struct JNINativeInterface *JNIEnv; Kaˇzd´a z funkc´ı obsaˇzen´a v JNINativeInterface je pˇr´ıstupn´a s pevn´ ym offsetem od poˇca´tku t´eto struktury. Celkov´ y poˇcet funkc´ı se pohybuje kolem ´ 230 ve verzi JNI 1.6 [23]. Uˇcel tˇechto funkc´ı lze rozdˇelit do nˇekolika kategori´ı (pro vˇetˇs´ı srozumitelnost ponech´av´ame bez pˇrekladu): • Version Information • Class Operations • Exceptions • Global and Local References • Weak Global References • Object Operations • Accessing Fields of Objects • Calling Instance Methods • Accessing Static Fields • Calling Static Methods • String Operations • Array Operations • Registering Native Methods • Monitor Operations • NIO Support • Reflection Support • Java VM Interface
32
Popis platforem Android a iOS
Popis architektury Androidu
Konkr´etn´ı n´azvy funkc´ı z uveden´ ych kategori´ı zde vypisovat nebudeme, ty nejzaj´ımavˇejˇs´ı pouˇzijeme v n´asleduj´ıc´ım pˇr´ıkladu. Kaˇzdop´adnˇe z n´azv˚ u kategori´ı funkc´ı je zˇrejm´e, ˇze z naˇseho nativn´ıho programu m˚ uˇzeme, pomoc´ı poskytovan´ ym funkc´ım, celkem pohodlnˇe prov´adˇet s Java VM libovoln´e operace. Sc´en´aˇr˚ u vol´an´ı javy z nativn´ıch jazyk˚ u C/C++ je nˇekolik, od moˇznosti inicializace JVM kompletnˇe z naˇseho nativn´ıho programu, aˇz po pouh´e zpˇetn´e vol´an´ı javy z nativn´ı funkce, kterou jsme z javy pˇredt´ım zavolali. Vˇsechny sc´en´aˇre zde rozeb´ırat nebudeme, pop´ıˇseme si pouze ten nejjednoduˇsˇs´ı sc´en´aˇr vol´an´ı javy z nativn´ıho k´odu a to je druh´ y uveden´ y sc´en´aˇr - zpˇetn´e vol´an´ı javy z nativn´ı funkce, kterou jsme pˇredt´ım z javy zavolali. Pro pˇr´ıklad viz n´asleduj´ıc´ı v´ ypis hlaviˇckov´eho souboru a jeho implementace. /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class Callbacks */ #ifndef _Included_Callbacks #define _Included_Callbacks #ifdef __cplusplus extern "C" { #endif /* * Class: Callbacks * Method: nativeMethod * Signature: (I)V */ JNIEXPORT void JNICALL Java_Callbacks_nativeMethod (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif #include <stdio.h> #include <jni.h> 33
Popis platforem Android a iOS
Popis architektury Androidu
#include "Callbacks.h" JNIEXPORT void JNICALL Java_Callbacks_nativeMethod(JNIEnv *env, jobject obj) { jclass cls = (*env)->GetObjectClass(env, obj); jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "(J)V"); if (mid == 0) return; printf("In C, about to enter Java\n"); (*env)->CallVoidMethod(env, obj, mid); printf("In C, back from Java\n"); } Pro vol´an´ı instanˇcn´ı metody mus´ıme udˇelat n´asleduj´ıc´ı: 1. V nativn´ım k´odu zavolat JNI funkci GetObjectClass, kter´a vrac´ı java tˇr´ıdu paremetru obj. 2. Dalˇs´ı volanou JNI funkc´ı v nativn´ım k´odu je GetMethodID, kter´a provede vyhled´an´ı zadan´e java metody v dan´e tˇr´ıdˇe. Vyhled´an´ı je zaloˇzeno jak na jm´enu metody, tak na jej´ı signatuˇre. Pokud metoda neexistuje, vr´at´ı GetMethodID hodnotu nula (0). 3. Jako posledn´ı krok zavol´ame v nativn´ım k´odu JNI funkci CallVoidMethod. Funkce CallVoidMethod zavol´a instanˇcn´ı metodu, kter´a m´a void jako n´avratovou hodnotu. Argumenty t´eto funkce budou rozhran´ı JVM env, objekt obj, ID metody mid a pˇr´ıpadnˇe dalˇs´ı argumenty, kter´e se stanou skuteˇcn´ ymi argumenty volan´e funkce.
3.1.3
Tvoˇ ren´ı n´ azv˚ u metod a signatur metod
JNI vyhled´av´a metody v z´avislosti na n´azvu metody a jej´ı signatuˇre. Toto zajiˇst’uje, ˇze ta sam´a nativn´ı metoda bude pracovat i pot´e co dojde k pˇrid´an´ı nov´ ych metod do odpov´ıdaj´ıc´ı java tˇr´ıdy. Jm´eno metody je jm´eno metody v jazyce java v UTF-8 form´atu. Konstruktor tˇr´ıdy specifikujeme uzavˇren´ım slova init do lomen´ ych z´avorek (coˇz vypad´a takto “
”). 34
Popis platforem Android a iOS
Popis architektury Androidu
Signatura typu Z B C S I J F D L plnˇe-kvalifikovan´a-tˇr´ıda [ typ (typy-argument˚ u)n´ avratov´ y-typ
Datov´ y typ jazyka Java boolean byte char short int long float double plnˇe-kvalifikovan´a-tˇr´ıda typ [] typ metody
Tabulka 3.3: Pˇred´av´an´ı dat
D˚ uleˇzit´ ym prvkem je sezn´amen´ı se s t´ım, ˇze JNI pouˇz´ıv´a signatury metod pro oznaˇcen´ı n´avratov´ ych typ˚ u java metod. Napˇr´ıklad signatura I(V) znaˇc´ı java metodu, kter´a m´a jeden parametr typu int a jej´ı n´avratov´ y typ je void. Obecn´a podoba signatury n´avratov´e hodnoty metod je n´asleduj´ıc´ı: (typy-argument˚ u)n´ avratov´ y-typ Tabulka ˇc´ıslo 3.3 shrnuje k´odov´an´ı pro signatury vˇsech typ˚ u jazyka java. Napˇr´ıklad metoda Prompt.getLine m´a n´asleduj´ıc´ı signaturu: (Ljava/lang/String;)Ljava/lang/String; Prompt.getLine obsahuje jeden parametr typu String a n´avratov´ y typ je t´eˇz typu String. Pole jsou indikov´any poˇca´teˇcn´ı hranatou z´avorkou ([), kterou n´asleduje typ element˚ u pole. Pro z´ısk´an´ı signatur metod pro pouˇzit´ı v JNI je doporuˇceno vyuˇz´ıvat programu javap jeˇz je souˇca´st´ı JDK.
35
Popis platforem Android a iOS
3.2
Popis architektury iOS
Popis architektury iOS
iOS je mobiln´ı operaˇcn´ı syst´em, kter´ y bˇeˇz´ı na zaˇr´ızen´ıch iPhone, iPod touch a iPad. Operaˇcn´ı syst´em ˇr´ıd´ı hardware zaˇr´ızen´ı a poskytuje prostˇredky potˇrebn´e pro implementaci nativn´ıch aplikac´ı. iOS Software Development Kit (SDK) obsahuje prostˇredky a n´astroje potˇrebn´e pro v´ yvoj, instalaci, testov´an´ı a bˇeh nativn´ıch aplikac´ı, kter´e jsou dostupn´e z domovsk´e obrazovky. Nativn´ı aplikace jsou vytv´aˇreny pomoc´ı syst´emov´ ych framework˚ u iOS a programovac´ıho jazyka Objective-C a bˇeˇz´ı pˇr´ımo v operaˇcn´ım syst´emu iOS. Vedle nativn´ıch aplikac´ı je moˇzn´e vytv´aˇret webov´e aplikace vyuˇz´ıvaj´ıc´ı kombinaci HTML, kask´adov´ ych styl˚ u (CSS) a JavaScriptu. Tyto aplikace na rozd´ıl od nativn´ıch nejsou nainstalov´any pˇr´ımo v iOS zaˇr´ızen´ı, ale vyuˇz´ıvaj´ı pro sv˚ uj bˇeh webov´eho prohl´ıˇzeˇce Safari a vyˇzaduj´ı pˇr´ıstup na internet.
3.2.1
Architektura iOS
Architekturu operaˇcn´ıho syst´emu iOS lze zjednoduˇsenˇe rozdˇelit do ˇctyˇr vrstev, viz obr´azek 3.4. Nyn´ı si kr´atce pˇribl´ıˇz´ıme roli kaˇzd´e z tˇechto vrstev.
Obr´azek 3.4: Architektura operaˇcn´ıho syst´emu iOS
36
Popis platforem Android a iOS
Popis architektury iOS
Core OS Layer Nejspodnˇejˇs´ı a nejz´akladnˇejˇs´ı vrstvu t´eto architektury tvoˇr´ı n´ızko u ´rovˇ nov´e sluˇzby, na kter´ ych je vˇetˇsina vyˇsˇs´ıch vrstev postavena. I kdyˇz se v aplikac´ıch sluˇzby z t´eto vrstvy nepouˇz´ıvaj´ı, je velice pravdˇepodobn´e, ˇze se vyuˇz´ıvaj´ı prostˇrednictv´ım framework˚ u z vyˇsˇs´ıch vrstev. Souˇca´st´ı t´eto vrstvy jsou frameworky poskytuj´ıc´ı pˇr´ıstup k extern´ım zaˇr´ızen´ım, pˇripojen´ ych pˇres datov´ y konektor ˇci bezdr´atovˇe pomoc´ı Bluetooth, d´ale poskytuje bezpeˇcnostn´ı sluˇzby definovan´e v RFC 2743 [1] a RFC 4401 [4] a v neposledn´ı ˇradˇe poskytuje abstrakci nad samotn´ ych j´adrem operaˇcn´ıho syst´emu. J´adro operaˇcn´ıho syst´emu iOS je zaloˇzeno na j´adru Mach [26], jeˇz poskytuje n´ızko u ´rovˇ nov´ y pˇr´ıstup k j´adru pomoc´ı UNIXov´ ych rozhran´ı. Tyto rozhran´ı poskytuj´ı podporu pro: • Vl´akna (POSIX threads) • S´ıtˇe (BSD sockets) • Pˇr´ıstup k souborov´emu syst´emu • Standardn´ı I/O • Spr´avu pamˇeti
Core Services Layer Tato vrstva poskytuje z´akladn´ı syst´emov´e sluˇzby, kter´e jsou vyuˇz´ıv´any vˇsemi aplikacemi. Mezi tyto z´akladn´ı sluˇzby patˇr´ı: iCloud Storage umoˇzn ˇuje aplikac´ım ukl´adat uˇzivatelsk´e dokumenty a data do centr´aln´ıho u ´loˇziˇstˇe a pˇristupovat k nim ze vˇsech iOS zaˇr´ızen´ı uˇzivatele. Automatic Reference Counting jedn´a se o funkci na kompilaˇcn´ı u ´rovni, jeˇz se star´a o uvolˇ nov´an´ı pamˇet’ov´ ych prostˇredk˚ u alokovan´ ych naˇs´ı aplikac´ı. 37
Popis platforem Android a iOS
Popis architektury iOS
In-App Purchase poskytuje moˇznost n´akupu obsahu ˇci sluˇzeb uvnitˇr naˇs´ı aplikace. SQLite dovoluje do naˇs´ı aplikace vloˇzit SQL datab´azi bez nutnosti bˇehu vzd´alen´eho datab´azov´eho serveru. XML Support obsahuje z´akladn´ı prvky pro manipulaci s XML dokumentem.
Media Layer Tato vrstva obsahuje technologie pro pr´aci s grafikou, videem a zvukem. Mezi z´akladn´ı knihovny poskytovan´e touto vrstvou patˇr´ı: Core Graphics t´eˇz zn´am´a pod n´azvem Quartz, je knihovna pro renderov´an´ı obr´azk˚ u a 2D vektorov´e grafiky. Core Animation poskytuje pokroˇcilou podporu pro tvorbu komplexn´ıch animac´ı a vizu´aln´ıch efekt˚ u. Core Image poskytuje silnou podporu pro manipulaci s videem a statick´ ymi obr´azky od jednoduch´ ych operac´ı, aˇz napˇr´ıklad po podporu detekce obliˇcej˚ u i jin´ ych tvar˚ u. OpenGL ES poskytuje podporu pro 2D a 3D renderov´an´ı pomoc´ı hardwarov´e akcelerace. Core Text poskytuje sofistikovan´ y engine pro sazbu a renderov´an´ı text˚ u. Vedle tˇechto sluˇzeb nab´ız´ı tato vrstva jeˇstˇe dalˇs´ı sluˇzby jako AirPlay, Assets knihovnu a dalˇs´ı. Jedn´a se vˇsak o sluˇzby pˇresahuj´ıc´ı rozsah t´eto pr´ace.
Cocoa Touch Layer Tato vrstva obsahuje kl´ıˇcov´e frameworky pro v´ yvoj iOS aplikac´ı jako napˇr´ıklad multitasking, dotykov´ y vstup, notifikace a dalˇs´ı vysoko u ´rovˇ nov´e syst´emov´e sluˇzby. Mezi sluˇzby poskytovan´e touto vrstvou patˇr´ı: 38
Popis platforem Android a iOS
Zhodnocen´ı platforem
Auto Layout pomoc´ı pravidel definujeme rozloˇzen´ı element˚ u uˇzivatelsk´eho rozhran´ı, jedn´a se o vylepˇsen´ı klasick´eho “springs and struts” modelu. Storyboards umoˇznuje navrhnout cel´e uˇzivatelsk´e rozhran´ı na jednom m´ıstˇe, takˇze je moˇzno vidˇet pohromadˇe vˇsechny pohledy a ˇradiˇce i s jejich vz´ajemnou interakc´ı. Multitasking pˇri zm´aˇcknut´ı Home tlaˇc´ıtka, nen´ı v popˇred´ı bˇeˇz´ıc´ı aplikace ukonˇcena, ale jej´ı bˇeh je pˇresunut do pozad´ı. Tato sluˇzba podporuje usp´an´ı takov´e aplikace pro prodlouˇzen´ı ˇzivotnosti baterie. Printing tato sluˇzbu umoˇznuje aplikac´ım tisk na bezdr´atov´e tisk´arnˇe. Push Notification poskytuje moˇznost, jak upozornit uˇzivatele na nov´e informace i pˇresto, ˇze naˇse aplikace nen´ı aktivn´ı. Gesture Recognizers jedn´a se o objekty, kter´e jsou propojeny s pohledem naˇs´ı aplikace a vyuˇz´ıv´any pro detekci r˚ uzn´ ych typ˚ u gest, jako taˇzen´ı prstem, poklep´an´ı prstem atd. Co se t´ yˇce bˇehu C/C++ k´odu na platformˇe iOS, tak zde je situace podstatnˇe jednoduˇsˇs´ı oproti platformˇe Android. Hlavn´ım programovac´ım jazykem platformy iOS je jazyk Objective-C [31], coˇz je rozˇs´ıˇren´ı jazyka C o syst´em zas´ıl´an´ı zpr´av z jazyka Smalltalk. D´ıky t´eto skuteˇcnosti je pouˇzit´ı k´odu napsan´eho v jazyce C v programu napsan´em v jazyce Objective-C zcela bezprobl´emov´e. Bylo by dokonce moˇzn´e se jazyku Objective-C vyhnout u ´plnˇe, ale vzhledem k tomu, ˇze vˇetˇsina v´ yˇse zm´ınˇen´ ych sluˇzeb syst´emu iOS je napsan´a v Objective-C, tak minim´alnˇe ˇc´ast k´odu aplikace slouˇz´ıc´ı k interakci s okol´ım je vhodn´e v tomto jazyce napsat.
3.3
Zhodnocen´ı platforem
V pˇredchoz´ıch dvou sekc´ıch jsme uk´azali, ˇze pˇredmˇet t´eto pr´ace, konverze poˇc´ıtaˇcov´e hry na platformy iOS a Android, tak aby co nejvˇetˇs´ı ˇca´st pr´ace byla spoleˇcn´a pro obˇe platformy, je splniteln´ y. Z popisu jednotliv´ ych platforem vypl´ yv´a, ˇze zejm´ena pro platformu Android takov´ y pˇrevod bude vyˇzadovat o nˇeco v´ıce pr´ace.
39
4 Realizaˇcn´ı ˇc´ast V t´eto ˇca´sti si pod´ıv´ame na to, co vˇsechno obn´aˇsela konverze hry Beruˇsky na mobiln´ı zaˇr´ızen´ı.
4.1
V´ yvojov´ e prostˇ red´ı pro Android
Pro v´ yvoj pro platformu Android potˇrebujeme tyto tˇri vˇeci V´ yvojov´ e IDE, Android SDK a Android NDK. V´ yvojov´ ych IDE pro Android je dnes cel´a ˇrada jako napˇr´ıklad Eclipse, IntelliJ IDEA ˇci NetBeans, takˇze si kaˇzd´ y m˚ uˇze vybrat podle sv´ ych preferenc´ı. Ofici´alnˇe podporovan´ ym IDE je vˇsak pouze Eclipse IDE a tak si uk´aˇzeme, jak pr´avˇe toto IDE nakonfigurovat. Jelikoˇz zdrojov´ y k´od Beruˇsek je naps´an v jazyce C++ a tuto z´akladnu k´odu chceme v maxim´aln´ı moˇzn´e m´ıˇre vyuˇz´ıt, budeme potˇrebovat Eclipse s podporou jazyka C/C++. St´ahneme si tedy tyto n´astroje: Eclipse IDE for C/C++ Developers ze str´anek http://www.eclipse. org Android SDK ze str´anek http://developer.android.com/sdk Android NDK ze str´anek http://developer.android.com/tools/sdk/ ndk Po rozbalen´ı archivu s Eclipse IDE a jeho spuˇstˇen´ı je nutn´e do t´eto Eclipse instance nahr´at potˇrebn´e pluginy podporuj´ıc´ı v´ yvoj na platformu Android, jeˇz se standardnˇe v Eclipse IDE nenach´azej´ı. Jak vypad´a instalace tˇechto plugin˚ u viz obr´azek 4.1, kde se nach´az´ı i Eclipse update site s tˇemito pluginy, v´ıce informac´ı viz [35]. Dalˇs´ım krokem je rozbalen´ı SDK a NDK do adres´aˇr˚ u dle vlastn´ı volby a nakonfigurov´an´ı Eclipse IDE kde tyto adres´aˇre nalezne. Odpov´ıdaj´ıc´ı volba pro SDK se nach´az´ı zde: Preferences -> Android -> SDK Location, pro
40
Realizaˇcn´ı ˇc´ast
V´yvojov´e prostˇred´ı pro Android
Obr´azek 4.1: Instalace podpory Androidu do prostˇred´ı Eclipse
NDK se nach´az´ı zde: Preferences -> Android -> Native Development -> NDK Location. 41
Realizaˇcn´ı ˇc´ast
V´yvojov´e prostˇred´ı pro Android
Obr´azek 4.2: Pˇrid´an´ı podpory nativn´ıho k´odu do Android projektu
Nyn´ı jiˇz m˚ uˇzeme v Eclipse IDE zaloˇzit nov´ y projekt File -> New -> Project.. -> Android -> Android Application Project. Po projit´ı pr˚ uvodce zaloˇzen´ım nov´eho projektu m´ame v naˇsem pracovn´ım adres´aˇri zaloˇzen nov´ y Android projekt. Tento projekt zat´ım nem´a podporu nativn´ıho k´odu. Podporu NDK do vytvoˇren´eho projektu pˇrid´ame kliknut´ım na projekt prav´ ym tlaˇc´ıtkem myˇs´ı a vybr´an´ım volby Android Tools -> Add Native Support.. viz obr´azek 4.2. Nyn´ı je n´aˇs projekt pˇripraven ke spuˇstˇen´ı nativn´ıho k´odu. Hlavn´ım rozd´ılem mezi projektem s podporou nativn´ıho k´odu a projektem bez t´eto podpory je v pˇr´ıtomnosti adres´aˇre jni v adres´aˇrov´e struktuˇre projektu s nativn´ı podporou. Obsahem adres´aˇre jni budou naˇse zdrojov´e soubory v jazyce C/C++ a build soubor s n´azvem Android.mk. V tomto build souboru vyp´ıˇseme C/C++ soubory s naˇs´ım nativn´ım k´odem a Eclipse IDE se automaticky postar´a o jejich zkompilov´an´ı a sestaven´ı. Jelikoˇz ve sloˇzce jni budou kromˇe zdrojov´ ych k´od˚ u hry Beruˇsky t´eˇz zdrojov´e k´ody samotn´e knihovny SDL2, je nutn´e um´ıstit kaˇzd´ y z nich do vlastn´ıho podadres´aˇre. Um´ıst´ıme tedy zdrojov´e k´ody hry Beruˇsky do sloˇzky jni/src. Knihovnu SDL2 nahrajeme na adres´aˇre jni/SDL (knihovna SDL2 jiˇz obsahuje odpov´ıdaj´ıc´ı Android.mk soubor pro zkompilov´an´ı a sestaven´ı). Nyn´ı je projekt t´emˇeˇr pˇripraven pro spuˇstˇen´ı hry Beruˇsky na zaˇr´ızen´ı Android a n´asledn´e u ´pravy pro potˇreby tohoto mobiln´ıho zaˇr´ızen´ı. Jedin´e co sch´az´ı udˇelat je upravit k´od z SDL 1.2 knihovny na SDL 2.0 knihovnu. Tyto 42
Realizaˇcn´ı ˇc´ast
V´yvojov´e prostˇred´ı pro iOS
u ´pravy jsou pops´any v sekci 4.4.1.
4.2
V´ yvojov´ e prostˇ red´ı pro iOS
Pˇri v´ yvoji pro platformu iOS m´ame ˇzivot jednoduˇsˇs´ı v tom, ˇze nemus´ıme pˇrem´ yˇslet nad t´ım jak´e IDE zvolit, protoˇze m˚ uˇzeme zvolit jedin´e IDE a t´ım je v´ yvojov´ y n´astroj Xcode od spoleˇcnosti Apple. Toto IDE je k dispozici pouze na poˇc´ıtaˇc´ıch Apple Mac, je tedy nutn´e si poˇc´ıtaˇc t´eto ˇrady poˇr´ıdit. Instalaci n´astroje Xcode, je nutn´e prov´est skrze Apple Store a je zcela bezprobl´emov´a. V´ yhoda (ˇci nev´ yhoda) v´ yvoje v Xcode je to, ˇze toto IDE n´as nenut´ı k jak´ekoliv pˇredepsan´e struktuˇre projektu, jak´ekoliv ˇclenˇen´ı soubor˚ u projektu je plnˇe v naˇs´ı reˇzii. T´eto vlastnosti s u ´spˇechem vyuˇzijeme v sekci 4.3 kde se budeme zab´ yvat probl´emem sd´ılen´ı zdrojov´eho k´odu pro obˇe dvˇe platformy. D´ıky volnosti co n´am Xcode ve struktuˇre projektu nab´ız´ı, ale t´eˇz pˇrich´az´ı ot´azka jakou strukturu projektu zvolit. Naˇstˇest´ı knihovna SDL2.0 nab´ız´ı template projektu s podporou knihovny SDL2.0, takˇze tohoto templatu vyuˇzijeme a odpadne n´am tak nutnost vym´ yˇslen´ı vlastn´ı struktury.
4.3
Struktura projektu pro dvˇ e platformy/dvˇ e IDE
Standardn´ı souˇc´ast´ı kaˇzd´eho vˇetˇs´ıho projektu mus´ı b´ yt SCM syst´em. Nejenom, ˇze takov´ y syst´em ˇreˇs´ı spolupr´aci v´ıce uˇzivatel˚ u na jednom projektu, ale d´ıky verzov´an´ı zdrojov´ ych soubor˚ u, se lze kdykoliv vr´atit k jak´ekoliv verzi zdrojov´eho k´odu. Tahle vlastnost je obzvl´aˇstˇe nedoceniteln´a v pˇr´ıpadech kdy je potˇreba udˇelat rozs´ahlou zmˇenu ve zdrojov´ ych k´odech (napˇr. refaktoring), kter´a m˚ uˇze skonˇcit ne´ uspˇechem a je potˇreba vr´atit se k p˚ uvodn´ı verzi. Bez syst´emu SCM, by toto byl tˇeˇzko dosaˇziteln´ yu ´kol. Zejm´ena z tohoto d˚ uvodu zavedeme SCM i pro u ´ˇcely t´eto pr´ace. Nejvˇetˇs´ı popularitˇe se v dneˇsn´ı dobˇe d´ıky sv´ ym vlastnostem tˇeˇs´ı SCM syst´em Git [32]. Vyuˇzijeme ho proto i v naˇsem projektu.
43
Realizaˇcn´ı ˇc´ast
Struktura projektu pro dvˇe platformy/dvˇe IDE
Probl´emem v naˇsem u ´kolu je jak strukturovat zdrojov´ y k´od tak, aby mohl b´ yt tento zdrojov´ y k´od vyuˇz´ıv´an dvˇema r˚ uzn´ ymi IDE prostˇred´ımi pro dvˇe r˚ uzn´e mobiln´ı platformy, jmenovitˇe prostˇred´ı Eclipse pro platformu Android a prostˇred´ı Xcode pro platformu iOS. Pro u ´spˇeˇsn´e vyˇreˇsen´ı naˇseho probl´emu mus´ıme uˇcinit detailn´ı anal´ yzu struktur projekt˚ u pro jednotliv´a IDE a moˇznost´ı jejich pˇrizp˚ usoben´ı naˇsim potˇreb´am.
4.3.1
Struktura Android projektu
Vytvoˇr´ıme-li ve v´ yvojov´em prostˇred´ı Eclipse nov´ y projekt pro Android, zjist´ıme pohledem na souborov´ y syst´em, ˇze projekt se skl´ad´a z n´asleduj´ıc´ıch soubor˚ u a adres´aˇr˚ u: /project-root /assets /jni /libs /res /src AndroidManifest.xml project.properties Kr´atce si pop´ıˇseme u ´ˇcel kaˇzd´eho z tˇechto adres´aˇr˚ u: project-root koˇrenov´ y adres´aˇr cel´eho projekt˚ u (n´azev tohoto adres´aˇre m˚ uˇze b´ yt libovoln´ y), assets adres´aˇr obsahuj´ıc´ı obr´azky, zvuky atd., jni adres´aˇr obsahuj´ıc´ı vˇsechen nativn´ı k´od, libs adres´aˇr obsahuj´ıc´ı knihovny nutn´e pro bˇeh projektu, res adres´aˇr obsahuj´ıc´ı obr´azky, zvuky atd., src adres´aˇr obsahuj´ıc´ı java zdrojov´e k´ody.
44
Realizaˇcn´ı ˇc´ast
Portace
Rozd´ıl mezi adres´aˇri assets a res je v tom, ˇze pro prostˇredky z adres´aˇre res je k dispozici podpora pro v´ıce jazykov´ ych mutac´ı, rozliˇsn´e velikosti obrazovek, orientaci obrazovek atd. Pro prostˇredky ze sloˇzky assets nic takov´eho k dispozici nen´ı. Sloˇzka assets se hod´ı napˇr. pro ukl´ad´an´ı vygenerovan´ ych obr´azk˚ u za bˇehu aplikace atd. Kombinace dvou programovac´ıch jazyk˚ u Java a C++ a toho, ˇze mus´ı spoleˇcnˇe kooperovat a komunikovat, pˇrin´aˇs´ı do struktury projektu pro Android komplikace a mnoho vˇec´ı funguje na z´akladˇe konvenc´ı neˇzli na z´akladˇe konfigurace. Z tohoto d˚ uvodu je zmˇena struktury projektu pro Android t´emˇeˇr nemoˇzn´a. Zkus´ıme tedy vyzkoumat, co by znamenalo pouˇz´ıt strukturu projektu pro Android pro projekt iOS.
4.3.2
Struktura iOS projektu
Projekt v Xcode m´a sice danou strukturu, ale tato struktura je pouze relativn´ı, tj. neodpov´ıd´a struktuˇre adres´aˇr˚ u a soubor˚ u na souborov´em syst´emu. Vˇse je tedy jen ot´azkou konfigurace. Knihovna SDL 2.0 ve sv´em zdrojov´em k´odu nav´ıc obsahuje template projektu vyuˇz´ıvaj´ıc´ıho SDL, kde je jiˇz vˇse podstatn´e pˇredkonfigurovan´e. Pouˇzit´ım tohoto templatu a drobn´ ymi u ´pravami jsme schopn´ y projekt pro iOS nakonfigurovat nad adres´aˇrovou strukturou diktovanou poˇzadavky projektu pro syst´em Android.
4.4
Portace
V n´asleduj´ıc´ıch kapitol´ach si podrobnˇe pod´ıv´ame na jednotliv´e oblasti, ve kter´ ych byli nutn´e ˇreˇsit probl´emy pˇri portaci hry Beruˇsky na mobiln´ı zaˇr´ızen´ı. Nejprve si pop´ıˇseme probl´emy spojen´e s novou knihovnou SDL 2.0 a jejich ˇreˇsen´ı, pot´e se pod´ıv´ame na probl´em zmˇeny z velk´e obrazovky na mal´ y displej a jako posledn´ı si pop´ıˇseme zmˇeny nutn´e v ovl´ad´an´ı hry.
45
Realizaˇcn´ı ˇc´ast
4.4.1
Portace
Zmˇ eny SDL 2.0 oproti SDL 1.2
Knihovna SDL 2.0 doznala od verze SDL 1.2 znaˇcn´ ych zmˇen. Zde si postupnˇe projdeme z´akladn´ı prvky, jak knihovna SDL 2.0 pracuje a pov´ıme si, jak´ y byl p˚ uvodn´ı k´od hry Beruˇsky. Prvn´ı krok pro pouˇzit´ı knihovny SDL 2.0 je jej´ı inicializace. Ta se prov´ad´ı funkc´ı SDL_Init, kter´a m´a jeden parametr, kter´ ym lze ˇr´ıci, jak´ y subsyst´em SDL chceme v naˇs´ı aplikaci vyuˇz´ıvat. Subsyst´em m˚ uˇze b´ yt napˇr´ıklad video, audio, joystick apod. V naˇsem pˇr´ıpadˇe provedeme pouze inicializaci subsyst´emu video n´asleduj´ıc´ım pˇr´ıkazem: SDL_Init(SDL_INIT_VIDEO); V oblasti inicializace subsyst´em˚ u ˇza´dn´a zmˇena v SDL 2.0 oproti SDL 1.2 nenastala, a proto ani k´od hry Beruˇsky neproˇsel ˇza´dnou zmˇenou. Dalˇs´ı krokem pˇri pouˇzit´ı knihovny SDL je vytvoˇren´ı okna, do kter´eho budeme kreslit v´ ysledn´ y obraz. To se provede funkc´ı SDL_CreateWindow, kter´a obsahuje sedm parametr˚ u. Zde je jej´ı signatura: SDL_Window * SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags) Z n´azv˚ u parametr˚ u je vidˇet jejich v´ yznam. Potenci´al tˇechto parametr˚ u lze plnˇe vyuˇz´ıt pouze v pˇr´ıpadˇe klasick´ ych obrazovek. V pˇr´ıpadˇe mobiln´ıch zaˇr´ızen´ı zodpovˇednost za podobu a velikost okna pˇreb´ır´a operaˇcn´ı syst´em. Ten dovoluje vytvoˇrit pouze okna pˇres celou obrazovku, pˇr´ıpadnˇe okno obsahuj´ıc´ı horn´ı liˇstu. V naˇsem pˇr´ıpadˇe okno vytvoˇr´ıme t´ımto pˇr´ıkazem: int flags = SDL_WINDOW_BORDERLESS SDL_Window* window = SDL_CreateWindow("Berusky", 0, 0, 0, 0, flags); Poˇc´ınaje touto funkc´ı zaˇc´ın´a jedna z nejv´ yraznˇejˇs´ıch zmˇen v SDL 2.0 oproti SDL 1.2. Touto zmˇenou je rozdˇelen´ı softwarov´eho renderov´an´ı a hardwarov´eho (akcelerovan´eho) renderov´an´ı. Toto renderov´an´ı prob´ıhalo v SDL 1.2 pomoc´ı datov´e struktury SDL_Surface, kde hardwarov´e renderov´an´ı bylo 46
Realizaˇcn´ı ˇc´ast
Portace
zjistiteln´e pomoc´ı zapnut´eho pˇr´ıznaku SDL_HWSURFACE. Ve verzi SDL 2.0 doˇslo k rozdˇelen´ı softwarov´eho a hardwarov´eho renderov´an´ı takˇze nyn´ı m´ame k dispozici tyto dvˇe struktury: SDL_Surface struktura pouˇzita pro softwarov´e renderov´an´ı, nen´ı nikdy akcelerovan´a, SDL_Texture struktura pouˇzita pro hardwarov´e akcelerov´an´ı, jej´ı pixely nejsou pˇr´ımo pˇr´ıstupn´e. S t´ımto rozdˇelen´ım pˇriˇsla i zmˇena zp˚ usobu jak se vytv´aˇrej´ı tyto struktury pro renderov´an´ı. Druhou zmˇenou v SDL 2.0 oproti SDL 1.2, jeˇz je s problematikou vykreslov´an´ı u ´zce spjata, je moˇznost vytv´aˇren´ı v´ıce oken, coˇz v SDL 1.2 moˇzn´e nebylo. Kaˇzd´e z vytvoˇren´ ych oken m´a asociovan´ y renderer, coˇz je struktura SDL_Renderer. Kaˇzd´ y renderer je spravov´an grafick´ ym ovladaˇcem. Tento renderer nahrazuje objekt SDL_Surface z SDL 1.2. Obsahuje nˇekolik metod pro kreslen´ı bod˚ u, ˇcar, obd´eln´ık˚ u, textur atd. Pomoc´ı tohoto rendereru prob´ıh´a veˇsker´e kreslen´ı. Vr´at´ıme se k naˇs´ı funkci SDL_CreateWindow pomoc´ı kter´e vytv´aˇr´ıme okno pro hru Beruˇsky. V naˇsem pˇr´ıpadˇe jsme v´ yˇsku w, ˇs´ıˇrku h, pozici x, pozici y nastavili na 0, protoˇze jak jsme si jiˇz ˇrekli, v pˇr´ıpadˇe mobiln´ıch zaˇr´ızen´ı je podoba vytvoˇren´eho okna plnˇe v reˇzii operaˇcn´ıho syst´emu. Pouze pro syst´em iOS je potˇreba explicitnˇe ˇr´ıci pˇr´ıznakem SDL_WINDOW_BORDERLESS, ˇze chceme vytvoˇrit okno bez horn´ı liˇsty. Pro to abychom mohli v oknu zobrazit nˇejak´ y obraz, potˇrebujeme, jak jsme si popsali, vytvoˇrit pro toto okno renderer a s oknem ho asociovat. To provedeme pomoc´ı funkce SDL_CreateRenderer. Zde je jej´ı signatura: SDL_Renderer * SDL_CreateRenderer(SDL_Window * window, int index, Uint32 flags) Prvn´ım argumentem je okno, pro kter´e renderer vytv´aˇr´ıme, druh´ ym argumentem je index ovladaˇce pro renderov´an´ı, kter´ y chceme inicializovat nebo -1 pokud chceme inicializovat prvn´ı ovladaˇc podporuj´ıc´ı poˇzadovan´e pˇr´ıznaky. Tˇret´ım parametrem jsou pˇr´ıznaky renderovac´ıho kontextu. 47
Realizaˇcn´ı ˇc´ast
Portace
V naˇsem pˇr´ıpadˇe vypad´a konkr´etn´ı vol´an´ı n´asledovnˇe: SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, 0); Ve verzi knihovny SDL 1.2 byla pr´ace tˇechto dvou funkc´ı provedena funkc´ı s n´azvem SDL_SetVideoMode. Odpov´ıdaj´ıc´ı k´od ze hry Beruˇsky vypadal n´asledovnˇe: SDL_Surface *p_hwscreen = SDL_SetVideoMode(width, height, bpp, flag); Tento pˇr´ıkaz vytvoˇril okno, pomoc´ı nˇehoˇz prob´ıhalo renderov´an´ı v´ ysledn´eho obrazu. Toto vol´an´ı a datovou strukturu SDL_Surface bylo potˇreba v k´odu hry Beruˇsky nahradit odpov´ıdaj´ıc´ım rendererem SDL_Renderer a prov´est odpov´ıdaj´ıc´ı u ´pravy ve struktuˇre k´odu. Dalˇs´ım krokem pˇri z´ısk´an´ı fin´aln´ıho obrazu je nutnost naˇc´ıst ze soubor˚ u hern´ı textury. Hra Beruˇsky m´a hern´ı textury v datov´em form´atu bmp a toto je jedin´ y typ obrazov´ ych soubor˚ u, kter´ y knihovna SDL dok´aˇze naˇc´ıst (pro naˇc´ıt´an´ı jin´ ych typ˚ u soubor˚ u by bylo potˇreba pouˇz´ıt knihovnu SDL image). Obˇe verze SDL obsahuj´ı makro SDL_LoadBMP jeˇz umoˇznuje naˇc´ıst obr´azek ze souboru ve form´atu bmp. Jeho signatura spolu se signaturami funkc´ı, kter´e toto makro vyuˇz´ıv´a, vypadaj´ı n´asledovnˇe: #define SDL_LoadBMP(file) SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1) SDL_Surface * SDL_LoadBMP_RW(SDL_RWops * src, int freesrc) SDL_RWops * SDL_RWFromFile(const char *file, const char *mode) Z uveden´ ych signatur a n´azv˚ u funkc´ı je celkem zˇrejm´e co makro SDL_LoadBMP dˇel´a. Pomoc´ı makra SDL_LoadBMP hra Beruˇsky nahraje obr´azek ze souboru zadan´eho parametrem file do datov´e struktury SDL_Surface. Pokud se nahr´an´ı obr´azku ze souboru povede, uloˇz´ı se do datov´e struktury SDL_Texture. Toto nahr´an´ı se provede pomoc´ı funkce SDL_CreateTextureFromSurface, jej´ıˇz signatura vypad´a n´asledovnˇe: 48
Realizaˇcn´ı ˇc´ast
Portace
SDL_Texture * SDL_CreateTextureFromSurface( SDL_Renderer * renderer, SDL_Surface * surface) Prvn´ım parametrem je renderer, kter´ y jsme v pˇredchoz´ım kroku asociovali s naˇs´ım oknem pro zobrazen´ı v´ ysledn´eho obrazu. Druh´ ym parametrem je datov´a struktura obr´azku naˇcten´a ze souboru pomoc´ı makra SDL_LoadBMP. V n´asleduj´ıc´ım odstavci si uk´aˇzeme, jak je naprogramov´an tento proces ve hˇre Beruˇsky. // Glob´ aln´ ı promˇ enn´ a SDL_Renderer *renderer; //----------------------SDL_Texture *p_text; void surface::load(char *p_file) { SDL_Surface *p_tmp = SDL_LoadBMP(file); if(p_tmp) { p_text = SDL_CreateTextureFromSurface(renderer, p_tmp); assert(p_text); SDL_FreeSurface(p_tmp); } } Nyn´ı si uk´aˇzeme, jak byla tato ˇc´ast naprogramov´ana ve verzi pro desktopov´e operaˇcn´ı syst´emy za pomoc´ı verze SDL 1.2: SDL_Surface *p_surf; void surface::load(char *p_file) { SDL_Surface *p_tmp = SDL_LoadBMP(file); if(p_tmp) { p_surf = SDL_DisplayFormat(p_tmp); 49
Realizaˇcn´ı ˇc´ast
Portace
assert(p_surf); SDL_FreeSurface(p_tmp); } } V p˚ uvodn´ı verzi hry Beruˇsky jsme pomoc´ı makra SDL_LoadBMP nahr´ali obr´azek ze souboru a pot´e jsme pomoc´ı funkce SDL_DisplayFormat zkop´ırovali tento obr´azek do nov´e struktury SDL_Surface v pixelov´em form´atu a barv´ach grafick´eho video framebufferu. Jak je vidˇet v porovn´an´ı pˇredeˇsl´ ych dvou uk´azek k´odu, co se t´ yˇce struktury zdrojov´eho k´odu, tak nov´a verze se od p˚ uvodn´ı verze liˇs´ı zejm´ena pouˇzit´ım rendereru. Z toho d˚ uvodu, aby mohl b´ yt tento renderer pˇred´an do funkce SDL_CreateTextureFromSurface, musel b´ yt zpˇr´ıstupnˇen jako glob´aln´ı promˇenn´a a zdrojov´ y k´od patˇriˇcnˇe upraven.
Pouˇ z´ıv´ an´ı v´ yplnˇ e Dalˇs´ı nutnou zmˇenou v renderov´an´ı v´ ysledn´eho obrazu byla nahrazen´ı funkce SDL_FillRect pro vyplnˇen´ı zadan´e obd´eln´ıkov´e plochy jednolitou barvou, funkc´ı SDL_RenderFillRect. Signatury tˇechto funkc´ı vypadaj´ı n´asledovnˇe: int SDL_FillRect(SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color); int SDL_RenderFillRect(SDL_Renderer * renderer, const SDL_Rect * rect) Ihned na prvn´ı pohled je vidˇet rozd´ıl mezi jednotliv´ ymi verzemi knihovny SDL. V´ yznam parametru dstrect v p˚ uvodn´ı funkci SDL_FillRect je stejn´ y jako v´ yznam parametru rect v nov´e funkci SDL_RenderFillRect. Jedn´a se o urˇcen´ı plochy, kter´a se m´a vyplnit barvou. V pˇr´ıpadˇe funkce SDL_FillRect je barva v´ yplnˇe pˇred´ana funkci parametrem color. V knihovnˇe SDL 2.0 je nutn´e pˇred vol´an´ım funkce SDL_RenderFillRect nastavit poˇzadovanou barvu v´ yplnˇe zavol´an´ım metody SDL_SetRenderDrawColor, kter´a pro zadan´ y renderer nastav´ı barvu v´ yplnˇe.
50
Realizaˇcn´ı ˇc´ast
Portace
Prom´ıt´ an´ı obr´ azk˚ u - blitting Posledn´ı v´ yraznou zmˇenou v renderov´an´ı v´ ysledn´eho obrazu byla nutnost nahrazen´ı funkce SDL_BlitSurface z SDL 1.2 funkc´ı SDL_RenderCopy z SDL 2.0. Signatury obou funkc´ı jsou n´asleduj´ıc´ı: int SDL_BlitSurface( SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect); int SDL_RenderCopy(SDL_Renderer* SDL_Texture* const SDL_Rect* const SDL_Rect*
renderer, texture, srcrect, dstrect)
´ celem tˇechto dvou funkc´ı je prom´ıtnut´ı ˇc´asti zdrojov´eho obr´azku na c´ıUˇ lov´ y obr´azek. V pˇr´ıpadˇe funkce SDL_BlitSurface je zdrojem parametr src a c´ılem je parametr dst. V pˇr´ıpadˇe funkce SDL_RenderCopy je zdrojem parametr texture a c´ılem parametr renderer. Parametr srcrect je v pˇr´ıpadˇe obou dvou funkc´ı urˇcen´ı ˇca´sti obrazu co se bude prom´ıtat a parametr dstrect je urˇcen´ı m´ısta kam se zdrojov´ y obr´azek prom´ıtne. I v tomto pˇr´ıpadˇe jsou zmˇeny ve zdrojov´em k´odu hry Beruˇsky vynuceny zmˇenou vnitˇrn´ı architektury knihovny SDL 2.0 oproti knihovnˇe SDL 1.2.
4.4.2
Uzp˚ usoben´ı dotykov´ emu ovl´ ad´ an´ı
Jedn´ım z nejsloˇzitˇejˇs´ıch u ´kol˚ u je pˇredˇelat ovl´ad´an´ı hry. P˚ uvodn´ı verze hry Beruˇsky byla ovl´ad´ana myˇs´ı a kl´avesnic´ı. Hry na mobiln´ı zaˇr´ızen´ı s sebou pˇrinesli nov´ y zp˚ usob ovl´ad´an´ı, kde je veˇsker´a interakce mezi hrou a hr´aˇcem doc´ılena pomoc´ı dotykov´eho displeje a gest, kde mezi nejv´ıce pouˇz´ıvan´e gesta patˇr´ı klepnut´ı prstem na displej a taˇzen´ı prstem po displeji. Dalˇs´ım velmi ˇcast´ ym gestem je pˇribl´ıˇzen´ı/odd´alen´ı dvou prst˚ u, pouˇz´ıvan´e pro pˇribl´ıˇzen´ı/odd´alen´ı hern´ı plochy. Ovl´ad´an´ı p˚ uvodn´ı hry Beruˇsky patˇr´ı naˇstˇest´ı k velice jednoduch´ ym, kde se veˇsker´e ovl´ad´an´ı prov´ad´ı pouh´ ymi pˇeti kl´avesami (kl´avesy pro funkce N´apovˇeda, Uloˇzen´ı/Nahr´an´ı hry nepoˇc´ıt´ame). Kl´avesy ˇsipka nahoru/dol˚ u/doleva/ 51
Realizaˇcn´ı ˇc´ast
Portace
doprava slouˇz´ı k pohybu beruˇsky po hern´ım levelu a kl´avesa TAB slouˇz´ı k pˇrep´ın´an´ı mezi beruˇskami. Jako indik´ator jakou m´a hr´aˇc pr´avˇe vybranou beruˇsku, slouˇz´ı liˇsta v horn´ı ˇca´sti obrazovky. Na t´eto liˇstˇe jsou obr´azky jednotliv´ ych beruˇsek, kde se jednotliv´e beruˇska od sebe odliˇsuj´ı barvou, viz obr´azek 4.3 zn´azorˇ nuj´ıc´ı PC verzi hry Beruˇsky.
Obr´azek 4.3: Uk´azka PC verze hry Beruˇsky
Aˇckoliv horn´ı liˇsta je v pˇr´ıpadˇe PC verze hry Beruˇsky neaktivn´ı (pˇrep´ın´an´ı beruˇsek prob´ıh´a pomoc´ı kl´avesy TAB), jsou obr´azky beruˇsek na n´ı zobrazen´e ide´aln´ım ovl´adac´ım prvek pro mobiln´ı verzi hry. Vyuˇzili jsme t´eto skuteˇcnosti a v mobiln´ı verzi hry Beruˇsky implementovali pˇrep´ın´an´ı beruˇsek pomoc´ı klepnut´ı na jejich obr´azky v horn´ı liˇstˇe obrazovky. Po vyˇreˇsen´ı pˇrep´ın´an´ı beruˇsek zb´ yv´a vyˇreˇsit probl´em ovl´ad´an´ı pohybu beruˇsek. Jedn´ım moˇzn´ ym ˇreˇsen´ım by bylo vyuˇzit´ı gyroskopick´eho senzoru a ovl´adat beruˇsky podle orientace zaˇr´ızen´ı. Nev´ yhodou tohoto typu ovl´a52
Realizaˇcn´ı ˇc´ast
Portace
Obr´azek 4.4: Uk´azka mobiln´ı verze hry Beruˇsky
d´an´ı je, ˇze vyˇzaduje od hr´aˇce m´ıt mobiln´ı zaˇr´ızen´ı v urˇcit´e poloze a t´ım ho do znaˇcn´e m´ıry omezuje. Vyuˇzijeme tedy klasick´e ovl´ad´an´ı, kde vyhrazen´e oblasti obrazovky mobiln´ıho zaˇr´ızen´ı slouˇz´ı jako n´ahrada kl´aves ˇsipka nahoru/dol˚ u/doleva/doprava. Ot´azkou z˚ ust´av´a jak tyto oblasti (kl´avesy) na obrazovce rozm´ıstit. Jednou moˇznost´ı je z˚ ustat u klasick´eho rozloˇzen´ı kl´aves, kdy kl´avesa nahoru a kl´avesa dol˚ u jsou mezi kl´avesami doleva a doprava. Toto rozloˇzen´ı dovoluje ovl´ad´an´ı pohybu beruˇsky pouze jednou rukou, ale na druhou stranu zde hroz´ı pomˇernˇe velik´ y poˇcet pˇrehmat˚ u. Druhou moˇznost´ı je rozdˇelit ovl´ad´an´ı na dvˇe ˇc´asti a seskupit kl´avesy nahoru a dol˚ u na jednu stranu obrazovky a na druhou stranu obrazovky um´ıstit kl´avesy doleva a doprava. Tento styl ovl´ad´an´ı neumoˇznuje pohodln´e ovl´ad´an´ı jednou rukou, ale na druhou stranu je toto ovl´ad´an´ı velice pˇresn´e a nehroz´ı pˇri nˇem t´emˇeˇr ˇza´dn´a moˇznost pˇrehmatu. Nav´ıc toto ovl´ad´an´ı je velice bl´ızk´e ovl´ad´an´ı z klasick´ ych gamepad˚ u hern´ıch konzol´ı, kde vˇetˇsina ovl´ad´an´ı prob´ıh´a pomoc´ı palc˚ u na obou ruk´ach. Z tohoto d˚ uvodu jsme se rozhodli pr´avˇe tento typ ovl´ad´an´ı implementovat i do mobiln´ı verze hry Beruˇsky. Pro pohyb beruˇsky dol˚ u je vyhrazena lev´a spodn´ı oblast obrazovky, pro 53
Realizaˇcn´ı ˇc´ast
Portace
pohyb nahoru je vyhrazena oblast tˇesnˇe nad oblast´ı pro pohyb dol˚ u. Donutit beruˇsku k pohybu doprava je moˇzn´e t’uknut´ım (a drˇzen´ım) v prav´e spodn´ı oblasti obrazovky, pohyb beruˇskou doleva je um´ıstˇen vlevo od oblasti pro pohyb doprava. Pro zv´ yraznˇen´ı tohoto ovl´ad´an´ı je obrazovka doplnˇena ˇctveˇric´ı pr˚ uhledn´ ych ˇsipek um´ıstˇen´ ych v oblastech pro konkr´etn´ı pohyb beruˇskou viz obr´azek 4.5. Co se t´ yˇce samotn´e implementace zmˇeny ovl´ad´an´ı, snaˇzili jsme na u ´rovni zdrojov´eho k´odu do maxim´aln´ı m´ıry vyuˇz´ıt st´avaj´ıc´ı syst´em ovl´ad´an´ı, abychom do nˇeho museli zas´ahnout co nejm´enˇe. Nejtˇeˇzˇs´ı na tomto u ´kolu bylo pochopit logiku k´odu implementuj´ıc´ıho toto ovl´ad´an´ı. Ve zjednoduˇsen´e podobˇe si lze logiky ovl´ad´an´ı pˇredstavit jako nekoneˇcnou smyˇcku hern´ıch ud´alost´ı (kde ud´alost´ı m˚ uˇze b´ yt stisk/puˇstˇen´ı kl´avesy/obrazovky) a pˇri kaˇzd´e z t´eto hern´ı ud´alosti se porovn´a zdroj t´eto ud´alosti s polem kl´avesov´ ych-ud´alost´ı. Toto pole kl´avesov´ ych-ud´alost´ı je ve zdrojov´em k´odu hry Beruˇsky natvrdo pˇreddefinov´ano a ˇr´ık´a, co se m´a pro jakou hern´ı ud´alost st´at. Existence tohoto pole kl´avesov´ ych-ud´alost´ı n´am dovoluje do k´odu hry Beruˇsky jednoduˇse pˇridat metodu, kter´a bude pˇrev´adˇet t’uknut´ı na obrazovku na zm´aˇcknut´ı kl´avesy. Jak tato funkce vypad´a, viz n´asleduj´ıc´ı k´od: #define #define #define #define
UP DOWN LEFT RIGHT
0 1 2 3
#define #define #define #define #define #define
PLAYER_0 9 PLAYER_1 10 PLAYER_2 11 PLAYER_3 12 PLAYER_4 13 MENU_IN_GAME
14
int input::get_pressed_key(SDL_Event * event) { float mx = ((float) event->tfinger.x); float my = ((float) event->tfinger.y); if(mx < 0.3 && my > 0.5) { return my > 0.8 ? DOWN : UP; }
54
Realizaˇcn´ı ˇc´ast
Portace
if(mx > 0.7 && my > 0.6) { return mx > 0.85 ? RIGHT : LEFT; } if(mx > 0.9 && my < 0.1) { return MENU_IN_GAME; // prav´ y horn´ ı roh obrazovky } if(my < 0.16) { float x = 120.0/game_resolution_x; if(mx < x) { return PLAYER_0; } if(mx > x && mx < x * 2) { return PLAYER_1; } if(mx > x * 2 && mx < x * 3) { return PLAYER_2; } if(mx > x * 3 && mx < x * 4) { return PLAYER_3; } if(mx > x * 4 && mx < x * 5) { return PLAYER_4; } } return -1; } ˇ ısla konstant v uk´azce k´odu jsou indexy do pole kl´avesov´ C´ ych-ud´alost´ı. Toto pole se pˇri kaˇzd´e hern´ı ud´alosti cel´e proj´ıˇzd´ı a odpov´ıdaj´ıc´ı kl´avesov´eud´alosti se vykon´avaj´ı. Z uk´azky k´odu je z´aroveˇ n vidˇet, ˇze t’uknut´ım do prav´eho horn´ıho rohu obrazovky se hr´aˇc dostane do hern´ıho menu. Dalˇs´ı oblast´ı, kterou bylo nutn´e kompletnˇe pˇredˇelat je v´ ybˇer hern´ıch level˚ u. V p˚ uvodn´ı verzi hry Beruˇsky bylo pˇrech´azen´ı mezi levely vyˇreˇseno pomoc´ı hesel, kdy se hr´aˇci po dohr´an´ı kaˇzd´e u ´rovnˇe zobrazilo heslo pro pˇr´ıstup do dalˇs´ı u ´rovnˇe. Toto heslo si bylo nutn´e opsat a pˇri dalˇs´ım spuˇstˇen´ı hry bylo nutn´e toto heslo zadat do odpov´ıdaj´ıc´ı kolonku a zm´aˇcknou tlaˇc´ıtko Play, aby se hr´aˇc dostal do poˇzadovan´eho levelu. Tento pˇr´ıstup je pro mobiln´ı hru 55
Realizaˇcn´ı ˇc´ast
Portace
Obr´azek 4.5: Uk´azka v´ ybˇeru levelu v mobiln´ı hˇre Beruˇsky
zcela nevhodn´ y a naprosto odporuje zabˇehnut´ ym standard˚ um na poli mobiln´ıch her. Jak jiˇz bylo ˇreˇceno v kapitole 2.1 obsahuje hra Beruˇsky celkem 120 hern´ıch u ´rovn´ı. Tyto u ´rovnˇe jsou rozdˇeleny celkem do pˇeti obt´ıˇznost´ı, pˇriˇcemˇz nejv´ıce u ´rovn´ı obsahuje obt´ıˇznost Easy a to rovn´ ych 50. V mobiln´ıch hr´ach je standardem, ˇze hry, kter´e jsou postaveny na velk´em mnoˇzstv´ı kr´atk´ ych level˚ u, napˇr. hra Angry Birds [12], nab´ız´ı hr´aˇci obrazovku, na kter´e je seznam v´ıce level˚ u najednou a hr´aˇc si m˚ uˇze zvolit, jak´ y level chce (samozˇrejmˇe nechyb´ı princip postupn´eho odemyk´an´ı level˚ u jednoho po druh´em). Nav´ıc je typick´e, ˇze hra nab´ız´ı v´ıce level˚ u, neˇzli se vejde do seznamu na jednu obrazovku, a proto existuje se seznamem level˚ u v´ıce obrazovek. Mezi tˇemito obrazovkami se obecnˇe pohybuje gestem taˇzen´ım prstu. A pr´avˇe takov´ y syst´em jsme implementovali do mobiln´ı verze hry Beruˇsky, viz obr´azek 4.5. Na obr´azku je zachycen okamˇzik pˇrechodu mezi prvn´ı a druhou obrazovkou s v´ ybˇerem level˚ u. Tato ˇca´st hry byla oproti p˚ uvodn´ı verzi hry Beruˇsky kompletnˇe pˇredˇel´ana pr´avˇe pro potˇreby mobiln´ıch zaˇr´ızen´ı.
56
Realizaˇcn´ı ˇc´ast
4.4.3
Portace
Zmˇ ena z obrazovky na mal´ y displej
Probl´emy pˇri portaci hry Beruˇsky popsan´e v pˇredeˇsl´e kapitole mˇeli vˇsechno co doˇcinˇen´ı s ovl´ad´an´ım hry. V t´eto kapitole si pov´ıme o probl´emech, kter´e bylo pˇri portaci nutn´e vyˇreˇsit, spojen´e s velikost´ı obrazovky mobiln´ıch zaˇr´ızen´ı. Prvn´ım probl´emem, kter´ y se s velikost´ı obrazovek mobiln´ıch zaˇr´ızen´ı objevil, je paradoxnˇe jejich vysok´e rozliˇsen´ı. V r´amci boje o z´akazn´ıka se v´ yrobci mobiln´ıch zaˇr´ızen´ı snaˇz´ı vˇsemoˇzn´ ymi silami b´ yti lepˇs´ı neˇz konkurence a do tohoto boje spad´a i honba za nejvˇetˇs´ım rozliˇsen´ım. P˚ uvodn´ı hra Beruˇsky bˇeˇzela v rozliˇsen´ı 640 x 480 pixel˚ u, coˇz s pˇrehledem dneˇsn´ı mobiln´ı telefony pˇrekon´avaj´ı. Probl´emem je, ˇze v tak mal´em rozliˇsen´ı je hra Beruˇsky na displeji mobiln´ıho telefonu velice mal´a a napˇr´ıklad na zaˇr´ızen´ı s dnes bˇeˇzn´ ym rozliˇsen´ım obrazovky 1196 x 768 zab´ır´a necelou polovinu obrazu. Programov´ y k´od byl z d˚ uvodu mal´eho rozliˇsen´ı p˚ uvodn´ı hry upraven tak, ˇze v momentˇe kdy se pomoc´ı funkce SDL_RenderCopy, popsan´e v sekci 4.4.1, prom´ıt´a zdrojov´ y obr´azek na c´ılov´ y, tak se hodnoty souˇradnic se kter´ ymi se pracuje, n´asob´ı ˇc´ıslem 2. Toto zajist´ı, ˇze v´ ysledn´ y obraz je dostateˇcnˇe velk´ y a vyuˇz´ıv´a celkovou plochu obrazovky i u zaˇr´ızen´ı s velk´ ym rozliˇsen´ım. Tato u ´prava s sebou nese z´aroveˇ n i dalˇs´ı probl´em. Aˇckoliv m´ame nyn´ı celou obrazovku mobiln´ıho zaˇr´ızen´ı vyuˇzitou, nov´e rozliˇsen´ı 1280 x 960 je v pomˇeru 4:3 (jako p˚ uvodn´ı rozliˇsen´ı), ale ˇsiroko´ uhl´ y displej mobiln´ıho zaˇr´ızen´ı takov´ y pomˇer stran nenab´ız´ı, a proto se ˇc´ast hern´ı plochy kresl´ı mimo obrazovku. Tento probl´em je jeˇstˇe v´ıce patrn´ y napˇr´ıklad na mobiln´ım zaˇr´ızen´ı Apple iPhone 4S, jeˇz disponuje rozliˇsen´ım 960 x 640 pixel˚ u. V tomto pˇr´ıpadˇe se mimo obrazovku kresl´ı jiˇz podstatn´a ˇca´st hern´ı plochy. Tento probl´em je moˇzn´e vyˇreˇsit pouze jedin´ ym zp˚ usobem. T´ım zp˚ usobem je umoˇznˇen´ı hr´aˇci posouvat hrac´ı plochou dle jeho libosti. Samotnou implementaci ˇreˇsen´ı tohoto probl´emu lze jiˇz prov´est nˇekolika zp˚ usoby a lze tuto moˇznost posouv´an´ı hrac´ı plochy rozˇs´ıˇrit o moˇznost pˇribl´ıˇzen´ı/odd´alen´ı (zoom) hrac´ı plochy. Tato kombinace nab´ız´ı nejv´ıce uˇzivatelsk´eho komfortu, ale za cenu sloˇzitˇejˇs´ıho ovl´ad´an´ı a komplikovanˇejˇs´ı implementace. Jelikoˇz by moˇznost zoomov´an´ı pˇrinesla dalˇs´ı ot´azky, na kter´e nen´ı jednoznaˇcn´a odpovˇed’, jako napˇr. jak moc umoˇznit hr´aˇci hern´ı plochu pˇribl´ıˇzit/odd´alit atd., rozhodli jsme se od moˇznosti zoomov´an´ı upustit a zamˇeˇrili jsme se pouze na moˇznost pohybov´an´ı hrac´ı plochou bez zmˇeny pˇribl´ıˇzen´ı. Samotn´a moˇznost posunut´ı hrac´ı plochy gestem taˇzen´ı prstem sebou nese 57
Realizaˇcn´ı ˇc´ast
Portace
nˇekolik ot´azek, kter´e je nutn´e zv´aˇzit. Nejd˚ uleˇzitˇejˇs´ı z tˇechto ot´azek je jak daleko m˚ uˇze hr´aˇc hrac´ı plochu posunout. Bude moci hr´aˇc posunout hrac´ı plochou mimo hranice obrazovky? A pokud ano, co se stane, kdyˇz taˇzen´ı pˇreruˇs´ı? Co se zobraz´ı v prostoru mimo hrac´ı oblast atd.? Abychom se vyhnuli tˇemto ot´azk´am, implementovali jsme posunut´ı hrac´ı plochy pouze v r´amci hranic obrazovky. To znamen´a, ˇze pokud hr´aˇc t´ahne hrac´ı plochou vpravo, povol´ıme mu t´ahnout maxim´alnˇe tak daleko, aby na lev´em okraji obrazovky nevznikla ˇza´dn´a mezera mezi okrajem obrazovky a okrajem hern´ı plochy. V´ yjimkou z tohoto pravidla je taˇzen´ı hern´ı plochy dol˚ u. V tomto pˇr´ıpadˇe hr´aˇci dolov´ıme t´ahnout tak daleko, ˇze horn´ı okraj hrac´ı plochy se posune smˇerem dol˚ u pod horn´ı liˇstu zobrazuj´ıc´ı ikony beruˇsek. Pro lepˇs´ı pˇredstavu viz obr´azek C.1, zobrazuj´ıc´ı ve sv´e horn´ı polovinˇe stav, kdy je hern´ı plocha mimo liˇstu s beruˇskami (obrazovka obsahuje horn´ı ˇc´ast hrac´ı plochy) a v doln´ı polovinˇe je obr´azek, zobrazuj´ıc´ı situaci, kdy je hern´ı plocha posunuta nahoru, takˇze hr´aˇc vid´ı spodn´ı ˇca´st hrac´ı plochy a liˇsta s beruˇskami se kresl´ı nad hrac´ı plochou.
Obr´azek 4.6: Uk´azka PC verze hry Beruˇsky
Dalˇs´ım probl´emem u ´zce souvisej´ıc´ım s nutnost´ı posouvat hrac´ı plochou, z d˚ uvodu rozliˇsn´ ych velikost´ı displej˚ u mobiln´ıch zaˇr´ızen´ı, je jak´ ym zp˚ usobem zobrazovat na obrazovce hern´ı informace. Mezi tyto informace patˇr´ı poˇcet krok˚ u, kter´e beruˇsky uˇsli od zaˇc´atku hern´ı u ´rovnˇe, poˇcet sebran´ ych kl´ıˇc˚ ua poˇcet sebran´ ych krump´aˇc˚ u, kter´e jednotliv´e beruˇsky vlastn´ı. Vˇsechny tyto informace byly v p˚ uvodn´ı verzi hry zobrazeny nad hrac´ı plochou nebo pod n´ı a byli st´ale vidˇet. V mobiln´ı verzi hry Beruˇsky bylo, pro zobrazen´ı tˇechto informac´ı, zapotˇreb´ı zaˇc´ıt rozliˇsovat lok´aln´ı souˇradnice v hern´ı u ´rovni a glob´aln´ı 58
Realizaˇcn´ı ˇc´ast
Portace
souˇradnice obrazovky, kter´e z˚ ust´avaj´ı po celou dobu hry stejn´e. Dalˇs´ı probl´em, jenˇz je nutn´ y v souvislosti s vykreslov´an´ım hern´ı u ´rovnˇe vyˇreˇsit, je situace kdy hr´aˇc pohybuje beruˇskou a dostane se s n´ı k hranic´ım obrazovky v momentˇe, kdy hern´ı plocha pokraˇcuje d´ale. Pokud by se nic nestalo, tak by se v dalˇs´ım kroku beruˇska dostala do ˇca´sti hrac´ı plochy mimo obrazovku a hr´aˇc by v tu chv´ıli nevˇedˇel, co beruˇska pr´avˇe dˇel´a, takˇze by mohla omylem posunout nˇejakou bednu ˇci podobnˇe. Takov´e chov´an´ı by mˇelo negativn´ı dopad na spokojenost hr´aˇce, a proto jsme do mobiln´ı verze hry Beruˇsky implementovali automatick´e posunut´ı hrac´ı plochy v momentˇe, kdy se pr´avˇe ovl´adan´a beruˇska pˇribl´ıˇz´ı k okraji obrazovky a smˇerem, kter´ ym se beruˇska pohybuje je hern´ı plocha mimo obrazovku. Tento syst´em dovoluje proj´ıt celou hern´ı u ´roveˇ n bez nutnosti ruˇcn´ıho posouv´an´ı hrac´ı plochy. Posledn´ı probl´em velice u ´zce souvis´ı s automatick´ ym posouv´an´ım hrac´ı plochy, pˇribl´ıˇz´ı-li se beruˇska hranici obrazovky. T´ımto probl´emem je, ˇze v nˇekter´ ych situac´ıch kdy hr´aˇc pˇrep´ın´a jednotliv´e beruˇsky, tak novˇe vybran´a beruˇska je mimo viditelnou hrac´ı plochu. V tomto pˇr´ıpadˇe chce hr´aˇc ihned vˇedˇet, kde se nach´az´ı j´ım zvolen´a beruˇska. Tento probl´em je vyˇreˇsen automatick´ ym pˇrepnut´ım na ˇc´ast hrac´ı plochy obsahuj´ıc´ı novˇe vybranou beruˇsku.
59
5 Z´avˇer C´ılem t´eto pr´ace bylo zkonvertovat poˇc´ıtaˇcovou hru Beruˇsky na mobiln´ı platformy Android a iOS a prozkoumat moˇznosti bˇehu C/C++ k´odu na tˇechto platform´ach. V t´eto pr´aci jsme si nejdˇr´ıve kr´atce pˇredstavili obˇe dvˇe platformy iOS a Android a pot´e jsme se pod´ıvali na moˇznosti multiplatformn´ıho v´ yvoje aplikac´ı pomoc´ı dostupn´ ych ˇreˇsen´ı. V t´eto ˇc´asti pr´ace jsme zjistili, ˇze existuje ˇsirok´ y v´ ybˇer z technologi´ı a framework˚ u, od tˇech poskytuj´ıc´ıch moˇznost psan´ı aplikac´ı pomoc´ı HTML5 a CSS, aˇz po klasick´e frameworky poskytuj´ıc´ı moˇznost psan´ı aplikac´ı v jazyce C/C++. Ve vyhodnocen´ı t´eto ˇc´asti jsme se rozhodli, pro u ´ˇcel konverze vyuˇz´ıt knihovnu SDL 2.0. V dalˇs´ı ˇca´sti pr´ace jsme se bl´ıˇze pod´ıvali na moˇznosti bˇehu C/C++ k´odu na jednotliv´ ych platform´ach a u platformy Android jsme si podrobnˇe popsali jak bˇehu C/C++ k´odu doc´ılit, jelikoˇz prim´arn´ım programovac´ım jazykem t´eto platformy je jazyk Java. V realizaˇcn´ı ˇca´sti t´eto pr´ace jsme si popsali v´ yvojov´e prostˇred´ı pro jednotliv´e platformy a struktury projekt˚ u, jeˇz tyto v´ yvojov´a prostˇred´ı pˇredepisuj´ı. Zjistili jsme, ˇze projekt pro platformu Android mus´ı m´ıt jasnˇe danou strukturu a vyuˇz´ıv´a se zde konvenc´ı pˇred konfigurac´ı. Na druh´e stranˇe od projektu pro platformu iOS nen´ı vyˇzadov´ana ˇz´adn´a striktn´ı struktura. T´eto skuteˇcnosti jsme s v´ yhodou vyuˇzili pˇri sd´ılen´ı jednoho zdrojov´eho k´odu pro obˇe platformy verzovac´ım syst´emem Git. V druh´e polovinˇe realizaˇcn´ı ˇca´sti pr´ace jsme si podrobnˇe popsali probl´emy pˇri pˇrevodu poˇc´ıtaˇcov´e hry na mobiln´ı zaˇr´ızen´ı s dotykov´ ym ovl´ad´an´ım. Nejprve jsme proˇsli nutn´e zmˇeny ve zdrojov´em k´odu s ohledem na vykreslov´an´ı v´ ysledn´eho obrazu, pot´e jsme si proˇsli implementaci dotykov´eho ovl´ad´an´ı a v posledn´ı ˇc´asti jsme si ˇrekli nˇeco o probl´emech spojen´ ych s rozliˇsen´ım obrazovek mobiln´ıch zaˇr´ızen´ı. C´ıl t´eto pr´ace se n´am podaˇrilo naplnit a nyn´ı lze poˇc´ıtaˇcovou hru Beruˇsky hr´at na zaˇr´ızen´ıch s operaˇcn´ım syst´emem iOS a Android.
60
A Seznam pouˇzit´ych zkratek HTML HyperText Markup Language CSS Cascading Style Sheets GPU Graphics processing unit API Application Programming Interface RAD Rapid application development IDE Integrated Development Environment NDK Native Development Kit VM Virtual Machine JVM Java Virtual Machine JNI Java Native Interface JDK Java Development Kit SDL Simple DirectMedia Layer RFC Request for Comments XML Extensible Markup Language SCM Source Control Management
61
B Instalaˇcn´ı pˇr´ıruˇcka Na pˇriloˇzen´em CD naleznete kompletn´ı Git reposit´aˇr, jeˇz obsahuje zdrojov´e soubory hry Beruˇsky a z´aroveˇ n konfiguraci Eclipse projektu i Xcode projektu. Tyto konfiguraˇcn´ı soubory lze vyuˇz´ıt pro import projektu hry beruˇsky do tˇechto v´ yvojov´ ych prostˇred´ı. Pro spuˇstˇen´ı na Android zaˇr´ızen´ı staˇc´ı poˇzadovan´e zaˇr´ızen´ı pˇripojit pomoc´ı USB a v prostˇred´ı Eclipse spustit hru Beruˇsky na tomto zaˇr´ızen´ı. Pro spuˇstˇen´ı na iOS zaˇr´ızen´ı je potˇreba st´at se ˇclenem iOS Developer ˇ Programu. Clenstv´ ı v tomto programu je placen´e. Po zaplacen´ı ˇclenstv´ı je potˇreba nakonfigurovat prostˇred´ı Xcode, coˇz v sobˇe zahrnuje vytvoˇren´ı vlastn´ıho certifik´atu a dalˇs´ıch vˇec´ı. Podrobn´e informace lze nal´ezt na ofici´aln´ıch str´ank´ach iOS Developer Programu. Na pˇriloˇzen´em CD se v adres´aˇri berusky.mobile/jni/SDL nach´az´ı dodateˇcn´e informace, jak zprovoznit projekt obsahuj´ıc´ı SDL na jednotliv´ ych platform´ach.
62
C Obsah pˇriloˇzen´eho CD Pˇriloˇzen´e CD obsahuje kompletn´ı Git reposit´aˇr pouˇzit´ y bˇehem implementaˇcn´ı ˇc´asti t´eto pr´ace. Na obr´azku je popis nejd˚ uleˇzitˇejˇs´ıch adres´aˇr˚ u a soubor˚ u.
Obr´azek C.1: Obsah pˇriloˇzen´eho CD
63
Literatura [1] RFC 2743. http://www.ietf.org/rfc/rfc2743.txt, Srpen 2013. [2] Generic LEvel EDitor 2D. http://gleed2d.codeplex.com, Srpen 2013. [3] Stage 3D. http://www.adobe.com/devnet/flashplayer/stage3d. html, Srpen 2013. [4] RFC 4401. http://tools.ietf.org/html/rfc4401, Srpen 2013. [5] Adobe Air. http://dojotoolkit.org/features/mobile, Srpen 2013. [6] Open Handset Alliance. http://www.openhandsetalliance.com, Srpen 2013. [7] Anakreon. http://anakreon.cz, Srpen 2013. [8] 975 Apple patent ˇc.7, 786. US7786975, Srpen 2013.
http://www.google.com/patents/
[9] Apportable. http://www.apportable.com, Srpen 2013. [10] Badland. http://www.badlandgame.com, Srpen 2013. [11] Android bagatelizov´an. http://www.engadget.com/2007/11/05/ symbian-nokia-microsoft-and-apple-downplay-android-relevance, Srpen 2013. [12] Angry Birds. http://www.angrybirds.com, Srpen 2013. [13] Box2D. http://box2d.org, Srpen 2013. [14] CocosBuilder. http://cocosbuilder.com, Srpen 2013. [15] Apache Cordova. http://cordova.apache.org, Srpen 2013. 64
LITERATURA
LITERATURA
[16] Beruˇsky domovsk´a str´anka. http://anakreon.cz/?q=node/1, Srpen 2013. [17] Tiled Map Editor. http://www.mapeditor.org, Srpen 2013. [18] Away3d Game Engine. http://away3d.com, Srpen 2013. [19] Citrus Game Engine. http://citrusengine.com, Srpen 2013. [20] Nape Physics Engine. http://napephys.com, Srpen 2013. [21] OpenGL ES. http://www.khronos.org/opengles/, Srpen 2013. [22] Ozn´amen´ı frameworku SDL 2.0. http://www.phoronix.com/scan. php?page=news_item&px=MTE0MDU, Srpen 2013. [23] Specifikace Java Native Interface. http://docs.oracle.com/javase/ 7/docs/technotes/guides/jni/spec/jniTOC.html, Srpen 2013. [24] Sokoban je PSPACE-´ upln´ y. http://webdocs.cs.ualberta.ca/~joe/ Preprints/Sokoban, Srpen 2013. [25] jQuery Mobile. http://jquerymobile.com, Srpen 2013. [26] Mach Kernel. https://en.wikipedia.org/wiki/Mach_(kernel), Srpen 2013. [27] Simple DirectMedia Layer. http://www.libsdl.org, Srpen 2013. [28] Lua. http://www.lua.org, Srpen 2013. [29] Dojo Mobile. 2013.
http://www.adobe.com/products/air.html, Srpen
[30] Rozloˇzen´ı mobiln´ıho trhu. http://marketingland.com/ mobile-market-share-android-iphone-gain-while-others-flail-50197, Srpen 2013. [31] Objective-C. 2013.
http://en.wikipedia.org/wiki/Objective-C, Srpen
[32] Git Home Page. http://git-scm.com/, Srpen 2013. [33] Away Physics. http://www.awayphysics.com, Srpen 2013. [34] Bad Piggies. http://www.badpiggies.com, Srpen 2013. 65
LITERATURA
LITERATURA
[35] Eclipse Android Plugin. http://developer.android.com/sdk/ installing/installing-adt.html, Srpen 2013. [36] Fibonacciho posloupnost. Fibonacci_number, Srpen 2013.
http://en.wikipedia.org/wiki/
[37] Cut The Rope. http://www.cuttherope.ie, Srpen 2013. [38] Corona SDK. http://www.coronalabs.com, Srpen 2013. [39] Marmalade SDK. http://www.madewithmarmalade.com, Srpen 2013. [40] Yunhe Shi, David Gregg, Andrew Beatty, and M. Anton Ertl. Virtual machine showdown: stack versus registers. In In VEE ’05: Proceedings of the 1st ACM/USENIX international conference on Virtual execution environments, pages 153–163. ACM, 2005. [41] Pr´avn´ı spor Goolge vs. Oracle. http://www.wired.com/business/ 2010/10/google-oracle-android, Srpen 2013. [42] Starling. http://gamua.com/starling, Srpen 2013. [43] Sencha Touch. http://www.sencha.com/products/touch, Srpen 2013. [44] Historie verz´ı operaˇcn´ıho syst´emu iOS. http://en.wikipedia.org/ wiki/IOS_version_history, Srpen 2013. [45] Dalvik VM. Srpen 2013.
http://en.wikipedia.org/wiki/Dalvik_(software),
[46] Unity zdarma. http://blogs.unity3d.com/2013/05/21/ putting-the-power-of-unity-in-the-hands-of-every-mobile-,year= {Srpen2013}developer. [47] zlib/libpng License (Zlib). http://opensource.org/licenses/Zlib, Srpen 2013.
66