Projekt okładki i stron tytułowych: Marcin Sucharski

Ilustracja na okładce: Nawia Games

Wydawca: Łukasz Łopuszański

Redaktor: Urszula Pawłowska

Koordynator produkcji: Anna Bączkowska

Skład i łamanie: Pracownia Obrazu – Anna Sandecka-Ląkocy

Książka, którą nabyłeś, jest dziełem twórcy i wydawcy. Prosimy, abyś przestrzegał praw, jakie im przysługują. Jej zawartość możesz udostępnić nieodpłatnie osobom bliskim lub osobiście znanym. Ale nie publikuj jej w internecie. Jeśli cytujesz jej fragmenty, nie zmieniaj ich treści i koniecznie zaznacz, czyje to dzieło. A kopiując jej część, rób to jedynie na użytek osobisty.

Szanujmy cudzą własność i prawo

Więcej na www.legalnakultura.pl

Polska Izba Książki

Copyright © by Wydawnictwo Naukowe PWN SA

eBook został przygotowany na podstawie wydania papierowego z 2014 r. (wyd. I)

Warszawa 2014

ISBN 978-83-01-18142-0 (ePub)

ISBN 978-83-01-18143-7 (Mobi)

Wydawnictwo Naukowe PWN SA

tel. 22 69 54 321, faks 22 69 54 288

infolinia 801 33 33 88

e-mail: pwn@pwn.com.pl

www.pwn.pl

Skład wersji elektronicznej na zlecenie Wydawnictwa Naukowego PWN: Marcin Kapusta

Spis treści

- Dedykacja

- Rozdział 1. Wprowadzenie

- 1.1. Dla kogo jest ta książka?

- 1.2. Dlaczego Box2D?

- 1.3. Platformy docelowe

- 1.4. Materiały uzupełniające

- Rozdział 2. Principia physica, czyli podstawy fizyki gier

- 2.1. Teoria

- 2.1.2. Rachunek wektorowy

- 2.2. Rigid body physics, czyli fizyka ciała sztywnego

- 2.3. Soft body physics – fizyka ciała deformowalnego?

- Rozdział 3. Przygotowujemy środowisko, czyli decyzje projektowe

- 3.1. Zintegrowane środowisko programistyczne

- 3.2. Wizualizacja obiektów fizycznych

- 3.3. Debug framework – szablon roboczy

- Rozdział 4. Otwieramy pudełko

- 4.1. Faza zerowa: inicjalizacja i parametryzacja świata Box2D

- 4.2. Faza pierwsza: tłusta oliwa

- 4.3. Faza druga: para – buch

- 4.4. Faza trzecia: koła w ruch!

- Rozdział 5. Piszemy „prawdziwą” grę!

- 5.1. Nowy, lepszy szablon aplikacji

- 5.2. Port na Android OS

- 5.3. Port na iOS

- 5.4. Port dokądkolwiek

- Rozdział 6. Podsumowanie

- Bibliografia

- Dodatek 1. C++. Materiał referencyjny

- Dodatek 2. OpenGL ES 1.1. Materiał referencyjny

- Przypisy

Wszystkie rozdziały dostępne w pełnej wersji książki.

Marcinowi Sucharskiemu – Pro Patientia ;)

1 Wprowadzenie

Lubię fizykę, lecz kocham kreskówki.

Stephen Hawking

Przed podawaniem ścisłych konkretów, pozwolimy sobie wprowadzić zdrową równowagę, budując zasadność powstania tejże książki; książki o fizycznym świecie w pudełku zwanym Box2D.

Z pewnego punktu widzenia jej powstanie jest bowiem średnio zasadne: po co komu blisko 200 stron rozwinięcia ogólnodostępnej, najeżonej przykładami dokumentacji do silnika fizycznego^1. Doświadczony programista przystąpi do właściwej implementacji w kilkanaście minut od pobrania i uruchomienia hello world^2.

Aby odeprzeć powyższe, musimy posłużyć się dość długim (i niepotrzebnym) wywodem na temat faktycznego stanu naszej ulubionej branży (jaką jest oczywiście gamedev^3).

Gry komputerowe kreślą pewien bardzo specyficzny obszar, leżący gdzieś na styku nauk ścisłych i humanistycznych. Z jednej strony pogardzane przez poważne środowiska ściśle naukowe, z drugiej przez nieco mniej poważne środowiska antropocentryczne; ci pierwsi uważają, że „jakieś tam gry” to żart z ich dorobku, ci drudzy – odwrotnie, że ludzi obserwujących całymi dniami rzędy uciekających cyferek nie stać na głębsze myśli.

Tymczasem, aby od zera zrealizować grę AAA^4, potrzeba chyba wszelkiej możliwej wiedzy z zakresu informatyki, w doskonałej części matematyki i w niezbywalnej części fizyki. Algorytmika, programowanie niskopoziomowe procesorów, rozmaite struktury danych, reprezentacja świata w trójwymiarze, symulacja zjawisk naturalnych, komunikacja z urządzeniami zewnętrznymi, implementacja we wszelakich językach programowania, komunikacja sieciowa… tyle nam przychodzi do głowy w trakcie pisania tego zdania, ale obeznany w nauce i technologiach informacyjnych Czytelnik z całą pewnością przywoła co najmniej drugie tyle.

