Wykorzystaj do tworzenia gier
najpopularniejszy język programowania ery internetu
Java jest nowoczesnym i prostym językiem programowania zorientowanym obiektowo. Trudno nie doceniać jej zalet -- czytelna i zrozumiała składnia, uniwersalny, niezależny od platformy kod i przede wszystkich bezpłatny dostęp do doskonałych narzędzi programistycznych. Javę doceniło już wielu twórców oprogramowania, wśród których brakowało jednak twórców gier i aplikacji 'rozrywkowych'. Dotychczas w Javie tworzono jedynie proste układanki, gry karciane i łamigłówki lub nieśmiertelne aplety typu 'padający śnieg', które przez długi czas straszyły nas z przeglądarek internetowych. Czas na zmianę! Wykorzystaj swoje umiejętności programowania w Javie, sięgnij po wiadomości zawarte w tej książce i napisz prawdziwą grę -- z grafiką, inteligentnymi przeciwnikami, wydajnym silnikiem 3D wspomaganym sprzętowo i przestrzennym dźwiękiem.
'Java. Tworzenie gier' to książka o programowaniu gier, na jaką czekałeś. Zawiera zarówno opis podstawowych mechanizmów używanych w grach, jak i szczegółowe omówienie zaawansowanych technik. Dowiesz się, jak wykorzystać platformę Java 1.4 do tworzenia szybkich, pełnoekranowych gier akcji, przygodówek i trójwymiarowych strzelanek. Nauczysz się tworzyć wspomaganą sprzętowo grafikę, algorytmy sztucznej inteligencji i znajdowania drogi, realistyczne efekty dźwiękowe i mechanizmy obsługi gry dla wielu graczy.
Algorytmy wyświetlania grafiki 2D
Tworzenie interfejsu użytkownika z wykorzystaniem komponentów Swing
Programowanie efektów dźwiękowych działających w czasie rzeczywistym
Klient i serwer gry wieloosobowej
Wyświetlanie grafiki 3D
Mapowanie tekstur i symulacja oświetlenia
Drzewa BSP
Algorytmy detekcji kolizji i wykrywania drogi
Sztuczna inteligencja i tworzenie botów
Zapisywanie stanu gry
Optymalizacja kodu
System sterowania grą
Udowodnij 'fachowcom' krytykującym szybkość Javy, że nie mają racji. Napisz wspaniałą grę w Javie. W tej książce znajdziesz wszystkie wiadomości, które są do tego niezbędne.
Darmowy fragment publikacji:
IDZ DO
IDZ DO
PRZYK£ADOWY ROZDZIA£
PRZYK£ADOWY ROZDZIA£
SPIS TREĎCI
SPIS TREĎCI
Java. Tworzenie gier
KATALOG KSI¥¯EK
KATALOG KSI¥¯EK
KATALOG ONLINE
KATALOG ONLINE
ZAMÓW DRUKOWANY KATALOG
ZAMÓW DRUKOWANY KATALOG
TWÓJ KOSZYK
TWÓJ KOSZYK
DODAJ DO KOSZYKA
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
CENNIK I INFORMACJE
ZAMÓW INFORMACJE
ZAMÓW INFORMACJE
O NOWOĎCIACH
O NOWOĎCIACH
ZAMÓW CENNIK
ZAMÓW CENNIK
CZYTELNIA
CZYTELNIA
FRAGMENTY KSI¥¯EK ONLINE
FRAGMENTY KSI¥¯EK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Autorzy: David Brackeen, Bret Barker, Laurence Vanhelsuwe
T³umaczenie: S³awomir Dzieniszewski (rozdz. 7, 8, 12),
Pawe³ Gonera (rozdz. 1 – 6, 14 – 16), Miko³aj
Szczepaniak (rozdz. 9 – 11, 13, 17 – 19)
ISBN: 83-7361-411-7
Tytu³ orygina³u: Developing Games in Java
Format: B5, stron: 756
Przyk³ady na ftp: 4924 kB
Wykorzystaj do tworzenia gier
najpopularniejszy jêzyk programowania ery internetu
Java jest nowoczesnym i prostym jêzykiem programowania zorientowanym obiektowo.
Trudno nie doceniaæ jej zalet — czytelna i zrozumia³a sk³adnia, uniwersalny, niezale¿ny
od platformy kod i przede wszystkich bezp³atny dostêp do doskona³ych narzêdzi
programistycznych. Javê doceni³o ju¿ wielu twórców oprogramowania, wġród których
brakowa³o jednak twórców gier i aplikacji „rozrywkowych”. Dotychczas w Javie
tworzono jedynie proste uk³adanki, gry karciane i ³amig³ówki lub nieġmiertelne aplety
typu „padaj¹cy ġnieg”, które przez d³ugi czas straszy³y nas z przegl¹darek
internetowych. Czas na zmianê! Wykorzystaj swoje umiejêtnoġci programowania
w Javie, siêgnij po wiadomoġci zawarte w tej ksi¹¿ce i napisz prawdziw¹ grê —
z grafik¹, inteligentnymi przeciwnikami, wydajnym silnikiem 3D wspomaganym
sprzêtowo i przestrzennym dĥwiêkiem.
„Java. Tworzenie gier” to ksi¹¿ka o programowaniu gier, na jak¹ czeka³eġ. Zawiera
zarówno opis podstawowych mechanizmów u¿ywanych w grach, jak i szczegó³owe
omówienie zaawansowanych technik. Dowiesz siê, jak wykorzystaæ platformê Java 1.4
do tworzenia szybkich, pe³noekranowych gier akcji, przygodówek i trójwymiarowych
strzelanek. Nauczysz siê tworzyæ wspomagan¹ sprzêtowo grafikê, algorytmy sztucznej
inteligencji i znajdowania drogi, realistyczne efekty dĥwiêkowe i mechanizmy obs³ugi
gry dla wielu graczy.
• Algorytmy wyġwietlania grafiki 2D
• Tworzenie interfejsu u¿ytkownika z wykorzystaniem komponentów Swing
• Programowanie efektów dĥwiêkowych dzia³aj¹cych w czasie rzeczywistym
• Klient i serwer gry wieloosobowej
• Wyġwietlanie grafiki 3D
• Mapowanie tekstur i symulacja oġwietlenia
• Drzewa BSP
• Algorytmy detekcji kolizji i wykrywania drogi
• Sztuczna inteligencja i tworzenie botów
• Zapisywanie stanu gry
• Optymalizacja kodu
• System sterowania gr¹
Udowodnij „fachowcom” krytykuj¹cym szybkoġæ Javy, ¿e nie maj¹ racji.
Napisz wspania³¹ grê w Javie. W tej ksi¹¿ce znajdziesz wszystkie wiadomoġci,
które s¹ do tego niezbêdne.
Spis treści
O Autorze ......................................................................................... 15
Wstęp .............................................................................................. 17
Część I Podstawy gier w języku Java ..........................................25
Rozdział 1. Wątki w języku Java ......................................................................... 27
Co to jest wątek? ...................................................k...................................................k........
.28
Tworzenie i uruchamianie wątków w języku Java...................................................k.........28
Rozszerzanie klasy Thread ...................................................k......................................29
Implementacja interfejsu Runnable ...................................................k.........................29
Użycie anonimowej klasy wewnętrznej...................................................k...................29
Oczekiwanie na zakończenie wątku ...................................................k........................30
Uśpione wątki ...................................................k...................................................k.......30
Synchronizacja ...................................................k...................................................k............30
Po co nam synchronizacja?...................................................k......................................30
Jak synchronizować? ...................................................k...............................................31
Kiedy należy synchronizować?...................................................k................................32
Kiedy nie synchronizować? ...................................................k.....................................33
Unikanie zakleszczeń...................................................k...............................................33
Użycie wait() oraz notify()...................................................k.............................................34
Model zdarzeń Javy...................................................k...................................................k.....35
Kiedy używać wątków? ...................................................k.................................................36
Kiedy nie używać wątków?...................................................k............................................36
Podsumowanie: pule wątków...................................................k.........................................36
Podsumowanie ...................................................k...................................................k............41
Rozdział 2. Grafika 2D oraz animacja .................................................................. 43
Grafika pełnoekranowa ...................................................k..................................................44
Układ ekranu...................................................k...................................................k.........44
Kolor piksela i głębia koloru...................................................k....................................45
Częstotliwość odświeżania ...................................................k......................................46
Przełączanie do trybu pełnoekranowego ...................................................k.................46
Anti-aliasing...................................................k...................................................k..........50
Który tryb graficzny należy zastosować? ...................................................k................51
......52
Rysunki............................................k...................................................k.........................
Przezroczystość...................................................k...................................................k.....52
Formaty plików...................................................k...................................................k.....52
Odczytywanie rysunków...................................................k..........................................53
6
Java. Tworzenie gier
Rysunki przyspieszane sprzętowo ...................................................k...........................56
Program testujący wydajność rysowania rysunków ...................................................k58
Animacja ...................................................k...................................................k...............61
Renderowanie aktywne...................................................k............................................64
Pętla animacji...................................................k...................................................k........64
Usuwanie migotania i szarpania...................................................k.....................................67
Podwójne buforowanie ...................................................k............................................67
Przełączanie stron ...................................................k...................................................k.68
Odświeżanie monitora i szarpanie ...................................................k...........................70
Klasa BufferStrategy...................................................k................................................70
Tworzenie zarządcy ekranów ...................................................k..................................71
Duszki ...................................................k...................................................k...................78
Proste efekty...................................................k...................................................k................84
Przekształcenia rysunków...................................................k........................................84
Podsumowanie ...................................................k...................................................k............89
Rozdział 3. Interaktywność i interfejs użytkownika ............................................. 91
Model zdarzeń AWT...................................................k...................................................k...94
Zdarzenia klawiatury...................................................k...................................................k...95
Zdarzenia myszy ...................................................k...................................................k.........99
Przesuwanie myszy metodą „rozglądania się”...................................................k.............103
Ukrywanie wskaźnika myszy ...................................................k................................107
Tworzenie klasy InputManager...................................................k....................................108
Zastosowanie obiektu InputManager ...................................................k...........................119
Zatrzymywanie gry ...................................................k................................................119
Dodajemy grawitację ...................................................k.............................................120
Projektowanie intuicyjnych interfejsów użytkownika ...................................................k.125
Wskazówki do projektu interfejsu użytkownika...................................................k....126
Wykorzystanie komponentów Swing...................................................k...........................127
Podstawy Swing...................................................k...................................................k..127
Stosowanie Swing w trybie pełnoekranowym...................................................k.......128
Tworzenie prostego menu ...................................................k............................................130
Konfiguracja klawiatury przez użytkownika ...................................................k...............135
Podsumowanie ...................................................k...................................................k..........141
Rozdział 4. Efekty dźwiękowe oraz muzyka........................................................ 143
Podstawy dźwięku...................................................k...................................................k.....144
API Java Sound ...................................................k...................................................k.........144
Otwieranie pliku dźwiękowego ...................................................k.............................145
Zastosowanie interfejsu Line ...................................................k.................................145
Odtwarzanie dźwięków ...................................................k................................................146
Tworzenie architektury filtrów działających w czasie rzeczywistym.............................151
Tworzenie filtra „echo”, działającego w czasie rzeczywistym .......................................155
Emulacja dźwięku 3D ...................................................k..................................................159
Mechanizmy potrzebne do tworzenia filtra 3D ...................................................k.....160
Implementacja filtra 3D ...................................................k.........................................161
Testowanie filtra 3D ...................................................k..............................................163
Tworzenie obiektu zarządzającego dźwiękiem...................................................k............167
Klasa Sound ...................................................k...................................................k........167
Klasa SoundManager ...................................................k.............................................168
Zmienne lokalne dla wątków ...................................................k.................................175
Odtwarzanie muzyki ...................................................k...................................................k.176
Odtwarzanie dźwięku CD ...................................................k......................................177
Odtwarzanie plików MP3 i Ogg Vorbis ...................................................k................177
Spis treści
7
Odtwarzanie muzyki MIDI ...................................................k....................................178
Tworzenie muzyki adaptacyjnej ...................................................k............................182
Podsumowanie ...................................................k...................................................k..........184
Rozdział 5. Tworzenie dwuwymiarowej gry platformowej ................................... 185
Tworzenie mapy złożonej z kafelków...................................................k..........................186
Implementacja mapy korzystającej z kafelków ...................................................k.....187
Ładowanie mapy złożonej z kafelków...................................................k...................190
Rysowanie mapy złożonej z kafelków...................................................k...................193
Rysowanie duszków...................................................k...............................................195
Przewijanie z paralaksą...................................................k..........................................195
Premie ...................................................k...................................................k.................197
Proste obiekty wrogów ...................................................k..........................................200
Wykrywanie kolizji ...................................................k...................................................k...207
Detekcja kolizji ...................................................k...................................................k...207
Obsługa kolizji ...................................................k...................................................k....208
Kolizje duszków...................................................k...................................................k..212
Dokończenie i przyspieszanie gry...................................................k................................213
Tworzenie wykonywalnego pliku .jar...................................................k..........................213
Pomysły na rozszerzenie gry...................................................k........................................215
Podsumowanie ...................................................k...................................................k..........216
Rozdział 6. Gry wieloosobowe ........................................................................... 217
Rewolucja w bibliotekach wejścia-wyjścia w języku Java.............................................219
Przegląd bibliotek NIO z JDK 1.4 ...................................................k.........................220
Kanały ...................................................k...................................................k.................220
Bufory ...................................................k...................................................k.................223
Selektory oraz klasy SelectionKey ...................................................k........................226
ChatterBox, prosta aplikacja dla wielu użytkowników...................................................k227
Serwer: ChatterServer...................................................k............................................227
Kompilowanie i uruchamianie serwera ...................................................k.................233
Klient: ChatterClient...................................................k..............................................235
Kompilowanie i uruchamianie klienta ...................................................k...................236
Szkielet serwera gry wieloosobowej ...................................................k............................237
Cele projektu i taktyka ...................................................k...........................................237
Projekt ...................................................k...................................................k.................238
Wspólne klasy i interfejsy...................................................k......................................242
Implementacja serwera ...................................................k..........................................244
Klient...................................................k...................................................k...................252
Przykładowa gra: RPS (kamień, papier, nożyczki)...................................................k......253
Klasy ...................................................k...................................................k...................253
Uruchamianie gry RPS ...................................................k..........................................256
Wykończanie gry: rozbudowa szkieletu ...................................................k......................258
Interfejs klienta ...................................................k...................................................k...258
Trwałość...................................................k...................................................k..............258
Listy znajomych, pokoje i czat ...................................................k..............................258
Administracja serwera...................................................k..................................................259
Rejestracja zdarzeń ...................................................k................................................259
Uruchamianie i wyłączanie...................................................k....................................260
Konsole administracyjne serwera ...................................................k..........................261
Śledzenie gry...................................................k...................................................k.......261
Zagadnienia zaawansowane ...................................................k.........................................262
Rozłączenia i ponowne połączenia ...................................................k........................262
Tunelowanie HTTP...................................................k................................................263
8
Java. Tworzenie gier
Testowanie za pomocą botów...................................................k................................265
Te nieznośne modemy ...................................................k...........................................266
Profilowanie i tworzenie statystyk wydajności...................................................k......266
Dostrajanie wydajności...................................................k..........................................268
Podsumowanie ...................................................k...................................................k..........270
Część II Grafika trójwymiarowa
i zaawansowane techniki programowania gier ...............271
Rozdział 7. Grafika trójwymiarowa .................................................................... 273
Typy renderowania grafiki trójwymiarowej ...................................................k................274
Nie zapominajmy o matematyce ...................................................k..................................275
Trygonometria i trójkąty prostokątne ...................................................k....................276
Wektory...................................................k...................................................k...............276
Podstawy grafiki trójwymiarowej ...................................................k................................281
Algebra trzech wymiarów ...................................................k............................................284
Wielokąty ...................................................k...................................................k..................289
Przekształcenia przestrzeni trójwymiarowej...................................................k................292
Rotacje ...................................................k...................................................k................293
Hermetyzacja przekształceń rotacji i translacji...................................................k......295
Stosowanie transformacji...................................................k.......................................298
Porządek rotacji ...................................................k...................................................k..300
Prosty potok tworzenia grafiki 3D ...................................................k...............................301
Ruch kamery ...................................................k...................................................k.............305
Bryły i usuwanie niewidocznych powierzchni...................................................k.............305
Iloczyn skalarny wektorów ...................................................k....................................307
Iloczyn wektorowy wektorów...................................................k................................308
Dodatkowe właściwości iloczynu skalarnego i wektorowego..................................311
Rysowanie wielokątów za pomocą konwertera skanującego .........................................312
Optymalizowanie konwertera skanującego za pomocą liczb stałoprzecinkowych ..317
Przycinanie w trzech wymiarach...................................................k..................................321
Ostateczny potok renderowania ...................................................k...................................324
Podsumowanie ...................................................k...................................................k..........332
Rozdział 8. Mapowanie tekstur i oświetlenie ..................................................... 333
Podstawy mapowania tekstur uwzględniającego perspektywę.......................................334
Wyprowadzenie równań wykorzystywanych do mapowania tekstur.......................335
Prosty mechanizm mapowania tekstur...................................................k.........................340
Wady naszego prostego mechanizmu renderującego ...............................................347
Optymalizowanie mapowania tekstur ...................................................k..........................348
Przechowywanie tekstur ...................................................k........................................349
Prosta optymalizacja ...................................................k..............................................352
Rozwijanie metod w miejscu wywołania ...................................................k..............356
Przykładowy program korzystający z szybkiego mapowania tekstur ......................358
Prosty mechanizm generowania oświetlenia...................................................k................359
Odbicie rozproszone ...................................................k..............................................359
Światło otoczenia ...................................................k...................................................k360
Uwzględnianie intensywności światła pochodzącego ze źródła światła ..................360
Spadek intensywności światła wraz z odległością...................................................k.360
Implementowanie punktowego źródła światła...................................................k.......361
Implementowanie oświetlania tekstur...................................................k..........................362
Tworzenie zaawansowanych trików oświetleniowych za pomocą map cieniowania.....369
Odnajdywanie prostokąta ograniczającego...................................................k............369
Stosowanie mapy cieniowania...................................................k...............................371
Spis treści
9
Budowanie mapy cieniowania ...................................................k...............................373
Budowanie powierzchni...................................................k.........................................375
Przechowywanie powierzchni w pamięci podręcznej ..............................................378
Przykład z cieniowaniem powierzchni ...................................................k..................384
Dodatkowe pomysły...................................................k...................................................k..385
Sugerowanie głębi...................................................k..................................................385
Fałszywe cienie...................................................k...................................................k...386
Mapowanie MIP...................................................k...................................................k..386
Interpolacja dwuliniowa...................................................k.........................................386
Interpolacja trójliniowa...................................................k..........................................387
Mapy wektorów normalnych i mapy głębokości...................................................k...387
Inne typy oświetlenia ...................................................k.............................................388
Podsumowanie ...................................................k...................................................k..........388
Rozdział 9. Obiekty trójwymiarowe.................................................................... 389
Usuwanie ukrytych powierzchni...................................................k..................................390
Algorytm malarza ...................................................k..................................................390
Odwrotny algorytm malarza ...................................................k..................................391
Z-bufor ...................................................k...................................................k................391
Z-bufor z wartościami 1/z...................................................k......................................393
Obliczanie z-głębokości...................................................k.........................................396
Animacja trójwymiarowa...................................................k.............................................397
Ruch postępowy...................................................k...................................................k..400
Ruch obrotowy...................................................k...................................................k....402
Grupy wielokątów ...................................................k...................................................k.....407
Iteracyjna obsługa wszystkich wielokątów należących do grupy.............................411
Wczytywanie grup wielokątów z pliku OBJ...................................................k................413
Format pliku OBJ...................................................k...................................................k414
Format pliku MTL ...................................................k.................................................420
Obiekty w grze ...................................................k...................................................k..........421
Zarządzanie obiektami w grze...................................................k......................................425
Łączenie elementów...................................................k...................................................k..427
Możliwe rozszerzenia w przyszłości...................................................k............................433
Podsumowanie ...................................................k...................................................k..........434
Rozdział 10. Zarządzanie sceną trójwymiarową za pomocą drzew BSP ................ 435
Wprowadzenie do drzew BSP...................................................k......................................436
Podstawy drzew binarnych...................................................k...........................................437
Jednowymiarowe drzewo BSP...................................................k.....................................440
Dwuwymiarowe drzewo BSP ...................................................k......................................442
Przykład budowy drzewa BSP...................................................k...............................443
Przykład przeglądania drzewa BSP ...................................................k.......................447
Implementacja dwuwymiarowego drzewa BSP...................................................k...........448
Linia podziału BSP ...................................................k................................................450
Wyznaczanie położenia punktu względem linii ...................................................k....450
Dwójkowy podział wielokąta ...................................................k................................454
Przeglądanie drzewa BSP ...................................................k......................................455
Przeglądanie poprzeczne...................................................k........................................457
Przeglądanie od przodu do tyłu...................................................k..............................458
Budowa drzewa...................................................k...................................................k...459
Znajdowanie punktu przecięcia dwóch prostych...................................................k...463
Przycinanie wielokątów do linii...................................................k.............................465
Usuwanie pustych przestrzeni T-złączy...................................................k.................467
Testowanie drzewa BSP ...................................................k........................................469
10
Java. Tworzenie gier
Rysowanie wielokątów od przodu do tyłu ...................................................k...................471
Pierwszy przykład wykorzystania drzewa BSP ...................................................k...........479
Rysowanie obiektów na scenie ...................................................k....................................480
Wczytywanie map z pliku ...................................................k............................................482
Łączenie elementów...................................................k...................................................k..486
Rozszerzenia...................................................k...................................................k..............486
Podsumowanie ...................................................k...................................................k..........488
Rozdział 11. Wykrywanie kolizji .......................................................................... 489
Podstawy kolizji ...................................................k...................................................k........490
Kolizje typu obiekt-obiekt...................................................k............................................491
Eliminowanie testów...................................................k..............................................491
Sfery otaczające ...................................................k...................................................k..493
Walce otaczające...................................................k...................................................k.495
Problem przetwarzania dyskretno-czasowego...................................................k.......498
Kolizje typu obiekt-świat ...................................................k.............................................499
Prostopadłościany otaczające, wykorzystywane do wykrywankia kolizji
z podłogami ...................................................k...................................................k......499
Znajdowanie liścia drzewa BSP dla danego położenia.............................................500
Implementacja testów wysokości podłogi i sufitu ...................................................k.501
Prostopadłościany otaczające, wykorzystywane do testowania kolizji ze ścianami .. 503
Punkt przecięcia z odcinkiem wielokąta reprezentowanego w drzewie BSP...........504
Problem narożników ...................................................k..............................................508
Implementacja wykrywania kolizji typu obiekt-świat..............................................509
Prosty program demonstracyjny wykrywający kolizje ...................................................k511
Obsługa kolizji z przesuwaniem ...................................................k..................................512
Przesuwanie obiektu wzdłuż innego obiektu...................................................k.........512
Przesuwanie obiektu wzdłuż ściany...................................................k.......................515
Grawitacja i płynny ruch na schodach (przesuwanie obiektu wzdłuż podłogi)........517
Skakanie...................................................k...................................................k..............520
Program demonstracyjny obsługujący kolizje z przesuwaniem .....................................521
Rozszerzenia...................................................k...................................................k..............522
Podsumowanie ...................................................k...................................................k..........522
Rozdział 12. Odnajdywanie drogi w grze .............................................................. 523
Podstawowa wiedza na temat technik odnajdywania drogi ............................................524
Pierwsze przymiarki do odnajdywania drogi w grze ...................................................k...524
Przeszukiwanie wszerz ...................................................k..........................................527
Podstawy algorytmu A* ...................................................k...............................................530
Stosowanie algorytmu A* w grze ...................................................k................................535
Algorytm A* w połączeniu z drzewami BSP...................................................k...............536
Przejścia ...................................................k...................................................k..............536
Implementowanie portali ...................................................k.......................................537
Uniwersalny mechanizm odnajdywania drogi ...................................................k.............541
Przygotowywanie robota PathBot...................................................k................................545
Sposoby ulepszania przeszukiwania A* ...................................................k......................549
Podsumowanie ...................................................k...................................................k..........550
Rozdział 13. Sztuczna inteligencja ...................................................................... 551
Podstawy sztucznej inteligencji ...................................................k...................................552
Pozbawianie botów ich boskiej mocy ...................................................k..........................553
„Widzenie”...................................................k...................................................k..........554
„Słyszenie”...................................................k...................................................k..........556
Spis treści
11
Maszyny stanów i obsługa reakcji ...................................................k...............................559
Maszyny probabilistyczne...................................................k............................................561
Przydatne funkcje generujące liczby losowe ...................................................k.........563
Podejmowanie decyzji...................................................k..................................................564
Wzorce ...................................................k...................................................k......................566
Unikanie...................................................k...................................................k..............567
Atakowanie ...................................................k...................................................k.........569
Uciekanie ...................................................k...................................................k............572
Celowanie ...................................................k...................................................k...........573
Strzelanie...................................................k...................................................k.............574
Tworzenie obiektów...................................................k...................................................k..575
Łączenie elementów...................................................k...................................................k..576
Mózgi!...................................................k...................................................k.................576
Zdrowie i umieranie...................................................k...............................................577
Dodawanie HUD-a...................................................k.................................................581
Uczenie się ...................................................k...................................................k................585
Wskrzeszanie botów ...................................................k..............................................586
Uczenie się botów ...................................................k..................................................588
Rozszerzenia programu demonstracyjnego ...................................................k...........593
Inne podejścia do sztucznej inteligencji...................................................k.......................593
Zespołowa sztuczna inteligencja...................................................k............................594
Podsumowanie ...................................................k...................................................k..........594
Rozdział 14. Skrypty gry ..................................................................................... 595
Książka kucharska skryptów: czego potrzebujemy ...................................................k.....596
Implementacja powiadomień wejścia i wyjścia ...................................................k...........597
Wyzwalacze ...................................................k...................................................k........599
Nasłuch obiektów gry...................................................k...................................................k600
Skrypty ...................................................k...................................................k..................
....604
Projektowanie skryptu ...................................................k...........................................606
Wbudowywanie BeanShell...................................................k....................................608
Zdarzenia opóźnione ...................................................k...................................................k.612
Tworzenie zdarzeń opóźnionych w BeanShell ...................................................k......615
Łączymy wszystko razem ...................................................k............................................616
Rozszerzenia...................................................k...................................................k..............617
Podsumowanie ...................................................k...................................................k..........619
Rozdział 15. Trwałość — zapisywanie gry ........................................................... 621
Podstawy zapisywania gier ...................................................k..........................................621
Wykorzystanie API serializacji do zapisywania stanu gry .............................................623
Wprowadzenie do serializacji ...................................................k................................623
Serializacja: podstawy ...................................................k...........................................623
Serializacja: zasady...................................................k................................................626
Serializacja: pułapki...................................................k...............................................629
Zmiana domyślnego działania mechanizmu serializacji...........................................633
Tworzenie zrzutu ekranu gry...................................................k........................................636
Tworzenie miniatury ze zrzutem ekranu...................................................k................638
Zapisywanie rysunku ...................................................k.............................................639
Zapisywanie gier we właściwym miejscu...................................................k....................641
Podsumowanie ...................................................k...................................................k..........642
12
Java. Tworzenie gier
Część III Optymalizacja i kończenie gry .......................................643
Rozdział 16. Techniki optymalizacji..................................................................... 645
HotSpot..............................................k...................................................k.......................
Zasady optymalizacji...................................................k...................................................k.646
Profilowanie ...................................................k...................................................k..............646
Testowanie wydajności...................................................k..........................................647
Użycie programu profilującego HotSpot ...................................................k...............647
....651
Optymalizacje specyficzne dla języka Java...................................................k...........652
Eliminacja nieużywanego kodu ...................................................k.............................652
Wyciąganie niezmienników pętli...................................................k...........................653
Eliminacja wspólnych podwyrażeń ...................................................k.......................653
Propagacja stałych ...................................................k.................................................653
Rozwijanie pętli (tylko maszyna wirtualna server) ..................................................654
Metody inline ...................................................k...................................................k......654
Sztuczki optymalizacji ...................................................k.................................................655
Algorytmy ...................................................k...................................................k...........655
Zmniejszanie siły operacji: przesuwanie bitów ...................................................k.....656
Zmniejszanie siły operacji: reszta z dzielenia...................................................k........657
Zmniejszanie siły operacji: mnożenie...................................................k....................657
Zmniejszanie siły operacji: potęgowanie...................................................k...............658
Więcej na temat wyciągania niezmienników pętli...................................................k.658
Tablice wartości funkcji...................................................k.........................................659
Arytmetyka stałoprzecinkowa ...................................................k...............................662
Wyjątki...................................................k...................................................k................662
Wejście-wyjście ...................................................k...................................................k..662
Pliki mapowane w pamięci ...................................................k....................................663
Wykorzystanie pamięci i zbieranie nieużytków...................................................k...........664
Sterta Java oraz zbieranie nieużytków...................................................k...................664
Monitorowanie zbierania nieużytków...................................................k....................665
Monitorowanie użycia pamięci...................................................k..............................666
Dostrajanie sterty ...................................................k...................................................k670
Dostrajanie procesu zbierania nieużytków ...................................................k............671
Redukowanie tworzenia obiektów...................................................k.........................672
Ponowne wykorzystanie obiektów ...................................................k........................672
Pule obiektów...................................................k...................................................k......673
Zauważalna wydajność ...................................................k................................................674
Rozdzielczość zegara ...................................................k.............................................674
Podsumowanie ...................................................k...................................................k..........679
Rozdział 17. Tworzenie dźwięków i grafiki gry ..................................................... 681
Wybór wyglądu i sposobu działania gry ...................................................k......................682
Szukanie inspiracji ...................................................k.................................................682
Zachowywanie spójności ...................................................k.......................................683
Zdobywanie darmowych materiałów do gry...................................................k................683
Praca z grafikami i autorami dźwięków...................................................k.......................684
Narzędzia...................................................k...................................................k...................685
Tworzenie dźwięków ...................................................k...................................................k685
Formaty plików dźwiękowych...................................................k...............................687
Tworzenie tekstur i duszków...................................................k........................................687
Formaty plików graficznych ...................................................k..................................688
Tworzenie tekstur bezszwowych ...................................................k...........................689
Tworzenie tekstur zastępczych ...................................................k..............................690
Spis treści
13
Tworzenie tekstur przejściowych ...................................................k..........................691
Tworzenie wielopoziomowych tekstur ...................................................k..................692
Tworzenie obrazów tytułowych i grafiki dla wyświetlaczy HUD..................................694
Tworzenie grafiki interfejsu użytkownika ...................................................k...................694
Dostosowywanie komponentów Swing...................................................k.................694
Tworzenie własnych czcionek ...................................................k.....................................696
Podsumowanie ...................................................k...................................................k..........701
Rozdział 18. Projekt gry i ostatnie 10 prac ....................................................... 703
Ostatnie 10 prac ...................................................k...................................................k.....704
Efekty...................................................k...................................................k..................704
Maszyna stanów gry ...................................................k..............................................705
Elementy projektu gry...................................................k..................................................711
Środowiska...................................................k...................................................k..........712
Fabuła...................................................k...................................................k..................712
Właściwa gra...................................................k...................................................k.......714
Uczenie gracza sposobu gry...................................................k...................................716
Tworzenie edytora map...................................................k................................................717
Szukanie błędów ...................................................k...................................................k.......719
Problemy z szukaniem błędów w Java2D ...................................................k.............722
Rejestrowanie zdarzeń ...................................................k...........................................723
Ochrona kodu ...................................................k...................................................k............725
Dystrybucja gry ...................................................k...................................................k.........726
Dystrybucja gry za pomocą Java Web Start...................................................k.................728
Pobieranie zasobów z plików .jar ...................................................k..........................728
Podpisywanie plików .jar...................................................k.......................................728
Tworzenie pliku JNLP ...................................................k...........................................729
Konfigurowanie serwera WWW...................................................k............................731
Dystrybucja gry w postaci kompilacji natywnej ...................................................k..........732
Aktualizacje i łatki ...................................................k...................................................k....733
Problem obciążenia serwera...................................................k.........................................733
Opinie użytkowników i testy beta...................................................k................................734
Zarabianie pieniędzy ...................................................k...................................................k.736
Łączymy wszystko razem ...................................................k............................................737
Podsumowanie ...................................................k...................................................k..........737
Rozdział 19. Przyszłość ...................................................................................... 739
Ewolucja Javy ...................................................k...................................................k...........739
Java Community Process ...................................................k.......................................740
Bug Parade ...................................................k...................................................k..........740
Przyszłość: Java 1.5 „Tiger” ...................................................k........................................740
Szablony (JSR 14)...................................................k..................................................741
Wyliczenia (JSR 201) ...................................................k............................................742
Statyczne importowanie (JSR 201)...................................................k........................743
Poprawiona pętla for (JSR 201)...................................................k.............................744
Interfejs API kompilatora (JSR 199) ...................................................k.....................744
Format transferu sieciowego (JSR 200)...................................................k.................745
Współdzielona maszyna wirtualna (JSR 121) ...................................................k.......745
Wymagania stawiane platformie Java...................................................k..........................746
Potrzebne: więcej opcji dla obsługi myszy i klawiatury...........................................746
Potrzebne: obsługa joysticka...................................................k..................................747
Potrzebne: przyspieszane sprzętowo, półprzezroczyste obrazy................................747
Potrzebne: dokładniejszy zegar...................................................k..............................747
14
Java. Tworzenie gier
Potrzebne: grafika przyspieszana sprzętowo i tryb pełnoekraknowy
w systemie Linux...................................................k.................................................748
Potrzebne: trójwymiarowa grafika przyspieszana sprzętowo,k
włączona do środowiska Javy ...................................................k.............................748
Potrzebne: optymalizacja rozkazów SIMD w maszynie HotSpot ............................749
Pożądane: więcej opcji wygładzania czcionek ...................................................k......750
Pozostałe możliwości...................................................k.............................................752
Nowe urządzenia i Javy Games Profile (JSR 134) ...................................................k......752
Podsumowanie ...................................................k...................................................k..........753
Dodatki ...................................................d....................................755
Skorowidz....................................................................................... 757
Rozdział 11.
Wykrywanie kolizji
W tym rozdziale:
Podstawy kolizji.
Kolizje typu obiekt-obiekt.
Kolizje typu obiekt-świat.
Prosty program demonstracyjny wykrywający kolizje.
Obsługa kolizji z przesuwaniem.
Program demonstracyjny obsługujący kolizje z przesuiwaniem.
Rozszerzenia.
Podsumowanie.
Pamiętasz grę Pong?
Niezależnie od tego, czy mamy do czynienia z piłeczką odbijaną rakietkami, laserem
trafiającym robota, poszukiwaczem skarbów wpadającym w pułapkę, bohaterem znaj-
dującym dodatkową amunicję, dwoma walczącymi potworami czy po prostu z graczem
idącym przy ścianie — niemal w każdej grze trzeba zastosować jakiś mechanizm wy-
krywania kolizji.
W rozdziale 5., „Tworzenie dwuwymiarowej gry platformowej”, stworzyliśmy prosty
dwuwymiarowy system wykrywania kolizji, który świetnie się sprawdzał w przypad-
ku nieskomplikowanej gry dwuwymiarowej. W tym rozdziale spróbujemy rozszerzyć
omówione tam zagadnienia i więcej czasu poświęcić na wykrywanie kolizji pomiędzy
obiektami (typu obiekt-obiekt) oraz pomiędzy obiektami a wielokątami przechowywa-
nymi w drzewach BSP (typu obiekt-świat).
Zajmiemy się także niemniej ważnym zagadnieniem wyboru sposobu obsługi kolizji po
jej wykryciu, np. poruszaniem się wzdłuż ścian lub umożliwieniem obiektom w grze
samodzielnej obsługi swojego zachowania w przypadku ikolizji.
490
Część II ♦ Grafika trójwymiarowa i zaawansowane techniki progIramowania gier
Podstawy kolizji
Wykrywanie kolizji, wbrew nazwie, tak naprawdę nie sprowadza się do samego wykry-
wania. Z kolizjami związane są trzy interesujące nas zagadnienia:
Decydowanie, które kolizje chcemy wykrywać. Byłoby stratą czasu testowanie,
czy dwa obiekty ze sobą nie kolidują, jeśli znajdujią się na dwóch różnych krańcach
świata przedstawionego w grze. Należy się także zastaniowić, czy w świecie
z 1 000 poruszających się obiektów ma sens testowanie wiystąpienia kolizji
pomiędzy każdą parą obiektów — czyli w sumie 999 000 testóiw? Powinniśmy
więc próbować maksymalnie ograniczyć liczbę obiektów, wi przypadku których
staramy się wykryć wystąpienie zdarzenia kolizji. Najiprostszym sposobem
na wprowadzenie takiego ograniczenia jest testowaniie tylko obiektów
znajdujących się stosunkowo blisko gracza.
Wykrywanie kolizji. Wybór techniki wykrywania kolizji zależy od oczekiiwanej
dokładności kolizji w grze. Można oczywiście zastosowiać doskonały algorytm
wykrywania kolizji i sprawdzać wszystkie wielokąty inależące do obiektu
ze wszystkimi wielokątami tworzącymi inny obiekt, niależy jednak brać pod
uwagę związany z takim działaniem koszt obliczeniowyi. Podobnie, w świecie
dwuwymiarowym moglibyśmy testować ewentualne kolizjie wszystkich pikseli
jednego dwuwymiarowego obiektu ze wszystkimi pikseliami innego obiektu.
W grach komputerowych stosuje się zwykle mniej dokładine techniki wykrywania
kolizji, które jednak wykonują swoje zadanie znaczniie szybciej.
Obsługa kolizji. Jeśli dany obiekt koliduje z innym elementem sceniy, należy
być przygotowanym na różne sposoby obsługi różnych typówi kolizji. Przykładowo,
pocisk kolidujący z robotem może spowodować zniszczeinie zarówno pocisku,
jak i robota. Obiekt dochodzący do ściany może się dailej przemieszczać wzdłuż
tej ściany. Podobnych przykładów jest wiele.
Podsumujmy — w grze powinny być podejmowane próby realizowania następujących
celów w zakresie wykrywania kolizji:
eliminowanie jak najwięcej testów wystąpienia kolizjii;
szybkie podejmowanie decyzji, czy kolizja wystąpiła;
zapewnianie mechanizmu wykrywania kolizji o wystarcizającej precyzji;
obsługiwanie kolizji w naturalny sposób, który nie będizie niepotrzebnie zwracał
uwagi gracza podczas gry.
Ostatni cel oznacza także to, że nie powinniśmy zbytnio ograniczać możliwości ruchu
gracza podczas gry. Przykładowo gracz nie powinien być całkowicie zatrzymywany po
kolizji ze ścianą. Zamiast tego powinniśmy umożliwić mu poruszanie się wzdłuż ściany
lub spowodować jego nieznaczne odbicie.
Nie chcemy także, by nasz mechanizm wykrywania kolizji był na tyle niedokładny, by
gracz mógł oszukiwać, np. chowając się w ścianie w niekitórych miejscach mapy.
Rozdział 11. ♦ Wykrywanie kolizji
491
Zaczniemy od prostego algorytmu wykrywania kolizji. Wszystkie poruszające się ele-
menty w grze będziemy traktować jak obiekty, niezależnie od tego, czy będzie to po-
twór, gracz, pocisk lub cokolwiek innego. W przypadku każdego tak ogólnie zdefinio-
wanego obiektu będziemy wykonywali następujące kroki:
1. Zaktualizuj położenie obiektu.
2. Sprawdź, czy nie występuje kolizja z innymi obiektami ilub z elementami
środowiska.
3. Jeśli wykryto kolizję, ustaw obiekt na jego wcześniejiszej pozycji.
Zauważ, że po każdym ruchu obiektu sprawdzamy, czy nie wystąpiła kolizja. Alterna-
tywnym rozwiązaniem jest przeniesienie w nowe miejsca wszystkich obiektów i dopiero
potem sprawdzenie występowania ewentualnych kolizji. W takim przypadku należałoby
jednak przechowywać dane o poprzednich położeniach wszystkich obiektów — poja-
wiłby się problem, gdyby się okazało, że trzy lub więcej obiektów powoduje kolizje.
Zauważ także, że ten podstawowy algorytm w przypadku wystąpienia kolizji po prostu
odstawia obiekt na jego wcześniejsze położenie. Zwykle będziemy chcieli stosować
inne sposoby obsługi kolizji, zależne od ich typu.
Skoro podstawowy algorytm został już omówiony, przejdźmy do wykrywania i obsługi
kolizji typu obiekt-obiekt w praktyce.
Kolizje typu obiekt-obiekt
Niezależnie od tego, jakiej precyzji oczekujemy od stosowanego algorytmu wykry-
wania kolizji, idealnym rozwiązaniem jest wyeliminowanie maksymalnej liczby testów
kolizji typu obiekt-obiekt i wcześniejsze wykonanie kilku innych testów, wskazujących
na duże prawdopodobieństwo wystąpienia kolizji pomiędizy parą obiektów.
Eliminowanie testów
Jest oczywiste, że w przypadku obiektu, który nie wykonuje żadnego ruchu od ostatniej
klatki, nie są potrzebne żadne testy wykrywające kolizję powodowaną przez ten obiekt.
Przykqładowo skrzynia znajdująca się w pomieszczeniu nie może powodować kolizji
z żadnym innym elementem sceny. Inne obiekty mogą oczywiście kolidować z tą skrzy-
nią, jednak takie kolizje są obsługiwane przez te obiiekty, a nie przez statyczną skrzynię.
Aby wyeliminować maksymalną liczbę przyszłych testów na występowanie kolizji, po-
winniśmy ograniczyć zbiór badanych obiektów do tych, które znajdują się w swoim bez-
pośrednim sąsiedztwie.
Jednym ze sposobów takiej eliminacji jest przyporządkowanie obiektów do pól specjal-
nej siatki (patrz rysunek 11.1). Każdy obiekt musi należeć do dokładnie jednego z ta-
kich pól. Nawet jeśli obiekt częściowo zajmuje obszar wielu pól, trzeba zdecydować
492
Część II ♦ Grafika trójwymiarowa i zaawansowane techniki progIramowania gier
Rysunek 11.1.
Aby ograniczyć liczbę
testów na występowanie
kolizji typu obiekt-obiekt,
możemy przyporządkować
obiekty do pól siatki
i wykonywać testy dla
obiektów znajdujących
się w tych samych
i sąsiadujących polach
o jego przyporządkowaniu do dokładnie jednego z nich. Dzięki temu obiekt będzie mu-
siał testować wystąpienie kolizji wyłącznie z obiektami z pola, w którym się znajduje,
oraz z pól sąsiadujących z tym polem.
Innymi sposobami izolowania obiektów jest tworzenie siatek jedno- i trójwymiarowych.
Przykładowo, w dwuwymiarowej grze przewijanej, obiekty można posortować zgod-
nie z ich współrzędną x, dzięki czemu będzie można wykonywać testy tylko dla obiek-
tów sąsiadujących na liście. W przypadku gier trójwymiarowych obiekty można od-
izolować za pomocą siatki trójwymiarowej zamiast dwuwymiarowej — każda komórka
będzie wówczas miała kształt sześcianu, nie kwadratu. W tym rozdziale do wykrywa-
nia kolizji w grach z mechanizmem trójwymiarowym będziemy jednak stosowali siatkę
w prostszej wersji dwuwymiarowej.
Izolowanie obiektów za pomocą siatki umożliwia także łatwe usuwanie obiektów ze
sceny. Przykładowo możemy zastosować rozwiązanie, w którym rysowane są tylko
obiekty w widocznych
Pobierz darmowy fragment (pdf)