E N C Y K L O P E D I E
Z O N E R
P R E S S
VÝVOJ HER
pro Android
profesionálně
Vladimir Silva
Vývoj her pro Android profesionálně
Vladimir Silva
Advanced Android 4 Games Vladimir Silva Original edition copyright © 2012 by Vladimir Silva. Czech edition copyright © 2013 by ZONER software, a.s. All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording, or by any information storage or retrieval system, without the prior written permission of the copyright the publisher. Copyright originálního vydání © 2012 Vladimir Silva. Copyright českého vydání © 2013 ZONER software, a.s. Všechna práva vyhrazena. Žádná část této publikace nesmí být reprodukována nebo předávána žádnou formou nebo způsobem, elektronicky ani mechanicky, včetně fotokopií, natáčení ani žádnými jinými systémy pro ukládání bez výslovného svolení držitele autorských práv.
Vývoj her pro Android – profesionálně Autor: Vladimir Silva Copyright © ZONER software, a.s. Vydání první, v roce 2013. Všechna práva vyhrazena. Zoner Press Katalogové číslo: ZRK1214 ZONER software, a.s. Nové sady 18, 602 00 Brno Překlad: RNDr. Jan Pokorný Odpovědný redaktor: Miroslav Kučera Šéfredaktor: Ing. Pavel Kristián DTP: Miroslav Kučera Obálka: Dan Zůda Zdrojové soubory ke stažení: http://zonerpress.cz/download/zrk1214-android.zip
Informace, které jsou v této knize zveřejněny, mohou byt chráněny jako patent. Jména produktů byla uvedena bez záruky jejich volného použití. Při tvorbě textů a vyobrazení bylo sice postupováno s maximální péčí, ale přesto nelze zcela vyloučit možnost výskytu chyb. Vydavatelé a autoři nepřebírají právní odpovědnost ani žádnou jinou záruku za použití chybných údajů a z toho vyplývajících důsledků. Všechna práva vyhrazena. Žádná část této publikace nesmí být reprodukována ani distribuována žádným způsobem ani prostředkem, ani reprodukována v databázi či na jiném záznamovém prostředku či v jiném systému bez výslovného svolení vydavatele, s výjimkou zveřejnění krátkých částí textu pro potřeby recenzí. Veškeré dotazy týkající se distribuce směřujte na: Zoner Press ZONER software, a.s Nové sady 18, 602 00 Brno tel.: 532 190 883 e-mail: knihy@zoner.cz www.zonerpress.cz
ISBN 978-80-7413-255-1
Všem vývojářům pro Android – budoucnost této platformy je ve vašich rukou
O autorovi Vladimir Silva se narodil v hlavním městě Ekvádoru, v Quitu. V roce 1994 absolvoval ekvádorský Army Polytechnic Institute jako systémový analytik. Téhož roku přešel do Spojených států jako výměnný student, aby vystudoval informatiku na Middle Tennessee State University. Po promoci se zapojil do technologického think tanku WebAhead společnosti IBM. Mezi jeho zájmy patří grid computing (distribuované řešení složitých matematických, fyzikálních a jiných přírodovědných problémů), neuronové sítě a umělá inteligence. Je také držitelem četných certifikátů v oboru informačních technologií, mezi něž patří Oracle Certified Professional (OCP), Microsoft Certified Solution Developer (MCSD) a Microsoft Certified Professional (MCP). Napsal mnoho odborných článků týkajících se bezpečnosti a grid computing pro IBM developerWorks.
O odborných korektorech Vikram Goyal je autorem několika knih z vydavatelství Apress a z domova pracuje na několika webech. V současné době žije v Brisbane v Austrálii. James Graham se narodil v Alabamě a vyrostl ve Fort Walton Beach na Floridě a v San Antoniu v Texasu. V roce 1988 získal BS v oboru elektronika se specializací telekomunikace na Texas A&M University. Pracoval jako spolupracující síťový inženýr pro skupinu Network Design ve společnosti Amoco a jako systémový analytik v oblasti umělé inteligence pro US Air Force Special Operations Command. Kromě toho, že je vývojářem Androidu, je také autorem vysoce hodnoceného programu JStrack pro sledování hurikánů.
Poděkování Rádi bychom poděkovali všem lidem z vydavatelství Apress. Bez jejich pomoci by tato kniha nevznikla.
5
Stručný obsah Kapitola 1 Vítejte ve světě malého zeleného robota
19
Kapitola 2 Herní triky pro telefony a tablety
31
Kapitola 3 Další herní triky s OpenGL a JNI
71
Kapitola 4 Grafika s OpenGL ES 2.0
123
Kapitola 5 3D engine Doom
157
Kapitola 6 3D engine Quake
207
Kapitola 7 3D engine Quake II
249
Dodatek A Tipy k nasazování aplikací a ke kompilaci
277
Rejstřík
285
6
Obsah O autorovi
4
O odborných korektorech
4
Poděkování
4
Úvod
10
Zelený robot se začíná prosazovat
10
Komu je kniha určena?
11
Požadované dovednosti, abyste z knihy vytěžili maximum
11
Jaký hardware a software budete potřebovat?
13
Čím je tato kniha jedinečná?
15
Co naleznete v jednotlivých kapitolách?
16
Kapitola 1
Vítejte ve světě malého zeleného robota
Příprava stroje
19 19
Stažení a instalace Android SDK
20
Konfigurace Eclipse
20
Instalace Android NDK (Native Development Kit)
24
Instalace NDK
24
Instalace Cygwin
24
Vytvoření emulátoru Androidu Vytvoření AVD
25 25
Konfigurace opravdového zařízení
28
Shrnutí
28
Kapitola 2
Herní triky pro telefony a tablety
Kompilace nativního kódu v Androidu
31 31
Vytvoření projektu Androidu s nativní podporou
33
Architektura aplikace
34
Kompilace sdílené knihovny
45
Otestování aplikace na zařízení
46
Obaly Javy pro obsluhu událostí C/C++
48
Nezávislá obsluha audia
48
Kaskádování událostí videa
54
Multitouch Třída MultiTouchGesture
59 59
7 Třída MultiTouchScreen
61
Třída TestActivity
63
Zeemote – ovladač s Bluetooth
65
Shrnutí
69
Kapitola 3
Další herní triky s OpenGL a JNI
71
Síla mobilních zařízení
72
OpenGL s Javou
73
Vytvoření projektu
73
Hlavní aktivita Javy
76
Zobrazení povrchu
78
Třída GLThread
82
Renderer krychlí
85
Třída Cube
89
OpenGL nativně
92
Hlavní aktivita
93
Třída nativního rozhraní
95
Změny v původním příkladu
96
Nativní renderer krychlí
98
Nativní krychle
104
Kompilace a spuštění příkladu
106
Scaling bufferů videa s hybridním OpenGL ES
109
Proč používat hybridní scaling?
110
Inicializace povrchu
112
Kreslení do textury
114
Co se stane, když obrázek není mocnina dvou
116
Shrnutí
Kapitola 4
122
Grafika s OpenGL ES 2.0
OpenGL ES 2.0 a Android Shadery
123 123 124
GLSL
124
Anatomie shaderu
126
Vyvolání OpenGL ES 2.0 v Androidu Projekt dvacetistěnu Seznámení s cílovým obrazcem
130 130 130
8 Zahájení prací na projektu
132
Nativní dvacetistěn
142
Využití více současných dotyků pro změnu rychlosti rotace a zoom
149
Kompilace a spuštění
154
Shrnutí
155
Kapitola 5
3D engine Doom
157
Neomezené možnosti mocné dvojky Java/C
158
Přenos hry Doom na mobilní zařízení
159
Architektura hry pro Doom
161
Hlavní aktivita v Javě
163
Obsluha vytvoření
163
Layout hry
164
Menu a obsluhy výběru z menu
166
Obsluha klávesových a dotykových událostí
168
Obsluhy nativního zpětného volání
170
Navigační ovládací prvky
174
Obsluha audia nezávisle na formátu
177
Třída nativního rozhraní
177
Naslouchač zpětného volání
177
Nativní metody
178
Zpětná volání C do Javy
179
Nativní vrstva
182
Implementace nativních metod
182
Změny v původní hře
194
Kompilace Doom s NDK
201
Otestování hry Doom v emulátoru
203
Shrnutí
206
Kapitola 6
3D engine Quake
Terminologie Quake Síla opětovného využití kódu: Quake s méně než 500 řádky nového kódu
207 207 208
OpenGL není totéž co OpenGL ES
208
Softwarový renderer – je to možné řešení?
210
NanoGL: náš zachránce
210
Architektura Quake pro Android
216
9 Architektura OpenGL rendereru Javy
217
Obsluha audia nezávisle na formátu
222
Obsluha klávesových událostí
225
Startovací aktivita hry
230
Požadované změny v nativním enginu Quake
232
Změny v obsluze videa
232
Zpracování pitch a yaw
234
Obsluha pohybu vpřed a do stran
235
Změny v obsluze audia
236
Oprava herního cyklu
238
Spuštění hry na zařízení
241
Shrnutí
248
Kapitola 7
3D engine Quake II
Prohlídka kódu
249 249
Únik z pout haldy Javy
250
Ochočení mocného enginu Quake II
251
Opětovná využitelnost kódu
251
Co dělat, když dojde k fatální chybě
261
Záležitosti týkající se okamžitého módu OpenGL
264
Obsluhy videa
264
Sestavení Quake II s NDK
269
Spuštění na zařízení nebo v emulátoru
272
Výkon Quake II na několika zařízeních
275
Shrnutí
276
Dodatek A
Tipy k nasazování aplikací a ke kompilaci
Podepsání aplikace
277 277
Vytvoření depozitáře Javy pro klíče
278
Podepsání aplikace
278
Užitečné tipy pro JNI
281
Zavolání Javy z C (zpětná volání)
282
Závěrečné zamyšlení
283
Rejstřík
285
10
Úvod Vítejte v knize Vývoj her pro Android. Pomůže vám vytvářet skvělé hry pro platformu Android. Ano, existuje spousta knih, které se potýkají s touto problematikou, ale pouze tato kniha vám poskytne jedinečný vhled do toho, jak snadno se na tuto platformu přenesou s minimálním úsilím nativní PC hry. Kniha toho v každé z kapitol dociluje prostřednictvím příkladů ze skutečného světa a zdrojového kódu. Než se ale začnete do hloubky zabývat tématy knihy, mějte na paměti, že potřebujete mít solidní základy v Javě a v ANSI C. Snažil jsem se jasně a jednoduše vysvětlovat nejkomplikovanější pojmy kombinací ilustračních obrázků a ukázkového kódu. Zdrojový kód poskytovaný ke každé kapitole by měl pomoci tyto pojmy do detailu pochopit a efektivně je využívat na pozici vývojáře her pro mobilní zařízení.
Zelený robot se začíná prosazovat Je až k neuvěření, že Android, který se se objevil na scéně chytrých telefonů před několika málo lety (2008), a že už se tak vehementně prosazuje. Podívejte se na obrázek 1, kde je na základě průzkumu trhu společnosti Nielsen zobrazen koláčový graf trhu s chytrými telefony v USA (zdroj: hhttp://www.nielsen.com/us/ en/newswire/2012/two-thirds-of-new-mobile-buyers-now-opting-for-smartphones.html). V červnu 2012, Android ovládl přes 51 procent trhu s chytrými telefony ve Spojených státech – to není vůbec špatné na operační systém starý jen pár let.
Obrázek 1. Podíly na trhu s chytrými telefony, červen 2012, Nielsen. A čísla jsou čím dál lepší. Například ke konci roku 2012 dohnal Google Play konkurenční AppStore od Apple v počtu aplikací. V polovině roku 2013 Google dále ohlásil, že každý den je aktivováno 1,5 miliónů zařízení s Androidem a že z Google Play už bylo staženo přes 50 miliard aplikací (pro srovnání: platforma iOS dosáhla tohoto počtu o dva měsíce dříve – pozn. red.). Není pochyb o tom, že vývojářům, kteří se neustále pídí po nějakém způsobu, jakým by mohli vydělat na raketovém růstu segmentu chytrých telefonů, se otevírají zcela nové obzory. A kniha Vývoj her pro Android je přesně to, co potřebujete, abyste se co nejrychleji dostali na špici budování her pro tuto platformu.
11
Komu je kniha určena? Kniha je zacílena především na příležitostné vývojáře her, nikoliv pouze v Javě, ale také v C, protože při vývoji her je kritickým faktorem výkon. O knihu však mohou mít zájem i jiní: Vývojáři z oblasti aplikací pro byznys. Pracujete-li na nativních aplikacích, může vám kniha poslou-
žit jako cenný informační nástroj. Vývojáři vědeckých aplikací. Ve světě vědy také záleží na výkonu. K dosažení vašich cílů vám mohou
pomoci kapitoly o JNI a OpenGL. Studenti informatiky, kteří se rádi seznamují s novými mobilními platformami. Protože Android
je otevřená a dobře přenositelná platforma, může být tato kniha užitečná i studentům bez ohledu na to, s jakou platformou právě pracují. Kdokoli, koho zajímá vývoj v Androidu. Android zabral značný prostor na mobilním trhu s nevída-
nou rychlostí. Je proto žádoucí, abyste rozšířili svou sadu dovedností o hry, abyste udrželi krok s dobou. Jak se říká, kdo chvíli stál, už stojí opodál.
Požadované dovednosti, abyste z knihy vytěžili maximum Mezi požadované dovednosti pro tuto knihu o Androidu patří C/C++ a Java, plus nějaké základy skriptování shellu Linuxu. Java poskytuje elegantní objektově orientovanou výbavu, ale pouze s jazykem C dodáte takový výkon a sílu, jakou si žádá vývoj her.
Solidní základy Androidu V knize se předpokládá, že už znáte základy vývoje pro Android. Například potřebujete vědět, co jsou aktivity (activities), zobrazení (views) a layouty. Pokud pouhým pohledem pochopíte, co dělá následující fragment kódu, můžete být v klidu, jste na tom dobře. public class MainActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }
Tento fragment definuje hlavní aktivitu neboli třídu, která řídí aplikační cyklus. Metoda onCreate se volá pouze jednou, když aplikace startuje, přičemž má za úkol nastavit obsahový layout (neboli grafické uživatelské rozhraní pro aplikaci). Dále byste měli mít základní povědomí o tom, jak se vytváří grafické uživatelské rozhraní (GUI) prostřednictvím XML. Podívejte se na další fragment kódu. Umíte říci, co dělá? <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent"
12 android:layout_height="fill_parent"> <ImageView android:id="@+id/doom_iv" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/doom" android:focusableInTouchMode="true" android:focusable="true"/> <ImageButton android:id="@+id/btn_upleft" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:src="@drawable/img1" /> </RelativeLayout>
Tento kód definuje relativní layout. V relativním layoutu se widgety umisťují relativně vzhledem k ostatním (někdy se překrývají). V tomto případě je zde obrázkové zobrazení (image view), které vyplní celou obrazovku. Toto obrázkové zobrazení zobrazí jako pozadí soubor s názvem doom.png, který je uložen ve složce res/drawable projektu, a bude přijímat klávesové a dotykové události. V levém dolním rohu obrazovky se zobrazí obrázkové tlačítko s ID btn_upleft, které překryje obrázkové zobrazení.
Potřebujete nějaký tutoriál Androidu? S vývojem pro Android je spojeno mnoho různých termínů a samozřejmě není v lidských silách si pamatovat veškeré detaily vztahující se k aktivitám, zobrazením a layoutům. Užitečným místem, kde je možné se rychle dobrat k požadovaným informacím, je tutoriál Androidu. Naleznete jej zde: http://developer.android.com/
Hlavní průvodce pro vývojáře Androidu – nejnovější vydání, stahy, SDK Quick Start, poznámky k verzím, nástroje pro nativní vývoj, a předchozí vydání – najdete na: http://developer.android.com/sdk/1.6_r1/index.html
V průběhu této knihy (zejména v kapitolách, které se týkají nativního kódu) velmi intenzívně využívám nástroje příkazového řádku Android Software Development Kit (SDK), hlavně pro úlohy, které má provádět systémový administrátor. Z tohoto důvodu byste měli dobře rozumět těmto nástrojům, zejména se jedná o Android Debug Bridge (adb). Měli byste vědět, jak: Vytvořit virtuální zařízení Androidu (Android Virtual Device, AVD). AVD zapouzdřuje nastavení pro
specifickou konfiguraci zařízení, jako je verze firmware a cesta k SD kartě. AVD se vytvoří opravdu jednoduše – lze to udělat například z integrovaného vývojového prostředí (IDE) pomocí AVD Managera (dostanete se k němu, když kliknete v toolbaru na ikonu černého telefonu). Vytvořit soubor SD karty. Některé z her probíraných v pozdějších kapitolách zahrnují větší soubory
(5 MB nebo i větší). Aby se ušetřilo místo, kód ukládá všechny soubory hry do zařízení s názvem SD karta a vy musíte vědět, jak se taková karta vytvoří. Chcete-li například ve svém domovském adresáři vytvořit 100 MB soubor SD karty s názvem sdcard.iso, vydejte tento příkaz: $ mksdcard 100M $HOME/sdcard.iso
13 Se připojit k emulátoru. Budete to potřebovat při různých administračních úlohách, jako například při
extrakci knihovny. Shell k zařízení otevřete tímto příkazem: $ adb shell Nahrávat soubory do emulátoru, a jak je dostat z něho ven. Tyto úlohy usnadňují ukládání souborů
hry na zařízení a extrakci těchto souborů ze zařízení. Používejte tyto příkazy: $ adb push <MÍSTNÍ_SOUBOR> <SOUBOR_ZAŘÍZENÍ> $ adb pull < SOUBOR_ZAŘÍZENÍ> < MÍSTNÍ_SOUBOR>
POZNÁMKA Přesvědčte se, zda máte adresář SDK_HOME/tools přidaný do systémové proměnné PATH, než se začnete pokoušet vydávat příkazy, jimiž se vytváří soubor SD karty, připojuje se k emulátoru a nahrávají se soubory do emulátoru (nebo z něho ven).
Základní znalosti o skriptování Linuxu a shellu V kapitolách, které se zabývají hybridními hrami, budete pracovat s linuxovou distribucí Ubuntu, takže oprašte všechny své zaváté staré dovednosti Unixu. Měli byste znát základní příkazy shellu (kam patří příkazy pro výpisy souborů, instalace komponent softwaru) a ovládat základní administraci systému. V této knize je pouze několik jednoduchých skriptů. Budou se vám také hodit základní znalosti bash shellu. TIP Pokud si potřebujete osvěžit své znalosti o Linuxu a o skriptování shellu, zkuste výukový kurz Ashley J.S Millse na adrese http://supportweb.cs.bham.ac.uk/documentation/tutorials/docsystem/build/tutorials/unixscripting/unixscripting.html.
Jaký hardware a software budete potřebovat? Abyste z knihy vytěžili maximum, budete potřebovat nástroje uvedené v této sekci.
PC s Windows nebo Linuxem a s řádně nainstalovaným Java SDK Domnívám se, že to je zřejmá věc, protože většina vývoje pro Android se dělá v Javě. Připomínám, že zmiňuji SDK, nikoli JRE. SDK se požaduje kvůli hlavičkovým souborům JNI a nástrojům příkazového řádku, které budete používat v pozdějších kapitolách.
Řádně nainstalované IDE Eclipse a SDK Androidu Eclipse je de facto IDE vývoje pro Android. Já jsem workspace pro tuto knihu vytvořil v Eclipse Galileo, nicméně stejně dobře by mělo fungovat i Eclipse Ganymede.
14 Potřebujete nějaké vývojové IDE? Přestože jsem workspace pro kód vytvořil s Eclipse Helios, můžete používat své oblíbené IDE. Samozřejmě si to vyžádá trochu přípravných prací navíc. Eclipse získáte z www.eclipse.org. Instrukce, jak nakonfigurovat Android SDK s jinými IDE (kam třeba patří IntelliJ), naleznete na adrese http:// developer.android.com/guide/developing/other-ide.html.
Abyste měli na svém stroji řádně nainstalovaný Android SDK, musíte udělat toto: 1. Nainstalovat zásuvné moduly Android SDK pro Eclipse: Z hlavního menu IDE zvolte Help -> Install New Software. Klikněte na tlačítko Add, abyste přidali nový web (Site), a napište:
Name: Android SDK Location: https://dl-ssl.google.com/android/eclipse/. Klikněte na OK. V dialogu Available Software vyberte Android SK a postupujte podle jednoduchých instalačních
pokynů průvodce. 2. Nainstalujte Android SDK. Můžete si ho stáhnout z webu developer.android.com. Mějte na paměti, že musíte informovat Eclipse, kde máte umístěný Android SDK. Z hlavního menu IDE zvolte Window -> Preferences. Na levé straně vyberte z navigační nabídky Android a zadejte umístění SDK (viz obrázek 2). Já jsem použil SDK 3.1, protože to byla nejnovější verze v době, kdy jsem psal tyto řádky. Kód v této knize však byl otestován s SDK 2.3 a 3.1 (podrobnosti viz sekce o kompatibilitě SDK).
Obrázek 2. Konfigurační dialog Android SDK v Eclipse Indigo.
15
Native Development Kit (NDK) NDK je důležitý nástroj pro každého seriózního vývojáře her. Poskytuje compiler chain, hlavičkové soubory nebo dokumentaci, kterou potřebujete, pokud se chcete se svými špičkovými hrami prosadit v mobilním světě. Když vývojáři používají NDK, mohou se vymanit z pout paměťové haldy Javy, pustit z řetězu svou kreativitu a budovat nejmocnější enginy C/C++, které budou limitovány jen tím, co jim dokáže nabídnout hardware. Protože v této knize budete intenzívně pracovat s NDK, jsou vyžadovány solidní programovací základy v C, abyste mohli plně pochopit pojmy a koncepce prezentované v jednotlivých kapitolách.
Zdrojový kód kapitol Ačkoliv nemusíte pracovat se zdrojovými kódy kapitol, nesmírně vám mohou pomoci pochopit probírané pojmy, jak budete postupovat stále kupředu. Snažil jsem se ze všech sil, aby můj výklad byl v každé kapitole co nejjednodušší, nicméně některé z her (zejména Wolf 3D a Doom) mají velmi rozsáhlé enginy, které jsou napsané v C (100 tisíc řádků pro Doom), které jsou špatně okomentované a poměrně obtížně se chápou. Souhrnně lze ale říci, že uvidíte, jak snadno a s minimálním úsilím lze zkombinovat dva skvělé programovací jazyky (Java a C). Zdrojový kód k této knize si můžete stáhnout odsud: http://zonerpress.cz/download/zrk1214-android.zip
Čím je tato kniha jedinečná? Domnívám se, že je pro čtenáře důležité, aby věděl, jakých cílů jsem chtěl s tímto rukopisem dosáhnout a o čem si myslím, že tuto knihu vyčleňuje z davu. Přestože je Java primárním vývojářským jazykem pro Android, u Google usoudili, že je zapotřebí hybridní vývoj Java/C, pokud se má Android prosadit jako herní platforma – a to natolik, že dokonce vydali Native Development Kit (NDK). Myslím si, že rozhodnutí Google podporovat vývoj v C bylo moudré, protože jinak by hrozilo, že ztratí krok s dobou zaplavenou mnoha nativními hrami napsanými pro jiné mobilní platformy, jako je konkurenční iOS. Hry na PC máme už celá desetiletí (většinou jsou napsané v C), přičemž s pomocí jednoduchého kompilátoru ARM C máte potenciál přinést na platformu Androidu tisíce her provozovaných na PC. A právě tohle je na této knize jedinečné. Proč překládat 100 tisíc řádků příšerně komplikovaného kódu z C do Javy, když můžete jednoduše a elegantně zkombinovat oba jazyky a ušetřit tím spoustu času a peněz? Ano – přesně tohle je mým cílem a tím tato kniha vyniká. Nicméně, abych uspokojil obě skupiny vývojářů (jak příznivce Javy, tak i milovníky C), zařadil jsem do knihy části, kde se věnuji hrám napsaným v Javě.
Co se změnilo od posledního vydání? Vzhledem k vytrvalým aktualizacím Androidu se od posledního vydání této knihy, se pochopitelně několik věcí změnilo. Do těchto změn patří: Aktualizace na nejnovější verze SDK Androidu, Native Development Kit (NKD) a IDE Eclipse. Větší soustředění na tablety. Lidé dychtí po větších obrazovkách a vyšších rozlišeních. Tablety dospíva-
jí, přátelé, a my musíme počítat se stále se měnícími rozlišeními zařízení a specifikacemi hardwaru. Větší soustředění na nativní stranu. Myslím si, že je férové říci, že Java poněkud ztratila na oblibě
u vývojářů 3D her, zejména u těch nejvyspělejších. Hlavními viníky této skutečnosti jsou paměťová omezení Javy a nedostatečný výkon. Proto kniha, kterou držíte v ruce, klade větší důraz na nativní vývoj her a hardwarově akcelerovanou grafiku.
16 Větší a lepší enginy ze skutečného světa. Mým cílem není prostě nabídnout jen pár triků použitelných
při vývoji her, ale poskytnout příklady opravdových, mocných her z jiného světa, než je ten náš. Tato kniha vám ukáže, jak můžete mocné herní enginy, které byly navrženy pro použití na PC (jako jsou Quake I a II), přenést na své mobilní zařízení, a to prakticky bez jakýchkoli změn. Do knihy jsem také zařadil hru Doom z předchozího vydání. Je to sice starší, nicméně stále oblíbený engine.
Kompatibilita SDK Androidu Jakožto vývojáři se asi sami sebe ptáte, jak je to s kompatibilitou kódu v této knize. Je to důležitá otázka, protože nové verze SDK Androidu přicházejí poměrně často. V době, kdy jsem psal tyto řádky, vydal Google Android SDK verze 3.2. Kód v této knize byl plně otestován s SDK Androidu verzí 4.0 a 3.1. Z toho plyne závěr, že kód v této knize poběží v jakékoli verzi SDK, což bylo také jedním z mých záměrů.
Co naleznete v jednotlivých kapitolách? Kapitola 1 Tato kapitola je prvním krokem v přípravě systému pro kompilaci hybridní hry, včetně získání zdroje Androidu, extrakce systémových knihoven zařízení, přípravě vlastního kompilačního nástroje a vlastních kompilačních skriptů. Zahrnuje také informace o přípravě IDE Eclipse pro potřeby zbývajících částí knihy.
Kapitola 2 V kapitole 2 se dozvíte, jak se elegantně zkombinuje kód Javy a C tím, že nad jistou nativní knihovnou vybudujete jednoduchou aplikaci Javy. Dozvíte se o vzrušujících konceptech z nativního rozhraní Javy (Java Native Interface, JNI) a o API, s nímž zkombinujete Javu a C do jediné jednotky. Naučíte se také načítat nativní knihovny, pracovat s klíčovým slovem native a generovat hlavičkové soubory JNI. Zvládnete rovněž taková témata, jako jsou signatury metod, pole Java versus pole C, volání metod Javy, kompilaci a zabalení produktu, a mnoho dalšího.
Kapitola 3 Tato kapitola se zabývá 3D grafikou s OpenGL. Prezentuje zajímavý postup, který umožňuje mixovat dohromady volání API OpenGL v Javě i v C. Toto pojetí se ilustruje na vzorovém příkladu artistických 3D krychlí, který poskytuje Google, abychom předvedli OpenGL ve dvou režimech, režim čisté Javy (pure Java) a hybridní režim. Tento postup otevírá vývojářům nové obzory 3D vývoje pro Android, s potenciálem přenést na tuto platformu spoustu 3D her původně určených pro PC, a to s enormními úsporami času a nákladů na vývoj.
Kapitola 4 V kapitole 4 se popereme s problematikou efektivní práce s grafikou v OpenGL ES 2.0. Kapitola začíná stručným popisem nejdůležitějších schopností, které OpenGL ES 2 nabízí. Patří sem například shadery a jazyk GLSL. Dozvíte se, jak ovlivňují platformu Android. Pak se důkladněji podíváme na GLSL tím, že vytvoříme projekt Androidu, v němž budeme pomocí OpenGL ES 2.0 renderovat dvacetistěn. Jako bonus vám ukážu, jak můžete pomocí funkcionality dotyků a multidotyků měnit rychlost rotace dvacetistěnu. Také si předvedeme, jak přibližovat a oddalovat obraz (zoom in/out) pomocí gesta pinch.
17
Kapitola 5 V kapitole 5 přejdeme o úroveň výš s Doom, legendární hrou pro PC. Doom je pravděpodobně nejskvělejší 3D hra, jaká byla kdy vytvořena, otevřela v 3D grafice nové obzory. Hlavním cílem této kapitoly není popisovat samotnou hru, ale ukázat, jak snadno se přenese nějaká složitá hra pro PC, jako je třeba Doom, na platformu Android. Důkaz? Doom má více než 100 tisíc řádků kódu v C – a do Androidu ji dostanete s méně než 200 řádky volání API JNI navíc, plus s kódem Javy požadovaným pro vybudování mobilního uživatelského rozhraní. Tato kapitola vám ukáže, že nemusíte překládat 100 tisíc řádků C do Javy, ale prostě oddáte tyto dva mocné jazyky do elegantní manželské aplikace. Uvažte, jak velké mohou být potenciální úspory z hlediska času a nákladů na vývoj! Tuto kapitolu si nutně musíte přečíst.
Kapitola 6 Zde začnou být věci opravdu vzrušující. Kapitola 6 přináší klenot 3D stříleček – hru Quake. Dozvíte se, jak je možné s minimálním úsilím přenést mocný engine tohoto kalibru na platformu Android. A to natolik snadno, že 95 procent původního kódu C zůstane netknutých, navíc přidáte jen 500 až 1000 řádků nového, velmi jednoduchého obalového kódu Javy. Začněte hned teď hrát Quake s plnou parádou na svém chytrém telefonu!
Kapitola 7 Tato kapitola staví na kapitole 6, abyste mohli pracovat s enginem hry Quake II. Uvede vás do báječného nástroje zvaného NanoGL, který vývojářům umožňuje překládat složitosti vykreslování v okamžitém módu OpenGL do OpenGL ES, přičemž transparentně udržíte původní kód netknutý. Dozvíte se také, jak zařídit, aby se engine Quake II choval v Androidu řádně, což docílíte tím, že vytvoříte vlastní obsluhy audia a videa, přičemž zároveň předvedeme skvělé schopnosti jazyka Java co do opětovné využitelnosti kódu. Když to shrneme, 99 procent původního kódu C Quake II zůstane netknutých, přibudou tenké obaly Javy z kapitoly 6, které zde opětovně využijeme bez jakýchkoli změn. Sedmá kapitola ukáže, jak jednoduchou kombinací velmi mocných nástrojů zkrotíte a zapřáhnete do svých služeb mohutný renderer Quake II OpenGL. Ověřte si to!
18
123
KAPITOLA 4 Grafika s OpenGL ES 2.0 V předchozí kapitole jste viděli, co může nabídnout OpenGL 1.0. Toto API ale nabízí mnohem více. V této kapitole se podíváme na špici grafického vývoje: na OpenGL ES 2.0, což je podmnožina OpenGL. Začneme stručným popisem nejdůležitějších schopností, které OpenGL ES 2.0 nabízí, mj. shadery a GLSL. Také si řekneme, jaký mají dopad na platformu Android. Pak se důkladněji podíváme na OpenGL ES Shading Language (GLSL) tím, že vytvoříme projekt Androidu pro renderování geometrického obrazce – dvacetistěnu – pomocí OpenGL ES 2.0. Dejme se do toho.
OpenGL ES 2.0 a Android OpenGL ES 2.0 je sada vylepšení pro OpenGL ES 1.0. Klade důraz na programovatelnost trubice 3D grafiky (3D graphics pipeline) a současně na výbavu pro tvorbu shaderů a programových objektů a pro psaní vertexových a fragmentových shaderů v GLSL. OpenGL ES 2.0 poskytuje pro grafické programování následující funkcionalitu: Širší rozsah voleb přesnosti pro použití v zabudovaných (embedded) zařízeních
(pomocí speciálního jazyka podobajícího se desktopovému OpenGL 2.0). Architekturu FBO (Frame Buffer Objects), která zjednodušuje správu povrchu
a nabízí podmnožinu funkcionality z desktopového FBO. Stoprocentní zpětnou kompatibilitu s OpenGL ES 1.x. Je také vybudován v sou-
ladu s nejnovějšími standardy a s nejpokročilejšími ideami, které se vztahují k oblasti grafického vývoje. Platforma Android plně implementuje specifikaci OpenGL ES 2.0. Musíte však uvážit následující úskalí, než při budování svých her začnete tuto technologii používat: OpenGL ES 2.0 se nepodporuje ve všech verzích Androidu. Z toho plyne, že po-
kud se chcete zacílit na co možná nejširší paletu zařízení, měli byste se spokojit s OpenGL ES 1.x. OpenGL ES 2.0 implementuje ty nejbrilantnější nápady a technologie grafické-
ho renderování. Toto ovšem nemusí za všech okolností znamenat, že kód bude lepší nebo poběží rychleji.
124
Kapitola 4 – Grafika s OpenGL ES 2.0
I přes tyto věci OpenGL ES 2.0 poskytuje žádané charakteristiky. Byl například navržen tak, aby snižoval odběr proudu v zabudovaných (embedded) systémech, jako jsou telefony, čímž snižuje úhrnné požadavky vaší hry na napájení, nebo poskytoval efektivnější grafické renderování. Když to shrneme, mít solidní vědomosti o OpenGL ES 2.0 vám rozhodně neuškodí. Představte si, že jste grafický vývojář, který hledá místo v této branži. Úplně první otázka, kterou vám při pohovoru typicky položí, bude, co víte o shaderech a GLSL.
Shadery Shader je jednoduchý program popisující charakteristiky vrcholu (vertex) nebo pixelu. Na nízké úrovni shader definuje sadu softwarových instrukcí, které se použijí k výpočtu renderovacích efektů s vysokým stupněm flexibility. Shadery byly vytvořeny proto, aby nahradily tradiční desktopovou OpenGL pipeline s fixní funkcí (OpenGL fixed-function pipeline), která umožňovala jen běžné geometrické transformace. Oproti tradiční desktopové OpenGL trubici mají tyto přednosti: Pro renderování lze aplikovat přizpůsobitelné efekty. Vyšší stupeň flexibility. Jednoduchost a vyšší stupeň opětovné využitelnosti.
V OpenGL ES 2.0 jsou implementované tři základní typy shaderů: vertexový shader (vertex shader), fragmentový shader (fragment shader) a shader geometrie (geometry shader).
Vertexové shadery Vertexové shadery se spouštějí jednou pro každý vrchol zadaný do GPU a transformují 3D pozici ve virtuálním prostoru na 2D souřadnice pro potřeby renderování na obrazovce. Mohou manipulovat s různými vlastnostmi, jako jsou například pozice, barva a souřadnice textury, nemohou však vytvářet nové vrcholy.
Fragmentové shadery Fragmentové shadery (také se jim říká pixelové shadery) vypočítávají barvu jednotlivých pixelů. Typicky se používají k osvětlování scény a podobným efektům, jako jsou mapování nerovností (bump mapping; technika texturování, která vytváří iluzi nerovnosti povrchu bez změny jeho geometrie) a tónování barev. Často se volají mnohokrát na pixel pro každý objekt nacházející se v odpovídajícím prostoru.
Shadery geometrie Shadery geometrie mohou do sítě (mesh) předávat vrcholy nebo je z ní odstraňovat. Používají se ke generování geometrie nebo pro přidání volumetrického detailu k existujícím sítím, který by byl příliš nákladný, pokud by se zpracovávál prostřednictvím CPU.
GLSL GLSL je akronym pro OpenGL ES 2.0 Shading Language. Je to jazyk pro programování vertexových a fragmentových shaderů, který byl adaptován pro zabudované (embedded) systémy. Jeho účelem je spolupracovat s OpenGL ES 1.1 tak, aby se minimalizoval odběr proudu v zabudovaných zařízeních, jako jsou například chytré telefony.
Vývoj her pro Android – profesionálně
125
Na implementační úrovni tvoří GLSL dva velmi provázané jazyky: jazyk vertexového shaderu (vertex shader) a jazyk fragmentového shaderu (fragment shader).
Jazyk vertexového shaderu (VSL) Ve své nejjednodušší podobě je VSL (Vertex Shader Language) program ve stylu C určený k manipulaci s atributy vrcholu (vertexu). Následující fragment definuje velmi jednoduchý vertexový shader, aby se nastavila renderovací pozice na pozici aktuálního vrcholu. void main(void) { // Tohle je komentář ve stylu C++ /* Tohle je komentář ve stylu C */ gl_Position = gl_Vertex; }
Jak je vidět, shader používá syntaxi ve stylu C s hlavní funkcí, ve které prostě deklarujete instrukce GLSL. V tomto případě jsme použili dvě zabudované proměnné: gl_Position. Nastaví pozici vrcholu, který se má renderovat. gl_Vertex. Obsahuje pozici aktuálně zpracovávaného vrcholu.
Jazyk fragmentového shaderu (FSL) FSL (Fragment Shader Language) se používá ke změně atributů barvy (RGBA) aktuálního pixelu. Následující fragment například nastaví barvu aktuálního pixelu na červenou RGBA (1, 0, 0, 0). void main(void) { gl_FragColor = vec4(1.0, 0.0, 0.0, 0.0); } gl_FragColor je zabudovaná proměnná, se kterou se nastavuje barva aktuálního pixelu. Podobně jako kaž-
dý programovací jazyk, i GLSL poskytuje všechno, co očekáváte od počítačového jazyka, tedy: Proměnné a funkce. Všechny proměnné a funkce se musejí deklarovat dřív, než se použijí. Bázové typy. Patří sem void, bool, int, float, vec2 (dvousložkový vektor v pohyblivé čárce), boo-
lean a další. Obor deklarace. Určuje, kde je deklarace viditelná. Zahrnuje globální a lokální proměnné, jmenné
prostory plus možnost opětovné deklarace v rámci téhož oboru. Kvalifikátory úložiště. Jedná se o kvalifikátory specifikované před typem v čistě tradičním stylu C.
Zahrnují lokální proměnné a konstanty. Jako nové v GLSL máme: attribute. Definuje propojení mezi vertexovým shaderem a OpenGL ES pro data na úrovni jed-
notlivých vrcholů. uniform. Říká, že se hodnota nemění v rámci právě zpracovávaného atomického geometrického
objektu (tzv. "primitive"). Formuje vazbu mezi shaderem, OpenGL ES a aplikací.
126
Kapitola 4 – Grafika s OpenGL ES 2.0 varying. Definuje vazbu mezi vertexovým shaderem a fragmentovým shaderem pro interpolova-
ná data. Kvalifikátory parametrů. Jedná se o kvalifikátory předávané argumentům funkce, zahrnují: in. Parametr se předává do funkce. out. Parametr se předává zpět z funkce, ale neinicializuje se. inout. Parametr se předává do funkce i z funkce. Kvalifikátory přesnosti. Pro přesnost pohyblivé řádové čárky. Zahrnují: highp, mediump a lowp pro
vysokou, střední a nízkou přesnost. Variance a invariantní kvalifikátor. Používají se při obsluze možnosti získávat v různých shaderech
ze stejného výrazu různé hodnoty. Je možné (v samostatných kompilacích), že dva identické shadery nebudou přesně stejné, když běží, a právě pro takové případy existují kvalifikátory (invariant a varying), které tomu mají zabránit, respektive to povolit. Operátory a výrazy. Patří sem všechny běžné operátory a výrazy, jaké očekáváte v typickém progra-
movacím jazyku. Mnohé další mocné schopnosti. Mezi ně patří zabudovaný úhel, trigonometrie, exponenciální, mati-
cové a vektorové funkce, zabudované proměnné a další věci.
Potřebujete pomoci s GLSL? GLSL toho obsahuje opravdu mnoho. Nejlepším zdrojem informací o GLSL je patrně OpenGL Software Development Kit dostupný na www.opengl.org/sdk/docs/manglsl/. Další skvělý zdroj o syntaxi GLSL nabízí Khronos Group na www.khronos.org/files/opengles_shading_language.pdf. Tyto weby vám pomohou dozvědět se víc o schopnostech a syntaxi GLSL. Doporučujeme je prostudovat.
Teď se podíváme, jak se implementuje takový shader a jak se používá v androidovém programu.
Anatomie shaderu Anatomie shaderu je definovaná těmito kroky: 1. Vytvoření programu. Úplně prvním krokem je vytvořit program shaderu, který poběží v hlavním programu – něco jako program v programu, chcete-li. 2. Načtení shaderu. Jakmile shader vytvoříte, musíte ho načíst z řetězcové proměnné nebo ze souboru. 3. Připojení shaderu. Pak musíte shader připojit k hlavnímu programu. 4. Linkování. Tímto krokem kód shaderu zkompilujete a zkontrolujete syntaktické chyby. 5. Nepovinná validace. Vždy je dobrý nápad validovat stav a patřičně obsloužit případné chyby. 6. Zapnutí a používání. Nakonec ho zapnete a aplikujete na sadu vrcholů.
Vytvoření programu shaderu Objekt nebo program shaderu vytvoříme pomocí API volání glCreateShader. Jako parametr přebírá tento typ shaderu: buď GL_VERTEX_SHADER nebo GL_FRAGMENT_SHADER pro vertexový, respektive fragmentový.
Vývoj her pro Android – profesionálně
127
glCreateShader vrací nenulovou hodnotu, se kterou se na něj můžete odkazovat. Následující fragment
kódu vytvoří dva shadery, načte vertexový a fragmentový shader a vykreslí s nimi dvacetistěn (což se popisuje v této kapitole později). int Shader[2] // Vytvoří dva programy shaderů Shader[0] = glCreateShader(GL_VERTEX_SHADER); Shader[1] = glCreateShader(GL_FRAGMENT_SHADER); // Načte vertexový shader: má kód GLSL LoadShader((char *)VertexShader, Shader[0]); // Načte fragmentový shader: FragmentShaderBlue má kód GLSL LoadShader((char *)FragmentShaderBlue, Shader[1]); // Vytvoří program a připojí shadery a atributy int Program = glCreateProgram();
Zařadili jsme také API volání glCreateProgram, které vytvoří prázdný programový objekt a vrátí nenulovou hodnotu, s jejíž pomocí se na něj můžeme odkazovat. Shadery musejí být připojeny k nějakému programu. Toto poskytuje mechanismus ke specifikaci objektů shaderu, které se budou spojovat při vytváření programu. Povšimněte si, že také poskytuje prostředky pro kontrolu kompatibility shaderů, které se použijí k vytvoření programu. Jako další krok načteme shader.
Načtení shaderu V objektu shaderu se udržují řetězce zdrojového kódu definující shader. Pro tento účel můžeme vytvořit načítací funkci, která bude vyvolávat glShaderSource a glCompileShader. glShaderSource jako argumenty převezme ID shaderu, počet prvků, řetězec obsahující zdrojový kód, který se má načíst, a pole délek řetězců (v tomto případě NULL). glCompileShader zkompiluje shader popsaný jeho referenčním ID. Následující fragment popisuje načítací funkci, kterou v nadcházejícím projektu použijeme při kreslení dvacetistěnu. // Jednoduchá funkce vytvářející shader void LoadShader(char *Code, int ID) { // Zkompiluje kód shaderu glShaderSource (ID, 1, (const char **)&Code, NULL); glCompileShader (ID); // Ověří, zda to prošlo int ShaderStatus; glGetShaderiv(ID, GL_COMPILE_STATUS, &ShaderStatus); // Zkontroluje stav kompilace if (ShaderStatus != GL_TRUE) {
128
Kapitola 4 – Grafika s OpenGL ES 2.0
printf("Error: Failed to compile GLSL program\n"); int Len = 1024; char Error[1024]; glGetShaderInfoLog(ID, 1024, &Len, Error); printf("%s\n", Error); exit (-1); } }
Jako bonus můžete také zkontrolovat stav kompilace API voláním glGetShaderiv. Jako argumenty přebírá ID shaderu, dotazovou konstantu (GL_COMPILE_STATUS; v tomto případě chceme zkontrolovat stav kompilace) a stav dotazu. Není-li stav GL_TRUE, dají se kompilační chyby extrahovat voláním glGetShaderInfoLog s ID shaderu a řetězcovým bufferem, který popisuje povahu chyby. Dalším krokem je připojit shader k nějakému programu.
Připojení shaderu Náš shader připojíme k hlavnímu programu API voláním glAttachShader. Jako argumenty přebírá ID programového objektu, k němuž shader připojujeme, a objekt shaderu, který chceme připojit, jak to ostatně předvádí následující fragment kódu: glAttachShader(Program, Shader[0]); glAttachShader(Program, Shader[1]); glBindAttribLocation(Program, 0, "Position"); glBindAttribLocation(Program, 1, "Normal");
Pomocí glBindAttribLocation sdružujeme uživatelsky definovanou atributovou proměnnou v programovém objektu s obecným indexem vertexového atributu. Název uživatelsky definované atributové proměnné se předá v posledním argumentu jako řetězec ukončený znakem null. To vývojáři umožňuje deklarovat v hlavním programu proměnné a vázat je k proměnným v kódu shaderu.
Linkování programu shaderu Abychom mohli shadery používat, musíme linkovat program, který je obsahuje. To zařídíme zavoláním glLinkProgram s referenčním ID programu. V zákulisí OpenGL dojde k vytvoření spustitelné jednotky, která poběží na programovatelném fragmentovém procesoru. // Linkování glLinkProgram(Program);
Získání stavu po linkování Stav linkovací operace (link operation) bude uložen jako část stavu programového objektu. Vždy je dobrý nápad zkontrolovat případné chyby tím, že pomocí glGetProgramiv získáme stav linkování. Je to velmi podobné způsobu, kterým jsme kontrolovali stav kompilace, ale v tomto konkrétním příkladu uvedeme konstantu GL_LINK_STATUS. Následující fragment kódu předvádí, jak se to udělá:
Vývoj her pro Android – profesionálně
129
// Validace naší dosavadní práce int ShaderStatus; glGetProgramiv(Program, GL_LINK_STATUS, &ShaderStatus); if (ShaderStatus != GL_TRUE) { printf("Error: Failed to link GLSL program\n"); int Len = 1024; char Error[1024]; glGetProgramInfoLog(Program, 1024, &Len, Error); printf("%s\n", Error); exit(-1); }
Nepovinné: validace a stav programu Programové objekty byste měli validovat vždycky. Pomáhá to zjistit, zda nemáte v kódu shaderu nějaké syntaktické chyby. Program validujete API voláním glValidateProgram s referenčním ID programu. Pak zavolejte glGetProgramiv s validační konstantou GL_VALIDATE_STATUS. Výsledek validace se vrátí v posledním argumentu (v tomto případě je to ShaderStatus). Pak jednoduše zkontrolujte stav a patřičně obslužte chybu, jak to vidíte v následujícím fragmentu kódu: glValidateProgram(Program); glGetProgramiv(Program, GL_VALIDATE_STATUS, &ShaderStatus); if (ShaderStatus != GL_TRUE) { printf("Error: Failed to validate GLSL program\n"); exit(-1); }
Nakonec shader zapněte a začněte používat.
Zapnutí a použití programu Abyste věci uvedli do chodu, zavoláte nejprve glUseProgram s ID programu, abyste nainstalovali programový objekt jako část aktuálního renderovacího stavu. Programový objekt bude obsahovat spustitelnou jednotku, která poběží na vertexovém procesoru, pokud obsahuje jeden nebo více objektů shaderu typu GL_VERTEX_SHADER, které byly úspěšně zkompilovány a linkovány. // Zapne program glUseProgram (Program); glEnableVertexAttribArray (0); glEnableVertexAttribArray (1);
Vladimir Silva
VÝVOJ HER
pro Android – profesionálně Naučte se vytvářet skvělé hry pro platformu Android.
ZONER software, a.s. významný producent softwaru v oblasti digitální fotografie, počítačové grafiky a multimédií, poskytovatel internetových služeb, souvisejících s prezentací na internetu a e-komercí, a nakladatelství odborné literatury.
Je až k neuvěření, jakého celkového rozmachu dosáhl Android od roku 2008, kdy se objevil úplně první chytrý telefon HTC Dream s tímto systémem. Jeho tvůrci pravděpodobně netušili, že o pouhých pět let později se bude počet zařízení s Androidem rozšiřovat tempem 1,5 milionů aktivací denně a že pro něj bude na Google Play k dispozici více než 700 tisíc různých aplikací (od jednoduchých utilit až po komplexní hry), které byly více než 50miliardkrát staženy. Není vůbec pochyb o tom, že velkému množství vývojářů se otevřely zcela nové obzory, a právě pro ně byla napsána tato kniha. Jak už její název napovídá, primárně se věnuje tvorbě her pro Android. Kniha vám pomůže pochopit nejenom nezbytné koncepty související s vývojem pro Android, ale také prohloubí vaše znalosti ohledně práce s 3D grafikou v OpenGL a OpenGL ES. A až budete mít tato témata, která zabírají první čtyři kapitoly, za sebou, lehce přejdete o úroveň výše a dozvíte se, jak s minimálním úsilím přenést na Android herní legendy ze světa desktopových počítačů – Doom, Quake a Quake II. Z obsahu knihy vybíráme: x Vítejte ve světě malého zeleného robota x Herní triky pro telefony a tablety x Další herní triky s OpenGL a JNI x Grafika s OpenGL ES 2.0
x x x x
3D engine Doom 3D engine Quake 3D engine Quake II Tipy k nasazování aplikací a ke kompilaci
Zdrojové kódy: zonerpress.cz/download/zrk1214-android.zip
novinky
Nechejte nám kontakt na novinky.zonerpress.cz a získáte další bonusy, slevy a jiné výhody.
www.zoner.cz © stockfreeimages.com (10075220)
slevy, akce,
E N C YK LO P E D I E ZO N E R P R E S S Pod tímto logem vycházejí publikace určené pro každého, kdo se zajímá o tvorbu webových stránek. Od ryze praktických příruček a průvodců až po komplexní publikace o všem, co potřebuje webdesignér při každodenní práci. Na vydavatelský plán a výhody, které můžete získat, se informujte na adrese vydavatelství.
DOPORUČENÁ CENA :
389 Kč
KATALOGOVÉ ČÍSLO: ZRK1214
Zoner Press
ISBN 978-80-7413-255-1
tel.: 532 190 883 e-mail: knihy@zoner.cz www.zonerpress.cz ZONER software, a.s., Nové sady 18, 602 00 Brno
9 7 8 8 0 74 13 2 5 51