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 iPhone a iPad Programování pro iOS
Patrick Alessi
Vývoj her pro iPhone a iPad Programování pro iOS
Patrick Alessi
BEGINNING IOS GAME DEVELOPMENT Patrick Alessi Published by Wiley Publishing, Inc., 10475 Crosspoint Boulevard, Indianapolis, IN 46256, www.wiley.com. Copyright © 2012 by Patrick Alessi. © Translation: ZONER software, a.s., 2012. All Rights Reserved. This translation published under license with the original publisher John Wiley & Sons, Inc. Všechna práva vyhrazena. Tento překlad je vydán na základě licenční smlouvy s John Wiley & Sons, Inc.
Vývoj her pro iPhone a iPad – programování pro iOS Autor: Patrick Alessi Copyright © ZONER software, a.s. Vydání první v roce 2012. Všechna práva vyhrazena. Zoner Press Katalogové číslo: ZR1202 ZONER software, a.s. Nové sady 18, 602 00 Brno Překlad: RNDr. Jan Pokorný Redaktor: Miroslav Kučera Technický redaktor: Hana Fruhwirtová Šéfredaktor: Ing. Pavel Kristián DTP: Miroslav Kučera, návrh obálky: Dan Zůda Zdrojové soubory ke knize: http://www.zonerpress.cz/download/ios-vyvoj-her.zip
Informace, které jsou v této knize zveřejněny, mohou být chráněny jako patent. Jména produktů byla uvedena bez záruky jejich volného použití. Při tvorbě textů a vyobrazení postupováno s maximální péčí, ale 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í. Wiley, the Wiley logo, Wrox, the Wrox logo, and Wrox Programmer to Programmer are trademarks or registered trademarks of John Wiley & Sons, Inc. and/or its affiliates, in the United States and other countries, and may not be used without written permission. All other trademarks are the property of their respective owners. The Wrox brand trade dress is a trademark of John Wiley & Sons, Inc. in the United States and/or other countries. Used by permission. Wiley, logo Wiley, Wrox, logo Wrox a označení "Programmer to Programmer" jsou ochranné známky John Wiley & Sons, Inc. a jejich poboček, ve Spojených státech a dalších zemích. Nemohou být použity bez předchozího pisemného povolení. Všechny ostatní ochranné známky jsou majetkem příslušných vlastníků. Značka Wrox je ochrannou známkou John Wiley & Sons, Inc., ve Spojených státech a/nebo v dalších zemích.
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-199-8
Pro Morgan – doufám, že pozorování toho, jak jsem zápolil s obtížnou úlohou a nakonec ji zdolal, tě bude inspirovat k témuž.
O autorovi Patricka Alessiho fascinovalo psaní počítačových programů od chvíle, kdy v roce 1980 poprvé uviděl, jak se jeho jméno mihlo přes terminál. Od té doby píše software s využitím jakéhokoliv jazyka a hardwarové platformy, které se mu dostanou do rukou, včetně krátkého a bolestného výpadu do Fortranu na systému VAX během jeho inženýrských studií. Patrick dosáhnul stupně B. S. (Bachelor of Science) v oboru Civil Engineering na Rutgers University a stupně M. S. (Master of Science) v oboru Computer Science na Stevens Institute of Technology. Co se týče profesní činnosti, Patrick budoval aplikace zaměřené na zpracování dat pro různorodé klienty, od databází pro malé firmy až k rozsáhlým systémům pro USAF (United States Air Force). Vyvinul také řadu systémů běžících v reálném čase, desktopových aplikací náročných na grafiku a samozřejmě i her. V současné době se soustřeďuje na vývoj aplikací a her pro mobilní zařízení, jako jsou iPhone a iPad. Když se Patrick dokáže odtrhnout od počítače, fotografuje, cestuje, hraje hry na svém Xboxu a dělá všechno možné se svou rodinou. Na Twitteru ho najdete jako @pwalessi. Samozřejmě také bloguje, jeho blog naleznete na adrese http://iphonedevsphere.blogspot.com.
O odborném editorovi Michael Gilbert pracuje dlouhá léta jako programátor pro různé strojírenské firmy. Hry začal vyvíjet už pro Atari ST a často přispíval do časopisu STart. V průběhu let vyvíjel herní software pro PC a Mac pro klienty po celém světě. Je také zkušeným programátorem ActionScriptu (Flash) a autorem populárního internetového herního prostředí HigherGames – můžete si jej vyzkoušet na www.highergames.com. Nyní se baví vývojem her pro iPhone a iPad. V AppStore má momentálně čtyři hry (Woridgo, Jumpin’Java, Kings Battlefield a Set Pro HD). Ve svém volném čase, kterého má hodně málo, se snaží porazit svou ženu, Janeen, v přívětivé hře Scrabble. Můžete ho najít na Twitteru pod @mija711.
Poděkování Rád využívám této příležitosti, abych mohl poděkovat všem, kdo se podíleli na vzniku této knihy. Mary Jamesová, moje akviziční editorka, mě vybídla, abych se vrátil k psaní, a pak, když mě přesvědčila, mi pomáhala s rozvojem této knihy. Můj projektový editor, Brian MacDonald, pomáhal usměrňovat proud mých myšlenek tak, aby vznikl použitelný výsledek. Mike Gilbert, můj odborný editor, obětoval mnoho ze svého cenného času, aby zrevidoval mou práci. Chci také poděkovat všem ostatním lidem z redakce a produkce, kteří strávili mnoho hodin na tom, aby tato kniha mohla odejít do tisku. Nejdůležitějšími lidmi v procesu psaní knihy byly moje žena Cheryl a má nevlastní dcera Morgan. Staraly se o všechno nezbytné, když jsem nebyl schopen plnit své ostatní povinnosti, a zajišťovaly, aby život šel normálně dál jako jindy. Snášely také trpělivě mé vrtochy, podivínství a nedostatek času pro zábavné rodinné aktivity, když jsem musel pracovat na knize a věnovat se převážně psaní. Vaše trpělivost se mnou byla opravdu neuvěřitelná! Nakonec chci poděkovat svým rodičům.
5
Stručný obsah Část I – Nástroje pro začátek
15
Kapitola 1
Hry na iOS
17
Kapitola 2
Programovací prostředí Xcode
29
Kapitola 3
Programovací jazyk C
57
Kapitola 4
Programovací jazyk Objective-C
109
Kapitola 5
Framework Cocoa Foundation
153
Část II – Stavební bloky hry
187
Kapitola 6
Kreslení s UIKit a Core Graphics
189
Kapitola 7
Reakce na akce uživatele
237
Kapitola 8
Animování grafiky
271
Kapitola 9
API pro audio: tvorba zvuků v iOS
309
Kapitola 10
Budování síťové hry s GameKitem
355
Dodatek
Odpovědi na cvičení
395
6
Podrobný obsah O autorovi
4
O odborném editorovi
4
Poděkování
4
Úvod
12
Pro koho je publikace určena
12
Co naleznete v této knize
13
Jak je tato kniha strukturovaná
13
Co potřebujete pro práci s touto knihou
13
Konvence
14
Zdrojové soubory
14
Část I – Nástroje pro začátek
15
Kapitola 1
17
Hry na iOS
Jaké atributy má dobrá hra pro iOS?
18
Způsob, jakým se zařízení používá
18
Používejte jedinečné schopnosti iOS
18
Hra má být zábavná
19
Grafika a návrh
20
Rozvíjení prvotního nápadu
20
Zdokumentování hry
20
Prototyp hry
21
Příprava na psaní kódu Frameworky vztahující se ke hrám Cocoa
22 22 23
Kreslení: UIKit a Core Graphics
24
Interakce s uživatelem: Cocoa Touch
25
Animace: Core Animation
25
Zvuk: Core Audio
26
GameKit
27
Shrnutí Co jste se dozvěděli v této kapitole
27 28
7 Kapitola 2
Programovací prostředí Xcode
29
Prostředí pro kódování
30
Vytvoření projektu
30
Navigace po projektu
34
Editování kódu
37
Ladicí nástroje Xcode
44
Přerušování běhu kódu a krokování kódem
44
Dodatečné funkcionality bodu přerušení
47
Budování jednoduchého rozhraní
49
Shrnutí
55
Cvičení
55
Co jste se dozvěděli v této kapitole
56
Kapitola 3
Programovací jazyk C
57
Úvod do jazyka C
57
Proměnné a výrazy
58
Datové typy
58
Operátory
63
Obor
67
Struktury
68
Pole
73
Cykly Cykly for
76 76
Cykly while a do...while
79
Klíčová slova break a continue
86
Rozhodování o toku vykonávání programu
86
Příkaz if
86
Podmínkový operátor
88
Volba jedné z hodnot příkazem switch
89
Členění kódu do funkcí Ukazatele
91 96
Ukázka skutečné karetní hry
100
Shrnutí
106
Cvičení
107
Co jste se naučili v této kapitole?
107
8 Kapitola 4
Programovací jazyk Objective-C
Třídy a objekty
109 109
Instanční proměnné
110
Metody a zprávy
112
Správa paměti
118
Automatické počítání referencí
120
Dědění
121
Budování podtříd ze základní třídy
121
Překrývání metod základní třídy
124
Polymorfismus
126
Budování hry v Objective-C
128
Vystavování dat tříd pomocí vlastností
129
Metody definované na třídě
132
Implementace třídy MindPlayer
133
Vybudování herního cyklu
143
Shrnutí
150
Cvičení
151
Co jste se dozvěděli v této kapitole
151
Kapitola 5
Framework Cocoa Foundation
153
Architektura Model-View-Controller
153
Vaše první hra iOS
154
Budování uživatelského rozhraní
156
Outlety a akce
157
Zpracování textu s NSString
160
Metody třídy NSString
160
Změnitelné a nezměnitelné typy
160
Porovnávání řetězců
161
Kolekce objektů s NSArray
162
Metody NSArray
162
Modifikování polí pomocí NSMutableArray
162
Zabalování čísel s NSNumber
163
Další třídy kolekcí
164
Vybudování modelu hry
173
Periodické události a časovače
178
9 Shrnutí
185
Cvičení
185
Co jste se dozvěděli v této kapitole
186
Část II – Stavební bloky hry Kapitola 6
Kreslení s UIKit a Core Graphics
Úvod do kreslicích frameworků Framework UIKit Framework Core Graphics Kreslicí prostředí
187 189 189 190 191 191
Grafický kontext
192
Souřadnicový systém UIView
192
Metoda drawRect:
193
Kreslení tvarů s UIBezierPath
194
Specifikace barev s UIColor
194
Pokročilé kreslení s Core Graphics
202
Stíny
203
Gradienty
204
Zahájení prací na hře Blocker s BlockView
208
Práce s obrázky
214
Třídy pro obrázky Hierarchie zobrazení
215 215
Animace a časování s CADisplayLink
223
Dokončení hry Blocker
233
Shrnutí
235
Cvičení
235
Co jste se dozvěděli v této kapitole
235
Kapitola 7
Reakce na akce uživatele
Události v iOS
237 237
Událostní architektura
237
Objekty událostí
239
Obsluha vícedotykových událostí
240
Budování jednoduché dotykové hry: Šimon říká
244
10 Reakce na pohyb pomocí akcelerometru
261
Rozpoznávání gest
268
Shrnutí
269
Cvičení
269
Co jste se dozvěděli v této kapitole
269
Kapitola 8
Animování grafiky
271
Animace obrázků s UIImageView
271
Stručný úvod do Core Animation
275
Stručný úvod k anonymním blokům kódu
275
Animování vlastností a přechodů UIView
275
Animování vlastností
276
Animování přechodů
287
Základy Core Animation
297
Rozvržení vrstev
297
Animovatelné vlastnosti
297
Stromy vrstev
304
Shrnutí
307
Cvičení
307
Co jste se dozvěděli v této kapitole
308
Kapitola 9
API pro audio: tvorba zvuků v iOS
309
Přehrávání jednoduchých zvuků se System Sound Services
309
Přehrávání zvuků s frameworkem AV Foundation
311
Třída AVAudioPlayer
311
Stručně k formátu a výkonu
311
Konfigurace audio relace
312
Simultánní přehrávání zvuků
334
Přehrávání zvuků v cyklu
335
Framework Media Player
344
Shrnutí
353
Cvičení
353
Co jste se dozvěděli v této kapitole
354
11 Kapitola 10
Budování síťové hry s GameKitem
Úvod do GameKitu Vyrážíme
355 355 356
Převod hry na síťovou verzi
376
NSData a NSCoding
376
Konverze třídy na data s archivátory
378
Připojování a odesílání dat
378
Otestování síťové verze hry
389
Shrnutí
392
Cvičení
392
Co jste se dozvěděli v této kapitole
393
Dodatek
Odpovědi na cvičení
395
Kapitola 2
395
Kapitola 3
397
Kapitola 4
399
Kapitola 5
401
Kapitola 6
403
Kapitola 7
405
Kapitola 8
406
Kapitola 9
408
Kapitola 10
408
Rejstřík
411
12
Úvod Zařízení se systémem iOS poskytují vývojářům jedinečnou a vzrušující platformu pro výrobu her. iPhone znamená, že hráč má k dispozici malinký počítač, který může neustále nosit v kapse. Zařízení iPad poskytuje obdobné herní zážitky, ale s mnohem větší obrazovkou, s větším výkonem a větším množstvím paměti. Tato zařízení umožňují vytvářet hry s jedinečnými ovládacími schématy díky displeji, který s lehkostí reaguje na dotyky, zabudovanému akcelerometru, nebo dokonce gyroskopu (na nejnovějších zařízeních). Podle vyjádření Scotta Forstalla z celosvětové vývojářské konference Apple z roku 2011 bylo na světě přes 200 miliónů zařízení se systémem iOS. To reprezentuje obrovské publikum pro hry. Například zařízení iPAD se jen v prvních 14 měsících po jeho vydání prodalo přes 25 miliónů kusů. Forstall také řekl, že v AppStore bylo za tři roky staženo celkem 14 miliard aplikací a vývojáři za své úsilí dostali celkem 2,5 miliard dolarů. Podle firem NewZoo a Distimo zabývajících se průzkumem trhu patří právě hry mezi nejrozsáhlejší kategorii na AppStore. Plná polovina všech stahovaných aplikací, ať už zdarma nebo placených, jsou hry, viz http:// www.distimo.com/blog/2011_05_distimo-and-newzoo%C2%A0partner-on-games-data-over-5-million-ios-games-downloaded-per-day-by-63-million-ios-gamers-in-us-eu/. Podle Na-
tional Gamers Survey z března 2011 měla platforma iOS více než 60 miliónů hráčů z USA a Evropy. Jak je z těchto čísel vidět, vytváření her pro platformu iOS má obrovský finanční stimul. Ale nejde jen o peníze. Psát hry je především zábava! Pokud rádi píšete zajímavé programy a s oblibou řešíte všelijaké problémy, určitě vás bude bavit psát hry. Hry jsou také velmi expresivní formou programování. Jakožto programátor zaměstnaný v obrovské firmě si při své každodenní práci někdy připadám, že už nejméně popadesáté vytvářím stejnou třívrstvou databázi nebo webovou aplikaci. U her je to jinak, protože každá je jiná. Se správnými nástroji vyvinete hru prakticky z čehokoli, co si dokážete představit. Apple poskytuje zdarma několik báječných nástrojů pro budování her pro iOS. Například vývojové prostředí Xcode je jedno z nejlepších, v jakém jsem kdy pracoval. Pokud z programátorské praxe znáte Visual Studio, Eclipse nebo nějaké jiné IDE (integrované vývojové prostředí), budete v Xcode hned jako doma. Společnost Apple také vynaložila spoustu úsilí na vytvoření takových API, které by vám usnadnily využití mnoha předností platformy iOS. Jakmile zvládnete základy, budete schopni se chopit kterékoliv stěžejní technologie a pracovat s ní. Tato kniha vám v tomto úsilí pomůže. Ve většině kapitol knihy budete pracovat se skutečnými a fungujícími hrami. Myslím si, že nejlepší způsob, jak se naučit něco nového, je předvést si konkrétní věci a věřím, že při práci s těmito ukázkovými hrami snadněji proniknete do filozofie nástrojů od Apple určených pro budování her.
Pro koho je publikace určena Tato kniha naučí každého, kdo má alespoň nějaké programátorské základy, vytvářet základní hry pro zařízení se systémem iOS, jako jsou iPhone, iPod Touch a iPad. I když tato kniha sice předpokládá, že máte jisté programátorské zkušenosti, věřím, že ji zvládne i čtenář s minimálními zkušenosti s vývojem her, protože byla záměrně koncipována tak, aby se dala použít i jako startovací čára do světa programování her. Jestliže už máte nějaké zkušenosti s Javou, C# nebo jiným objektově orientovaným jazykem, tím lépe. Pokud znáte programovací jazyky C a/nebo Objective-C, můžete klidně přeskočit kapitoly 3 a 4, protože se v nich s největší pravděpodobností nedozvíte vůbec nic nového. V knize se nepřepokládají žádné předchozí zkušenosti s vývojem pro Mac nebo iOS. To byl hlavní faktor, který kladně ovlivnil mé rozhodnutí napsat tuto knihu. Každá kniha o vývoji her pro iOS, se kterou jsem se setkal, předpokládala znalosti základů programování pro iOS. Já to tak nedělám. Začínám vždy od začátku a doprovázím vás celým procesem psaní her pro iOS. Na konci knihy už budete mít vytvořených několik her
13 a budete mít za sebou zkušenosti s několika frameworky, s nimiž se kreslí grafika, vytvářejí animace, pracuje se zvukem nebo zpracovávají vstupy od uživatele. Mějte ale na paměti, že toto je kniha na úrovni "začátečník až mírně pokročilý". Pokud už máte za sebou publikaci desítek her pro iOS, tato kniha vám neposkytne moc nových informací. Abych ji udržel srozumitelnou pro začátečníky, vyhýbal jsem se obtížnějším API. Neprobírám například OpenGL pro realizaci grafiky. Nicméně ale zmiňuji, že tyto pokročilé nástroje existují, vysvětluji jejich smysl a pokouším se navést čtenáře do správného směru, pokud by se rozhodli, že daná pokročilejší technologie bude pro jejich projekt vhodnější. A konečně, kromě toho, že tato kniha měla být inspirující pro vývojáře her, myslím si, že by mohla být užitečná i pro všechny ostatní vývojáře aplikací na iOS. Koneckonců, API pro grafiku, animace, zvuky a vstupy od uživatele jsou dobře použitelná nejenom pro hry, ale i například pro nějakou nudnou databázovou aplikaci. Kdo ví, možná budete schopni ohromit vaše budoucí zákazníky nebo klienty oku lahodící animací, nebo budete schopni přijímat vstupy od uživatelů vaší aplikace takovým způsobem, na který jste se ani neodvážili pomyslet předtím, než jste přečetli tuto knihu.
Co naleznete v této knize Jak už jsem uvedl, toto je kniha na úrovni "začátečník až mírně pokročilý", takže zde probírám všechny technologie, které čtenář potřebuje znát, chce-li se pustit do vývoje her. V první části knihy probírám absolutní základy, které je třeba zvládnout, abyste mohli napsat jakýkoli program iOS, ať už je to hra nebo ne. Proberu integrované vývojové prostředí Xcode, s nímž všichni programátoři iOS, včetně těch u společnosti Apple, píší, ladí a testují své programy. Pak proberu programovací jazyky C a Objective-C, s nimiž budete vytvářet nativní aplikace iOS. Nakonec proberu framework Cocoa Foundation, který poskytuje základní funkcionalitu nezbytnou pro psaní programů iOS. Ve druhé části knihy, poté, co ovládnete základy, proberu nástroje, které budete potřebovat, když se budete chtít pustit do vývoje her. Popíšu několik frameworků od Apple, které poskytují základní funkce nezbytné pro hry. Rozčlenil jsem je do čtyř oblastí: grafika, interakce s uživatelem, animace a samozřejmě zvuk. Až dokončíte tuto druhou část knihy, budete schopni vyvíjet od samého počátku své vlastní hry. Každá kapitola druhé části knihy kromě toho předvádí skutečnou hratelnou hru. Až si tyto příklady prostudujete, budete schopni sami tyto hry vylepšovat a získat tak další zkušenosti. Tyto ukázkové hry můžete chápat jako praktický úvod do světa vývoje her pro platformu iOS.
Jak je tato kniha strukturovaná Knihu jsem uspořádal tak, aby čtenář, který s vývojem pro iOS teprve začíná, mohl s knihou pracovat od samého začátku až do konce. Doporučuji, abyste tuto knihu četli postupně po jednotlivých kapitolách, protože každá z nich staví na pojmech probraných v předchozích částech. Knihu jsem takto uspořádal, abych čtenáři předložil něco jako návod, ne strohou referenční příručku. Knihu můžete samozřejmě využívat, až ji přečtete, i jako referenční příručku k probraným API. Snažil jsem se ji ovšem napsat tak, aby čtenáře nenápadně doprovázela od jednoho tématu k dalšímu. Pokud se naučíte, jak efektivně používat dokumentaci od Apple, budete mít rázem úžasnou referenční základnu. Já ale usiluji o to, abych byl vaším průvodcem po různých API.
Co potřebujete pro práci s touto knihou Abyste mohli budovat aplikace pro iOS, potřebujete počítač Apple s Mac OS X. Kromě toho budete muset nainstalovat vývojové prostředí Xcode. Xcode 4 si můžete stáhnout zdarma z Mac AppStore.
14 Zamýšlíte-li provozovat své hry na zařízeních, jako jsou iPhone nebo iPad, a nechcete spouštět svůj kód v simulátoru iPhone, je potřeba, abyste se zapojili do vývojářského programu iOS. V době, kdy jsem psal tyto řádky, stálo zapojení do tohoto programu ročně 99 dolarů a opravňovalo vás budovat a spouštět programy na vašem zařízení a odesílat vaše dokončené aplikace do AppStore společnosti Apple k prodeji. Pokud doposud neparticipujete na tomto vývojářském programu, nedělejte si žádné starosti. Téměř všechno, co je popisováno v této knize, bude fungovat správně v iOS simulátoru. Pokud se ale objeví něco, co bude potřeba spustit na fyzickém zařízení se systémem iOS, náležitě na to upozorním v textu.
Konvence V knize pro větší přehlednost používám několik následujících konvencí. VYZKOUŠEJTE Oddíl "Vyzkoušejte" je praktické cvičení, které rozhodně doporučujeme projít poté, co dočtete k němu se vztahující text.
1. Obvykle jde o sadu kroků. 2. Každý krok je očíslovaný. 3. Kroky reprodukujte ve své vlastní instanci programu Xcode.
"Jak to funguje" Za každým oddílem "Vyzkoušejte" se podrobně vysvětluje kód, který jste před chvíli napsali. Pokud jde o styly v textu: Klávesové zkraty uvádíme takto: Ctrl+A. Názvy souborů, URL a kód v textu vypadají takto: persistence.properties.
Samotný zdrojový kód prezentujeme dvojím způsobem: U většiny příkladů kódu používáme neproporcionální písmo bez zvýraznění. Tučně zvýrazňujeme kód, který je v aktuálním kontextu obzvlášť důležitý.
Zdrojové soubory Protože tato kniha je určena především programátorům a vývojářům, je logické, že obsahuje spoustu výpisů zdrojového kódu. Tento kód ale nemá smysl přepisovat ručně – místo toho si stáhněte ZIP archiv, který obsahuje veškerý zdrojový kód příkladů použitých v této knize. Stahujte jej z následující URL adresy: http://www.zonerpress.cz/download/ios-vyvoj-her.zip
Velikost tohoto souboru ke stažení je 7,4 MB.
15
ČÁST I Nástroje pro začátek Kapitola 1
Hry na iOS
Kapitola 2
Programovací prostředí Xcode
Kapitola 3
Programovací jazyk C
Kapitola 4
Programovací jazyk Objective-C
Kapitola 5
Framework Cocoa Foundation
16
17
KAPITOLA 1 Hry na iOS Stručný přehled kapitoly: Dozvíte se o jedinečných schopnostech her na iOS. Rady, jak zdokumentovat a rozvinout své nápady. Vytvoření prototypu a příprava vaší hry tak, abyste mohli začít psát její kód. Přehled o frameworcích v iOS, které se vztahují k hrám.
Protože jste si obstarali tuto knihu a začali ji číst, téměř určitě vás zajímá, jak psát hry pro iOS. Proč byste měli mít chuť napsat nějakou hru? Existuje několik skvělých důvodů, proč psát hry pro iOS, zaprvé a především proto, že psát hry je neobyčejně zábavné! Ve hře se můžete zcela odpoutat od všech svazujících omezení reality. Ve své hře totiž určujete pravidla vy a nikdo jiný. Obzvlášť poutavé může být psaní her pro iOS díky úžasným schopnostem zařízení. Vaše hra může využívat navigaci s GPS, kameru, akcelerometr, nebo dokonce gyroskop. Psát hry pro iOS může být také zajímavé finančně. Tím, že jsou zařízení s iOS všudypřítomná, mohou hrát vaši hru miliony lidí. A navíc, protože budete distribuovat svou hru v AppStore společnosti Apple, nebudete se muset starat o přípravu vlastní výkladní skříně, abyste mohli distribuovat své výtvory. V lednu 2011 vydala společnost Apple seznam nejlépe se prodávajících aplikací na AppStore: Doodle Jump Tap Tap Revenge 3 Pocket God Angry Birds Tap Tap Revenge 2.6 Bejeweled 2 + Blitz Traffic Rush Tap Tap Revenge Classic AppBox Pro Alarm Flight Control
Poznamenejme, že devět z těchto deseti nejlépe se prodávajících aplikací všech dob pro platformu iOS jsou hry. Z tohoto důvodu bude dobré, když se rozhodnete investovat
18
Kapitola 1 – Hry na iOS
svůj drahocenný čas takovým způsobem, aby se z vás stal(a) vývojář(ka) her iOS. Než se ovšem začnete starat o to, jak utratit miliony dolarů vyplacených z AppStore, je potřeba, abyste si uvědomili, že nestačí prostě jen napsat nějakou hru pro iOS – budete muset napsat hodně dobrou hru.
Jaké atributy má dobrá hra pro iOS? Pokud máte v úmyslu stát se vývojářem her iOS, první otázka, kterou byste si měli položit, zní takto: "Jaké atributy by měla mít dobrá hra pro iOS – čím se taková hra vyznačuje?" V této sekci se vám pokusím předložit několik věcí, které byste měli mít na zřeteli, až se pustíte do navrhování vlastní hry.
Způsob, jakým se zařízení používá Až začnete formulovat nápady týkající se vaší iOS hry, musíte brát v úvahu několik věcí. První z nich je, jakým způsobem lidé používají různá zařízení iOS. Druhou z nich je způsob, jakým tato zařízení používají. A třetí se vztahuje ke způsobu, jakým hrají hry. Podívejme se na ale nejprodávanější aplikace pro iOS z jiného hlediska. Každou z nich můžete zařadit do kategorie tzv. příležitostných her. Na seznamu nejsou žádné sto hodin trvající RPG (Role Playing Game; hry, v nichž hráči zaujímají role fiktivních postav) nebo akční FPS (First Person Shooters; střílečky, v nichž vy sami jste aktérem). Všechny hry ve výše uvedeném seznamu snadno zvládnou i ti, kdo se snaží hrát vůbec poprvé, což jsou často malé děti. A dále – do všech těchto her rychle a snadno vpadnete, stejně jako z nich můžete rychle a snadno vypadnout. Přemýšlejte o tom, jak lidé hrají hry nebo pracují s jinými aplikacemi na mobilním zařízení. Když vezmete do ruky chytrý telefon, abyste si něco zahráli nebo něco dělali s adresářem, kalendářem nebo textovými zprávami, chcete se co nejrychleji dostat k dané aplikaci a k tomu, co v ní chcete dělat. Mobilní uživatelé nemívají času nazbyt, rozhodně ne na to, aby se prokousávali všelijakými schopnostmi, které obvykle poskytuje plnohodnotná desktopová aplikace. Totéž platí pro hry. Nejúspěšnější hry pro iOS jsou v současnosti ty, které jsou jednoduché, mají snadno zvládnutelná pravidla a obsahují krátké levely, aby se jimi hráč mohl téměř ihned, během několika málo minut, zabavit. Ačkoliv se to později může změnit, až se z iPadu stane rozšířenější herní platforma, aktuálně doporučujeme, aby vaše hra (pokud má mít předpoklady stát se úspěšnou) byla založena na krátkých levelech a jednoduchých pravidlech.
Používejte jedinečné schopnosti iOS Když navrhujete svou hru pro iOS, měli byste vzít v úvahu ještě několik dalších faktorů – například to, jak bude hráč hru ovládat a jak byste mohli využít předností pokročilých funkcí zařízení iOS. Nejúspěšnější hry na iOS mají velmi jednoduchá ovládací schémata. Na zařízení se systémem iOS nemáte k dispozici žádná fyzická tlačítka. Z toho plyne, že hra, která bude vyžadovat nějaký takový ovladač (jako má třeba Xbox 360) s tucty tlačítek, rozhodně nebude pro iOS to pravé ořechové. Ovládací schéma musí být jednoduché. Ovládání nejúspěšnějších her poskytuje hráči přímou interakci se samotnými prvky dané hry bez použití nějakého zprostředkovatelského ovladače, jako je třeba D-pad nebo joystick. Tento bod je ostatně poměrně jasně formulován i v HIG (Human Interface Guidelines) a my doporučujeme, abyste si tyto směrnice pečlivě přečetli. HIG najdete na http://developer.apple.com/library/ios/#DOCUMENTATION/ UserExperience/Conceptual/MobileHIG/Introduction/Introduction.html.
Vývoj her pro iPhone a iPad – programování pro iOS
19
Pro rychlé vtáhnutí hráče do hry můžete využít funkcionalitu přímého dotykového ovládání, kterou zařízení se systémem iOS nabízí. Když například hráči dovolíte, aby hru ovládal tak, že bude v přímé interakci s různými jejími prvky, bude se cítit více vtažen do hry. Zvažte třeba, zda byste se neměli pustit do nějaké deskové hry, jako jsou třeba šachy. Pro hráče je mnohem intuitivnější, když může sám posunovat figurkami, než když jimi musí hýbat zprostředkovaně, s využitím nějakého obrazovkového joysticku a virtuálních tlačítek. K tomu, aby byla hra ještě poutavější, můžete využít i další schopnosti zařízení s iOS. Všechna zařízení iOS například obsahují akcelerometr, jímž můžete určit orientaci zařízení. Uvažujte o tom, jak byste jím mohli vylepšit ovládání své hry. Představte si třeba hru, kterou hráč ovládá nakláněním zařízení. To, jak se buduje takový typ hry, se dozvíte v této knize později. Takový typ ovládání v podstatě umožňuje zakomponovat do imaginárního světa hry fyzický svět hráče. Další všeobecně dostupnou schopností je GPS. Popřemýšlejte, jak byste mohli zakomponovat do své hry zeměpisnou polohu (tj. místo, kde se hráč právě nachází.) Možná byste mohli vybudovat hru, která bude hráči přidělovat nějaké body za to, že dorazí na jistá místa. Nebo můžete určit, že pokud se bude hráč nacházet na nějakém konkrétním místě, může zde získat nějakou speciální zbraň.
Hra má být zábavná Hra musí být zábavná – a tohle musí být vaše nejdůležitější úvaha při jejím navrhování. Pokud není hra zábavná, nikdo ji nebude chtít hrát. Mějte na paměti, že hru budete mnohokrát hrát sami už při jejím vývoji. Pokud nebude hra zábavná, nebudete se v průběhu vývojového procesu bavit a to se do hry samotné určitě promítne. Popřemýšlejte o tom, co dělá hry zábavnými a zařazujte do nich takové věci. Uvědomte si ale, že různí lidé považují za zábavné různé věci a vaše představa zábavy nemusí odpovídat tomu, co za zábavné považují jiní lidé. Rozhodně pomůže, když v průběhu vývojového procesu poskytnete hru na vyzkoušení co nejvíce lidem. Tito testeři vám často poskytnou cenné rady či dojmy, které pak budete moci využít a hru vylepšit. Hra by také měla být snadno pochopitelná. Noví hráči často obtížně pronikají do her, které mají nesnadno pochopitelná pravidla, takže o ni mohou velmi rychle ztratit zájem. A vy přece nechcete, aby hráče něco odrazovalo od vaší hry. Proto navrhněte dostatečně jednoduchá pravidla, aby je hráč okamžitě pochopil. Pokud musíte napsat deset stránek nápovědy, abyste vysvětlili pravidla své hry, asi je pro mobilní zařízení příliš složitá. Pokud se přesto rozhodnete vytvořit nějakou složitou hru, počítejte s tím, že byste měli hráčům poskytnout nějaký výukový kurz či názorný návod. Hráči jsou mnohem ochotnější projít si nějakou ukázkovou partii hry než se otravovat s nudným čtením nějakého dokumentu jen proto, aby se naučili její pravidla. Pak vybalancujte svou hru tak, aby představovala pro hráče nějakou výzvu. Žádného člověka nebaví hrát, když je příliš triviální vyhrát. Nicméně nikoho nebaví ani hra, která je natolik obtížná, že ji prakticky nikdy nevyhraje. Jakožto tvůrce hry byste ji tedy měli vyvážit tak, aby představovala pro hráče jistou výzvu, ale ne takovou, kterou bude jen velmi obtížné zdolat, protože to odrazuje hráče od hraní. Dosáhnete toho třeba tak, že v průběhu vývojového cyklu budete hru často hrát. V logických hrách typu puzzle se ale používá jiná technika, která je založena na tom, že se začíná zvolna, se snadnými levely, přičemž hráč se postupně propracovává k obtížnějším. Hráč tím získává praxi a cit pro hru, což obojí později využije ve složitějších levelech. A konečně – odměňujte hráče. Když hráč dosáhne ve hře něčeho, co stojí za povšimnutí, odměňte ho. Třeba nějakou vtipnou animovanou příhodou. S využitím různých API GameKitu můžete odměňovat i dosažené výsledky (achievements), kterých hráč ve hře dosáhl. Nezapomeňte na různé žebříčky a herní statistiky (Game Center Leader Boards), kterými můžete podněcovat soutěživost mezi jednotlivými hráči vaší hry. Každopádně, nejdůležitější je, aby vývoj hry bavil především vás. Pokud hra nebaví vás, patrně nebude bavit ani hráče, pro které je určena. Nechte v návrhu hry projevit svůj entuziazmus a vzrušení.
20
Kapitola 1 – Hry na iOS
Grafika a návrh Nepodceňujte význam grafiky ve své hře. Například nádherná ikona může být to jediné, co potenciální kupec vidí z vaší hry v AppStore. Plánujete-li svou hru prodávat v AppStore, obětujte čas nebo peníze na vývoj půvabné ikony své hry. Kromě ikony věnujte pečlivou pozornost grafice a motivu své hry. Pěkná grafika může znamenat rozdíl mezi úspěchem a propadem na AppStore. Na AppStore je k dispozici mnoho her založených na fyzické destrukci: mezi nimi s převahou vede hra Angry Birds ("Naštvaní ptáci"), protože právě grafický návrh ptáků a prasat je to, čím se Angry Birds zřetelně vymezuje oproti svým konkurentům. Ačkoliv samotný herní styl se nijak zvlášť neliší od mnoha jiných her tohoto žánru, zvířátka v Angry Birds opravdu vyčnívají z davu. Já bohužel nejsem grafik, takže si určitě povšimnete, že grafická kvalita her popisovaných v této knize je podprůměrná. Nicméně slouží jen pro instruktážní potřeby, takže věřím, že to nebude vadit. Pokud jsou ale vaše grafické dovednosti natolik chabé jako ty moje a vaším záměrem je hru prodávat a vydělat na ní, uděláte jen dobře, když si najmete nějakého profesionála, který si poradí s grafikou hry.
Rozvíjení prvotního nápadu Poté, co se vám v hlavě vynořila myšlenka na novou hru, měli byste ji dále propracovávat. V této fázi byste neměli přemýšlet o tom, jak své nápady vlastně převedete do kódu. Měli byste se soustředit na to, o čem hra bude a co se v ní bude dít – nikoliv na to, jak ji naprogramujete.
Zdokumentování hry Prvním krokem je vytvořit koncept hry, kterou hodláte napsat. Je mi jasné, že vám to připadá jako zbytečná "úředničina", ale specifikace, které v této fázi vytvoříte, vás budou doprovázet celým vývojovým procesem. Tento krok je důležitý zejména tehdy, pokud hru vyvíjíte pro nějakého zákazníka, ne pro sebe, protože v takovém případě může specifikace posloužit jako druh smlouvy mezi vámi a vaším zákazníkem. A na jejím základě bude možné měřit zdar vašeho úsilí a vyhodnocovat, jak daleko jste se při tvorbě hry dostali. Práce na specifikaci byste měli odstartovat výrokem, který bude definovat celou aplikaci. Měla by to být jediná věta, která bude výstižně popisovat, o čem daná hra vlastně je a na jaké publikum se zaměřuje. Měla by vás doprovázet při všech rozhodnutích, která budete činit v průběhu vývojového procesu. V této sekci kapitoly vás stručně provedu procesem vytvoření specifikace pro šachy určené začátečníkům. Dobrým výrokem definujícím tuto aplikaci by například mohlo být něco jako toto: "Účelem projektu je implementovat šachy s funkcemi určenými začátečníkům pro vysvětlení základních pravidel této hry." Jakmile máte sestavenou definici aplikace, můžete začít vymýšlet funkce, které hodláte ve hře implementovat. K tomu můžete přistoupit různými způsoby – můžete vytvořit oficiální dokument nebo prostě jen sepsat jejich seznam. Pro šachy určené začátečníkům by seznam funkcí mohl vypadat takto: Implementovat správná šachová pravidla. Poskytnout hráčům možnost vracet tahy. Dát hráči možnost zeptat se počítače, jaké další tahy by doporučil. Zobrazit hráči platné tahy pro jakoukoli vybranou figurku. Vybudovat počítačového protivníka, který se bude umět adaptovat na herní úroveň hráče.
271
KAPITOLA 8 Animování grafiky Stručný přehled kapitoly: Animování posloupnosti obrázků s UIImageView. Základy práce s Core Animation. Práce s bloky Objective-C. Animování zobrazení UIView. Používání vrstvy Core Animation. Ukázková hra předvádějící animování vlastností a přechodů.
Jedním z nejdůležitějších aspektů prakticky jakékoliv hry je animace. V knize jste se už dříve dozvěděli, jak se pomocí třídy CADisplayLink animují hry na základě obnovovací frekvence displeje (display refresh rate). Pomocí této třídy jste aktualizovali pozici objektů ve hře na základě doby, která uplynula od poslední aktualizace displeje. V této kapitole prozkoumáte dvě další animační techniky. Nejprve se společně podíváme na animování jednotlivých spritů pomocí třídy UIImageView. Možná si ještě vzpomenete, že jste pomocí zobrazení UIImageView zobrazovali míček a pálku ve hře na rozbíjení cihel, Blocker. S třídou UIImageView můžete ale animovat nejenom statické obrázky, ale také sérii obrázků. Jednoduše jí dodáte pole obrázků, nakonfigurujete dobu trvání animace a řeknete jí, aby začala animovat. Toto zobrazení pak zobrazuje jednotlivé obrázky z pole tak, aby se během specifikované doby trvání animace postupně zobrazily všechny obrázky. Poté, co skončíte s UIImageView, soustředíte svou pozornost na práci s Core Animation. Pomocí tohoto API můžete budovat velmi složité animace. S Core Animation můžete animovat tak, že měníte mnoho vlastností zobrazení a/nebo animujete přechod mezi zobrazeními.
Animace obrázků s UIImageView Jak si snad ještě pamatujete z kapitoly 6, pomocí tříd UIImage a UIImageView můžete ve svých hrách zobrazovat obrázky nebo sprity. UIImageView můžete ale používat i jinak. Můžete třeba do UIImageView načíst posloupnost obrázků a díky tomu, že je
Kapitola 8 – Animování grafiky
272
zobrazujete postupně, vytvoříte animaci. Pro potřeby úvodního příkladu této kapitoly jsem vytvořil 10 obrázků primitivního ciferníku s jedinou ručičkou, máte je všechny na obrázku 8-1.
Obrázek 8-1. Jednotlivé obrázky ciferníku pro animaci. První obrázek jsem vytvořil s ručičkou ukazující na 12 hodin. Rozhodl jsem se, že budu animovat jen deset snímků, abych měl počet souborů co nejmenší. Pak jsem vždy ručičku natočil o 36 stupňů (360 stupňů děleno deseti snímky) a obrázek uložil. Pokračoval jsem, dokud ručička neoběhla celý ciferník, takže jsem nakonec měl uloženo deset obrázků. Chcete-li k animaci použít UIImageView, je potřeba načíst obrázky do pole a nastavit vlastnost animationImages obrázkového zobrazení tak, aby ukazovala na toto pole. Dobu trvání animace v sekundách nastavíte vlastností animationDuration. Vlastností animationRepeatCount můžete také specifikovat, kolikrát se má animace opakovat. Výchozí hodnota vlastnosti animationRepeatCount je nula, což vyjadřuje, že animace bude pokračovat tak dlouho, dokud ji nezastavíte. Jakmile máte zobrazení UIImageView nakonfigurované s obrázky, které má zobrazovat, odstartujete animaci tím, že mu odešlete zprávu startAnimating. Animaci můžete zastavit tak, že mu odešlete zprávu stopAnimating. A konečně, vlastností isAnimating můžete kontrolovat, zda v zobrazení běží nějaká animace. VYZKOUŠEJTE
Animování obrázků. Soubor kódu ImageAnimation si můžete stáhnout na zonerpress.cz.
V tomto příkladu budete pomocí třídy UIImageView animovat rotaci ručičky hodin po ciferníku. 1. Spusťte Xcode a vyberte File -> New -> New Project. 2. Objeví se dobře známý dialog s šablonami pro různé typy aplikací, které můžete vytvářet pro iPhone a Mac OS X. Vyberte v dialogu Single View Application a klikněte na Next. 3. Do textového pole Product Name napište název svého projektu, ImageAnimation. Odškrtněte políčka "Use Storyboard" a "Include Unit Tests". Zkontrolujte, zda je zaškrtnuté políčko "Use Automatic Reference Counting". Z rozevíracího seznamu Device Family vyberte "iPhone". Klikněte na Next. 4. Vyberte umístění pro svůj projekt a klikněte na tlačítko Create. Xcode vytvoří projekt a předloží vám okno projektu. 5. Vytvořte novou skupinu souborů, kde budete mít obrázky, které chcete animovat. Z menu vyberte File -> New -> New Group. Pojmenujte novou skupinu Images. 6. Z menu vyberte File -> Add files to ImageAnimation a přidejte soubory obrázků do složky Images. Obrázky pro tento projekt si můžete stáhnout z webu zonerpress.cz. 7. Otevřete implementační soubor ViewController.m. Do metody viewDidLoad přidejte pod řádek, který volá implementaci viewDidLoad ze supertřídy ([super viewDidLoad];), tento kód: // Připraví obrázkové zobrazení
Vývoj her pro iPhone a iPad – programování pro iOS
273
UIImageView* animatedImages = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 100, 100)]; [self.view addSubview:animatedImages]; // Načte obrázky do pole NSMutableArray *imageArray = [[NSMutableArray alloc] initWithCapacity:10]; NSString* fileName; // Dynamicky buduje názvy souborů for (int i=1; i<=10; i++) { fileName = [NSString stringWithFormat: @"Clock%i.png",i]; [imageArray addObject:[UIImage imageNamed:fileName]]; } // Nakonfiguruje animaci animatedImages.animationImages = imageArray; animatedImages.animationDuration = 1; // Odstartuje animaci [animatedImages startAnimating];
8. Sestavte a spusťte program. Měli byste uvidět v levém horním rohu obrazovky ciferník hodin s otáčející se ručičkou, jako na obrázku 8-2.
Obrázek 8-2. Běžící aplikace ImageAnimation.
274
Kapitola 8 – Animování grafiky
Jak to funguje Nejprve jste vytvořili instanci třídy UIImageView a nastavili její pozici. Funkcí CGRectMake jste vytvořili obdélník a předali ho jako rám obrázku: UIImageView* animatedImages = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10,100, 100)];
Obdélník, který jste vytvořili, měl levý horní roh (10,10) a výšku a šířku 100 pixelů. Pak jste zobrazení UIImageView, které jste právě vytvořili, přidali do zobrazení kontroléru zobrazení jako podzobrazení: [self.view addSubview:animatedImages];
Pak jste se pustili do konfigurace svého podzobrazení pro potřeby animace. Prvním krokem bylo načíst do pole obrázky určené pro animaci. Protože jste načítali obrázky do pole za pochodu, bylo třeba použít NSMutableArray: NSMutableArray *imageArray = [[NSMutableArray alloc] initWithCapacity:10];
Vzpomeňte si, že NSArray je nezměnitelné, takže jakmile byste takové pole vytvořili, nemohli byste je modifikovat. Můžete však bez omezení přidávat prvky do NSMutableArray nebo z něho prvky odstraňovat. Pak jste deklarovali NSString, v němž budete mít název souboru obrázku, který se chystáte načíst do pole: NSString* fileName;
Já jsem soubory účelově pojmenoval pomocí pořadových čísel, aby se daly snadno načítat za běhu v cyklu. Následující blok kódu cykluje přes obrázky, dynamicky sestaví název souboru obrázku, vytvoří objekt UIImage a přidá ho do pole. Nejprve jste nastartovali cyklus: for (int i=1; i<=10; i++) {
Pak jste sestavili název souboru metodou stringWithFormat. Zde sestavujete název podle vzoru Clock%i. png, kde se do řetězce místo %i vloží hodnota čítače: fileName = [NSString stringWithFormat: @"Clock%i.png",i];
Pak jste zavolali metodu addObject pole NSMutableArray, abyste obrázek přidali do pole. Obrázek jste vytvořili pomocí názvu souboru, který jste předtím vygenerovali: [imageArray addObject:[UIImage imageNamed:fileName]];
Jakmile jste načetli do pole všechny obrázky, nakonfigurovali jste parametry animace. Nejprve jste nastavili, které pole se bude v animaci používat: animatedImages.animationImages = imageArray;
Pak jste animaci nakonfigurovali tak, aby se všechny obrázky ze zadaného pole prošly za jednu sekundu: animatedImages.animationDuration = 1;
Pohrajte si s dobou trvání animace, abyste viděli, jak bude animace vypadat, když poběží pomaleji nebo rychleji. Nakonec jste animaci odstartovali: [animatedImages startAnimating];
Vývoj her pro iPhone a iPad – programování pro iOS
275
Stručný úvod do Core Animation Core Animation, což je část frameworku Quartz Core, je alfou a omegou pro animace, které vidíte v uživatelském rozhraní iPhone. Příkladem takové animace je třeba situace, kdy jste v nějaké aplikaci a stisknete tlačítko Home. Aplikace mizí v dálavách a na obrazovku se vrací vaše domovská obrazovka. Pomocí Core Animation se snadno vytvářejí animace tím, že se mění různé vlastnosti animovatelných objektů. Patří mezi ně UIView a CALayer. Core Animation deleguje práce nezbytné pro vykonávání animací na sekundární vlákno. To znamená, že hlavní vlákno programu může nerušeně pokračovat v běhu a vstřícně reagovat na akce uživatele i v době, kdy běží nějaká animace. Modifikujete-li nějakou animovatelnou vlastnost v době, kdy už běží nějaká animace, Core Animation nastartuje tuto animaci z aktuálního bodu v běžící animaci. Pomocí Core Animation se snadno vytvářejí i velmi složité animace. Ve zbývající části této kapitoly prozkoumáte, jak se pracuje s Core Animation. Nejprve se naučíte používat Core Animation nepřímo, budete animovat některé vlastnosti UIView. Pak vybudujete variantu hry Pexeso, kde využijete Core Animation se zobrazeními UIView. Pak proniknete ještě hlouběji a naučíte se pracovat s vrstvami Core Animation, abyste dokázali vytvářet takové animace, jakých nelze docílit s animačními metodami UIView.
Stručný úvod k anonymním blokům kódu Než si ale začnete prohlížet kód dalších animací, musíte porozumět jedné (doposud ne standardizované) schopnosti jazyka C, díky níž je možné v kódu definovat tzv. inline funkci a předávat ji jako proměnnou. V této knize se této schopnosti říká bloky (blocks), v jiných jazycích se používá termín uzávěry (closures), lambda funkce (lambda functions) nebo anonymní funkce (anonymous functions). Bloky jsou v Core Animation velmi důležité, protože jimi říkáte animačnímu jádru, co má dělat během animace. Blokem se v tomto kontextu rozumí anonymní neboli nepojmenovaný blok kódu. V definici bloku můžete specifikovat návratový typ a argumenty jako u libovolné jiné funkce. Bloky běží v tom oboru, v jakém jste je definovali, takže mají přístup ke všem vašim lokálním proměnným. Blokové proměnné a bloky samotné se definují operátorem stříška (^). Kód bloku je obsažen uvnitř složených závorek ({}) jako libovolná jiná funkce C či Objective-C. Ve většině případů, včetně příkladů v této kapitole, není nutné explicitně vytvářet blokovou proměnnou. Bloky prostě píšete přímo ve svém kódu (neboli inline), jak to ostatně sami uvidíte v nadcházejícím příkladu. Ohledně bloků si momentálně zapamatujte především to, že to jsou anonymní fragmenty (anonymous snippets) kódu, které lze předávat jako proměnné.
Animování vlastností a přechodů UIView Z diskuse, kterou jsme v kapitole 6 vedli o kreslení, si možná ještě pamatujete, že mezi Core Graphics a UIKit je jistý specifický vztah. UIKit je nadstavbou Core Graphics, poskytuje jednoduché API pro většinu běžných operací. Například pro kreslení cest jste používali třídu UIBezierPath UIKitu a nekreslili jste je přímo s Core Graphics. Obdobný vztah je také mezi Core Animation a UIKit.
276
Kapitola 8 – Animování grafiky
Jsou jisté druhy animací, které se v programování pro iOS vyskytují velmi běžně. Abyste nemuseli pronikat hluboko do Core Animation, když chcete realizovat takové animace, společnost Apple se vám snaží usnadnit život poskytnutím přístupu k některým schopnostem Core Animation v třídách UIKit. Konkrétně, třída UIView má podporu pro dva typy animací, takže pokud s ní vystačíte, nemusíte vědět o Core Animation vůbec nic. S UIView můžete realizovat dva typy animací: animování vlastností a přechodů.
Animování vlastností Core Animation vám umožňuje animovat změny následujících vlastností příslušného zobrazení: frame bounds center transform alpha backgroundColor contentStretch
K animování těchto vlastností poskytuje UIView tyto blokové animační metody: +animateWithDuration:delay:options:animations:completion: +animateWithDuration:animations:completion: +animateWithDuration:animations:
Všechno to jsou statické metody UIView, takže nepotřebujete žádnou instanci zobrazení, abyste mohli spouštět animaci. Každá z metod nabízí různou úroveň kontroly nad animací. Nejjednodušší metoda, +animateWithDuration:animations:, umožňuje specifikovat dobu trvání animace a blok, který napíšete pro vykonání samotné animace. Metoda +animateWithDuration:animations:completion: staví na předchozí metodě v tom, že umožňuje specifikovat blok, který se má vykonat, až animace skončí. Pomocí ukončovacího bloku můžete řetězit několik animací za sebou. Nejsložitější je třetí metoda, +animateWithDuration:delay:options:animations:completion:, která nabízí dodatečné parametry umožňující specifikovat prodlevu před spuštěním animace a dodatečné volby pro konfiguraci animace. VYZKOUŠEJTE
Budování hry Pexeso. Soubor kódu Concentration si můžete stáhnout na zonerpress.cz.
V tomto příkladu budete implementovat klasickou hru Concentration (varianta Pexesa pro jednoho hráče). Na hrací plochu se rozdá sada kartiček lícem dolů. Hráč otočí libovolnou kartičku lícem nahoru. Pak otočí ještě další kartičku lícem nahoru a doufá, že najde právě tu, která tvoří pár s první kartičkou. Pokud se mu to povedlo, odstraní se obě kartičky z hrací plochy, Pokud se netrefil, otočí se obě kartičky zase lícem dolů. Cílem hry je v co nejmenším počtu tahů odstranit z hrací plochy všechny kartičky. Protože tuto hru tvoří velmi mnoho kartiček, vybudujete ji jako aplikaci určenou pro iPad. Snímek obrazovky rozehrané hry vidíte na obrázku 8-3.
Vývoj her pro iPhone a iPad – programování pro iOS
277
Obrázek 8-3. Rozehrané Pexeso. Situace na obrázku 8-3 ukazuje, že hráč už úspěšně odstranil čtyři páry kartiček, pak otočil lícem nahoru kartičku s číslem 12 a nyní by měl otočit další kartu s číslem 12, která tvoří pár s první dvanáctkou. Cílem hry je posilovat soustředění, protože hráč by se měl snažit zapamatovat pokud možno všechny kartičky, které už někdy otočil lícem nahoru, ale zase je musel otočit zpět, protože netrefil pár. Na kartičkách může být cokoliv, slova, čísla, nebo dokonce obrázky. Protože postrádám malířské vlohy, sestrojil jsem prostou sadu kartiček s čísly od 1 do 16. Grafické ztvárnění jedné z nich vidíte na obrázku 8-4. Abych si ještě více usnadnil grafické práce, vytvořil jsem čtyři instance každé kartičky, takže jsem získal celkem 64 kartiček. Hráč uspěje, když se mu podaří otočit libovolné dvě kartičky, které mají stejné číslo. Takový pár se pak odstraní z hrací plochy.
Obrázek 8-4. Rub a líc jedné kartičky Pexesa.
Kapitola 8 – Animování grafiky
278
Všechny animace v tomto projektu zařídíte pomocí UIView. V této sekci zahájíte projekt, vybudujete zobrazení CardImageView a pomocí animování vlastnosti rozdáte kartičky na hrací plochu. 1. Začněte tím, že nastartujete Xcode a vyberete File -> New -> New Project. 2. Objeví se dobře známý dialog s šablonami pro různé typy aplikací, které můžete vytvářet pro iPhone a Mac OS X. Vyberte v dialogu Single View Application a klikněte na Next. 3. Do textového pole Product Name napište název svého projektu, Concentration. Odškrtněte políčka "Use Storyboard" a "Include Unit Tests". Zkontrolujte, zda je zaškrtnuté políčko "Use Automatic Reference Counting". Z rozevíracího seznamu Device Family vyberte "iPad". Klikněte na Next. 4. Vyberte umístění pro svůj projekt a klikněte na tlačítko Create. Xcode vytvoří projekt a předloží vám okno projektu. 5. Nyní potřebujete importovat do projektu obrázky kartiček. Můžete si je stáhnout ze stránek vydavatelství zonerpress.cz. Vytvořte novou skupinu souborů, kde budete mít obrázky, s nimiž budete pracovat. Z menu vyberte File -> New -> New Group. Pojmenujte novou skupinu Images. 6. Z menu vyberte File -> Add files to Concentration a přidejte soubory obrázků (Card Front_#.png, kde # zastupuje číslo od 1 do 16 a Card_Back.png) do složky Images. Zaškrtněte políčko "Copy items into destination group’s folder (if needed)". Klikněte na "Add", abyste obrázky přidali do projektu. Přípravné práce jsou hotové, můžete začít budovat třídu CardImageView. Protože bude hra opravdu velmi jednoduchá, rozhodl jsem se, že ji nebudu implementovat s typickou architekturou MVC (model-zobrazení-kontrolér). Model je uložen v zobrazeních (kartičky) a v kontroléru zobrazení. Proto jsem se rozhodl uložit některá data přímo na kartičkách – konkrétně hodnotu kartiček a to, zdali je kartička otočená lícem dolů, nebo nahoru. Kartička kromě toho bude mít metody pro inicializaci kartičky obdélníkovým rámem a hodnotou (initWithFrame:value:) a pro otočení kartičky (flipCard). Protože kartičky nejsou nic jiného než obrázky, rozhodl jsem se dědit ze třídy UIImageView. 7. Vyberte z menu File -> New -> New File. V dialogu pro volbu šablony vyberte vlevo pod iOS šablonu Cocoa Touch. V pravém podokně vyberte Objective-C class a stiskněte Next. Do pole se seznamem "Subclass of " napište UIImageView. Pojmenujte třídu CardImageView a stiskněte Next. V dalším dialogu klikněte na Create. V navigátoru projektu uvidíte pod adresářem Concentration dva nové soubory s názvy CardImageView.h and CardImageView.m. 8. Do bloku @interface přidejte deklarace instančních proměnných faceDown a value: @interface CardImageView : UIImageView { BOOL faceDown; int value; }
9. Vně bloku @interface napište tyto deklarace metody a vlastnosti: - (id)initWithFrame:(CGRect)aRect value:(int) inValue; -(void) flipCard; @property BOOL faceDown; @property int value;
10. Přepněte se do implementačního souboru CardImageView. Pod direktivu @implementation přidejte direktivu @synthesize, abyste syntetizovali vlastnosti:
Vývoj her pro iPhone a iPad – programování pro iOS
279
@synthesize faceDown,value;
11. Teď implementujte metodu initWithFrame:value:. - (id)initWithFrame:(CGRect)aRect value:(int) inValue { self = [super initWithFrame:aRect]; if (self) { self.value = inValue; self.faceDown = YES; self.image = [UIImage imageNamed:@"Card_Back.png"]; } return self; }
12. Implementujte metodu flipCard: -(void) flipCard { if (self.faceDown) { NSString* frontFileName = [NSString stringWithFormat:@"Card Front_%i.png",self.value]; self.image = [UIImage imageNamed:frontFileName]; self.faceDown = NO; } else { self.image = [UIImage imageNamed:@"Card_Back.png"]; self.faceDown = YES; } }
13. Teď zapracujte na kontroléru zobrazení, ViewController. Vyberte hlavičkový soubor ViewController.h. Pod příkaz #import, který importuje UIKit, přidejte následující direktivu #import, abyste importovali hlavičkový soubor CardImageView.h: #import "CardImageView.h"
14. Vně bloku @interface napište následující deklarace metod: -(void) createCards; -(void) addCardsToView:(NSMutableArray*) cards;
15. Nyní můžete přejít k implementačnímu souboru ViewController.m a implementovat do něho rozdání kartiček. Do metody viewDidLoad přidejte volání metody createCards: - (void)viewDidLoad
Kapitola 8 – Animování grafiky
280 {
[super viewDidLoad]; [self createCards]; }
16. Přidejte metodu createCards: -(void) createCards { // 16 * 4 kartiček // Vytvoří kartičky NSMutableArray *cards = [[NSMutableArray alloc] initWithCapacity:64]; for (int i=1; i<=16; i++) { for (int j=1; j<=4; j++) { [cards addObject:[NSNumber numberWithInt:i]]; } } // Zamíchá kartičky srandom( time( NULL ) ); int swapA, swapB; for (int i=0; i<100000; i++) { swapA = (random() % 64); swapB = (random() % 64); NSNumber *tempNumber = [cards objectAtIndex:swapA]; [cards replaceObjectAtIndex:swapA withObject:[cards objectAtIndex:swapB]]; [cards replaceObjectAtIndex:swapB withObject:tempNumber]; } [self addCardsToView:cards]; }
17. Přidejte metodu addCardsToView:. -(void) addCardsToView:(NSMutableArray*) cards
Vývoj her pro iPhone a iPad – programování pro iOS
281
{ CardImageView* card; CGRect cardFrame; CGRect cardOrigin = CGRectMake(0,0, 40, 60); cardFrame.size = CGSizeMake(40, 60); CGPoint origin; int cardIndex = 0; NSTimeInterval timeDelay = 0.0; for (int i=0; i<8; i++) { for (int j=0; j<8; j++) { origin.y = i*70 + 100; origin.x = j * 50 + 100; cardFrame.origin = origin; // Vytvoří kartičku v počátku card = [[CardImageView alloc] initWithFrame:cardOrigin value:[[cards objectAtIndex:cardIndex] intValue]]; [self.view addSubview:card]; // Animuje přesuny kartiček do jejich cílových pozic [UIView animateWithDuration:0.5 delay:timeDelay options:UIViewAnimationOptionCurveLinear animations: ^ { card.frame = cardFrame; } completion:NULL]; timeDelay += 0.1; cardIndex++; } } }
18. Sestavte a spusťte projekt. Měli byte vidět, jak program rozdává na hrací plochu kartičky. Prostřednictvím metod UIView jste s pomocí Core Animation animovali rozdání kartiček nacházejících se v balíčku v levém horním rohu hrací plochy do jejich finálních pozic.
Patrick Alessi
Vývoj her pro iPhone a iPad Programování pro iOS
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.
Začněte ještě dnes psát hry pro platformu iOS. Chcete se pustit do vytváření her pro iPhone a iPAD, ale jste nováčkem v oblasti programování pro iOS? Tato kniha vám přístupnou a srozumitelnou formou poradí, jak začít, protože zahrnuje popis všech nezbytných technologií, které potřebujete znát k tomu, abyste mohli vyvíjet zajímavé hry pro iOS. Kniha je rozdělena do dvou hlavních částí – první část popisuje všechny nezbytné nástroje, jako je programovací prostředí Xcode, programovací jazyk C, programovací jazyk Objective-C, a samozřejmě nechybí ani popis frameworku Cocoa Foundation. Jakmile zvládnete tyto základy, budete se moci pustit do prozkoumávání knihoven, které jsou nezbytné pro zahrnutí grafiky, animací a zvuků do her. Rovněž se dozvíte, jak reagovat na akce uživatelů a jak budovat síťové hry. Protože autor knihy Patrick Alessi zastává názor, že studium toho, jak vytvářet hry pro iOS, by mělo být minimálně stejně zábavné jako vytváření her samotných, v téměř každé kapitole této knihy naleznete praktickou ukázku, která vás provede procesem vytvoření jednoduché hry. Tyto ukázky jsou vedeny stylem krok za krokem a je v nich vysvětlován každý důležitý kus kódu, takže budete vždy přesně vědět, co právě děláte a proč to děláte.
x x x x x
Kreslení s UIKit a Core Graphics Reakce na akce uživatele Animování grafiky API pro audio: tvorba zvuků v iOS Budování síťové hry s GameKitem
Zdrojové kódy ke stažení: http://zonerpress.cz/download/ios-vyvoj-her.zip
www.zoner.cz © iStockphoho (#15498677)
Přehled kapitol: x Hry na iOS x Programovací prostředí Xcode x Programovací jazyk C57 x Programovací jazyk Objective-C x Framework Cocoa Foundation
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í.
Zoner Press tel.: 532 190 883 e-mail: knihy@zoner.cz www.zonerpress.cz ZONER software, a.s., Nové sady 18, 602 00 Brno
KATALOGOVÉ ČÍSLO:
ZR1202
ISBN 978-80-7413-199-8
9 7 8 8 0 7 4 1 3 1 9 9 8