Jednak nawet najlepiej rozwinięty silnik, na którym jest oparta gra, będzie zupełnie bezużyteczny bez wyobraźni projektantów i artystów – to oni bowiem nadają grom klimat, który albo na lata zapada w pamięci, albo pozostaje nieistotnym dodatkiem do barwnego wszechświata gier komputerowych. Umysły ścisłe mogą bowiem fabrykować pewne rzeczy, ale do stworzenia doskonałej gry potrzeba dużej dawki specyficznych emocji i tych właśnie dostarczają głowy z bardziej rozwiniętą prawą półkulą mózgu.

Powyższe wydaje się zgadzać, ale nie nakręcajmy się – tworzenie gier to ani nie rozszczepianie atomów, ani budowanie windy kosmicznej, ani też inny rocket science; jest to sposób na dobrą zabawę w relatywnie poważnym biznesie. Zupełnym szczęściem, nikt poza nami, twórcami gier, i garścią uświadomionych inwestorów, nie ma w naszym kraju pojęcia, na czym ów biznes polega; jesteśmy w stu procentach pewni, że między innymi dlatego tak wspaniale sie rozwijamy. Polscy programiści należą do światowej czołówki i są rozchwytywani przez zagraniczne studia deweloperskie, z których ofert skwapliwie korzystają.

O co nam zatem chodzi, tym, którzy dzielą się wiedzą o grach?

Chcemy przyczynić się do wyłonienia jak najbardziej liczebnej grupy programistów gier i zarazić ją niezbywalnym entuzjazmem do ich tworzenia, do czego, w co chcemy wierzyć, przyczyni się niniejsza książka. Książka, która nauczy, jak w elegancki i twórczy sposób wykorzystać Box2D!

1.1. Dla kogo jest ta książka?

Warunkiem sine qua non do przystąpienia do niniejszej publikacji jest zgłębienie ze zrozumieniem Philosophiæ Naturalis Principia Mathematica^5 Sir Issaca Newtona.

Powyższe zdanie należy potraktować jako hiperboliczny żart, ponieważ autorom (jak i, na pocieszenie, wielu przed nimi) się to nie udało. Tak, czy inaczej – ciekawa, klasyczna pozycja na samotne, mroźne wieczory. A zatem warunkiem sine qua non do przystąpienia do niniejszej publikacji jest szczera chęć czytelnika, który zetknął się wcześniej z językami programowania i zna podstawy fizyki.

Zależało nam, aby niniejszy podręcznik nie został jałowym materiałem referencyjnym, dlatego zdecydowaliśmy się na konwencję niemalże interaktywną z Czytelnikiem: wychodząc od podstawowej funkcjonalności silnika Box2D, poprowadzimy Cię do stworzenia solidnego prototypu pełnokrwistej gry mobilnej^6. Zanim jednak wyciągniemy rękę, potrzebujemy, abyś uznał, że znasz język C++ w stopniu podstawowym. Przez stopień podstawowy rozumiemy: znajomość klas, funkcji, zmiennych, tablic i pętli. Wskaźniki Ci darujemy. Jeżeli któraś z wymienionych kwestii z jakiegoś powodu pozostaje nieostra, albo chwilowo wypadła Ci z pamięci, to zawsze możesz sięgnąć do internetu bądź Dodatku 1. na końcu książki.

1.2. Dlaczego Box2D?

Odpowiedź na to pytanie jest prosta: bo jest łatwy, lekki i działa. Łatwy, czyli i Ty, Czytelniku, dasz sobie z nim radę. Lekki, czyli z powodzeniem udźwignie go przeciętny smartfon dostępny za 1 PLN w abonamencie. No i wreszcie świetnie działa, biorąc odpowiedzialność za całą fizykę w naszej grze.

Box2D jest silnikiem implementującym fizykę ciała sztywnego, z którą zapoznamy się bliżej w rozdziale 2.2; przy obranej przez nas klasie gier można zaryzykować twierdzenie, że Box2D wyznacza tzw. industry standard. Jaką klasę mamy na myśli? Odpowiedzią będzie fragment dialogu, który odbył się między panami: Erinem Catto i Peterem Vesterbacką:

Erin: Cześć Peter, mógłbyś mi powiedzieć jakiego silnika fizycznego używa Angry Birds?

Peter: Box2D.

Erin: Świetnie. Rozważyłbyś umieszczenie „Box2D” w sekcji credits waszej gry?

Peter. Pewnie.

Erin: Dzięki! Przy okazji, nazywam się Erin Catto i jestem twórcą Box2D.

[…]

Biorąc pod uwagę, że ok. 50% ziemskiej populacji wie, co to jest Angry Birds, lepszego punktu odniesienia nie było sensu szukać.

Box2D, jak sam sugeruje, nadaje się do gier 2D, czyli dwuwymiarowych (od „2-dimensional”). Gry 2D przeżywają obecnie mały renesans za sprawą rozmaitych urządzeń przenośnych, których moc obliczeniowa i wykorzystanie baterii do niedawna jeszcze nie pozwalały na wyrenderowanie przyzwoitej sceny trójwymiarowej. Dodatkowym czynnikiem jest obecność smartfona w co drugiej polskiej kieszeni, co spowodowało mimowolne zainteresowanie się grami przez ludzi preferujących innego rodzaju rozrywki (tzw. gracze każualowi^7).

Box2D nie jest jedynym rozwiązaniem w dziedzinie fizyki wspomagającym tworzenie gier – w tab. 1.1 są podane inne silniki fizyczne, definiujące standardy techniczne w naszej branży; warto rzucić na nią okiem chociażby po to, aby porównać, jakiej rangi gry ze sobą niosą.

Tabela 1.1. Najpopularniejsze silniki fizyczne stosowane w grach

Engine

Developer

Opis

Odpowiedzialny za (m.in):

Chipmunk2D

Scott Lembcke i in.

dwuwymiarowy silnik wobec ciał sztywnych; napisany w języku C, przez co charakteryzuje się arytmetyką proceduralną

Dungeon Defense

Waking Mars

Feed Me Oil

Box2D

Erin Catto

o nim jest ta książka

Angry Birds

Limbo

Cat on a Diet

Bullet

Erwin Coumans i in.

silnik trójwymiarowy, implementujący fizykę ciała sztywnego jak i deformowalnego^8; używany również w filmach

Sonic the Hedgehog

Deus Ex

Grand Theft Auto IV/V

Open Dynamic Engine (ODE)

Russell Smith

silnik trójwymiarowy, składa się z dwóch głównych modułów; pierwszy implementuje fizykę ciała stałego, drugi jest odpowiedzialny za wykrywanie kolizji; chętnie stosowany w robotyce

World of Goo

Mario Strikers Charged

Dead Island

Havok

Havok

wieloplatformowy, złożony middleware^9, zawierający prócz rigid body i soft body moduły sztucznej inteligencji, animacji i inne

Alan Wake

Skyrim

Wiedźmin 2

PhysX

NVIDIA Corporation (obecnie)

wieloplatformowy, podobnie jak Havok o szerokim zakresie funkcjonalności, wszak liczony przez procesor graficzny, a nie główny

Mirror’s Edge

Batman: Arkham Asylum

Wiedźmin 3

Większość z wymienionych stała się integralną częścią syntetycznych systemów wspomagających tworzenie gier, tzw. game engines (rys. 1.1).

Jak widać, silnik gry to całkiem złożona sprawa; w obecnych czasach korzysta się raczej z istniejących rozwiązań niż tworzy nowe od zera. Przypuszczalnie, gdybyśmy zabrali się za napisanie samego tylko odpowiednika Box2D, to po ukończonym zadaniu zastałaby nas nowa generacja konsol gier wideo, czyli spóźnilibyśmy się na pociąg. Na szczęście nie musimy tego robić.

Rysunek 1.1. Przykładowa struktura silnika gry

1.3. Platformy docelowe

Box2D można obecnie podpiąć w zasadzie pod wszystko, począwszy od aplikacji Windows/Mac/Linux, przez iOS i Android, aż do Flasha i WWW (rys. 1.2). Wspomniana wcześniej gra Angry Birds słusznie sugeruje wszak, że naszą platformą docelową będzie urządzenie mobilne.

Rysunek 1.2. Możliwości zastosowania silnika Box2D

Jeżeli jako deployment target obierzesz, Czytelniku, smartfon, masz potencjalnie największą szansę na propagację swojej gry w obowiązującej obecnie sytuacji rynkowej najbliższej nam branży. Jako że spędziliśmy z urządzeniami tego typu bodaj najwięcej czasu zawodowego, stojąca u Twego progu wiedza będzie z pierwszej ręki. Zanim jednak obierzemy właściwy target w rozdziale 5, skonfigurujemy tzw. generic environment, w którym odbędziemy uniwersalne manewry w zakresie Box2D. Owe training grounds będą optymalnym punktem wyjścia w kierunku dowolnie obranej platformy; my udamy się w stronę platform mobilnych.

1.4. Materiały uzupełniające

W rozszerzeniu kontekstu zagadnień, o które ociera się nasza książka (rys. 1.3), pomoże indywidualne zgłębienie pozycji z poniższej listy:

• Dowolna książka do nauki języka C++. My zaczęliśmy kiedyś od C++ w 48 godzin Adama Majczaka.

• Dowolna książka do nauki OpenGL. Polecamy aktualne wydanieOpenGL Programming Guide: The Official Guide to Learning OpenGL.

• “iOS App Programming Guide” – dokument z oficjalnego programu deweloperskiego Apple.

• Android NDK: Beginners Guide Sylvaina Ratabuila. Książka porusza programowanie aplikacji natywnych (C++) na platformę Android, w odróżnieniu od aplikacji opartych na warstwie Java.

• Tricks of the Windows Game Programming Gurus André LaMothe’a. Mimo tendencyjnego tytułu i obranej platformy, zawarta tam wiedza o pisaniu gier jest uniwersalna.

Rysunek 1.3. Zagadnienia powiązane z Box2D w naszej książce