SlideShare a Scribd company logo
1 of 45
Download to read offline
IDZ DO
         PRZYK£ADOWY ROZDZIA£

                           SPIS TRE CI   Java. Tworzenie gier
                                         Autorzy: David Brackeen, Bret Barker, Laurence Vanhelsuwe
           KATALOG KSI¥¯EK               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)
                      KATALOG ONLINE
                                         ISBN: 83-7361-411-7
                                         Tytu³ orygina³u: Developing Games in Java
       ZAMÓW DRUKOWANY KATALOG           Format: B5, stron: 756
                                         Przyk³ady na ftp: 4924 kB
              TWÓJ KOSZYK                                    Wykorzystaj do tworzenia gier
                    DODAJ DO KOSZYKA              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
         CENNIK I INFORMACJE             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
                   ZAMÓW INFORMACJE      brakowa³o jednak twórców gier i aplikacji „rozrywkowych”. Dotychczas w Javie
                     O NOWO CIACH        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
                       ZAMÓW CENNIK      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
                 CZYTELNIA               sprzêtowo i przestrzennym d wiêkiem.
                                         „Java. Tworzenie gier” to ksi¹¿ka o programowaniu gier, na jak¹ czeka³e . Zawiera
          FRAGMENTY KSI¥¯EK ONLINE       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
Wydawnictwo Helion                          • Mapowanie tekstur i symulacja o wietlenia
ul. Chopina 6                               • Drzewa BSP
44-100 Gliwice                              • Algorytmy detekcji kolizji i wykrywania drogi
tel. (32)230-98-63                          • Sztuczna inteligencja i tworzenie botów
e-mail: helion@helion.pl                    • 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? ...............................................................................................................28
               Tworzenie i uruchamianie wątków w języku Java............................................................28
                   Rozszerzanie klasy Thread .........................................................................................29
                   Implementacja interfejsu Runnable ............................................................................29
                   U ycie anonimowej klasy wewnętrznej......................................................................29
                   Oczekiwanie na zakończenie wątku ...........................................................................30
                   Uśpione wątki .............................................................................................................30
               Synchronizacja ..................................................................................................................30
                   Po co nam synchronizacja?.........................................................................................30
                   Jak synchronizować? ..................................................................................................31
                   Kiedy nale y synchronizować?...................................................................................32
                   Kiedy nie synchronizować? ........................................................................................33
                   Unikanie zakleszczeń..................................................................................................33
               U ycie wait() oraz notify()................................................................................................34
               Model zdarzeń Javy...........................................................................................................35
               Kiedy u ywać wątków? ....................................................................................................36
               Kiedy nie u ywać wątków?...............................................................................................36
               Podsumowanie: pule wątków............................................................................................36
               Podsumowanie ..................................................................................................................41
Rozdział 2. Grafika 2D oraz animacja ................................................................. 43
               Grafika pełnoekranowa .....................................................................................................44
                  Układ ekranu...............................................................................................................44
                  Kolor piksela i głębia koloru.......................................................................................45
                  Częstotliwość odświe ania .........................................................................................46
                  Przełączanie do trybu pełnoekranowego ....................................................................46
                  Anti-aliasing................................................................................................................50
                  Który tryb graficzny nale y zastosować? ...................................................................51
               Rysunki..............................................................................................................................52
                  Przezroczystość...........................................................................................................52
                  Formaty plików...........................................................................................................52
                  Odczytywanie rysunków.............................................................................................53
6                                                                                                                Java. Tworzenie gier


                 Rysunki przyspieszane sprzętowo ..............................................................................56
                 Program testujący wydajność rysowania rysunków ...................................................58
                 Animacja .....................................................................................................................61
                 Renderowanie aktywne...............................................................................................64
                 Pętla animacji..............................................................................................................64
              Usuwanie migotania i szarpania........................................................................................67
                 Podwójne buforowanie ...............................................................................................67
                 Przełączanie stron .......................................................................................................68
                 Odświe anie monitora i szarpanie ..............................................................................70
                 Klasa BufferStrategy...................................................................................................70
                 Tworzenie zarządcy ekranów .....................................................................................71
                 Duszki .........................................................................................................................78
              Proste efekty......................................................................................................................84
                 Przekształcenia rysunków...........................................................................................84
              Podsumowanie ..................................................................................................................89
Rozdział 3. Interaktywność i interfejs użytkownika ............................................. 91
              Model zdarzeń AWT.........................................................................................................94
              Zdarzenia klawiatury.........................................................................................................95
              Zdarzenia myszy ...............................................................................................................99
              Przesuwanie myszy metodą „rozglądania się”................................................................103
                  Ukrywanie wskaźnika myszy ...................................................................................107
              Tworzenie klasy InputManager.......................................................................................108
              Zastosowanie obiektu InputManager ..............................................................................119
                  Zatrzymywanie gry ...................................................................................................119
                  Dodajemy grawitację ................................................................................................120
              Projektowanie intuicyjnych interfejsów u ytkownika ....................................................125
                  Wskazówki do projektu interfejsu u ytkownika.......................................................126
              Wykorzystanie komponentów Swing..............................................................................127
                  Podstawy Swing........................................................................................................127
                  Stosowanie Swing w trybie pełnoekranowym..........................................................128
              Tworzenie prostego menu ...............................................................................................130
              Konfiguracja klawiatury przez u ytkownika ..................................................................135
              Podsumowanie ................................................................................................................141
Rozdział 4. Efekty dźwiękowe oraz muzyka....................................................... 143
              Podstawy dźwięku...........................................................................................................144
              API Java Sound ...............................................................................................................144
                 Otwieranie pliku dźwiękowego ................................................................................145
                 Zastosowanie interfejsu Line ....................................................................................145
              Odtwarzanie dźwięków ...................................................................................................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 .....................................................................................................159
                 Mechanizmy potrzebne do tworzenia filtra 3D ........................................................160
                 Implementacja filtra 3D ............................................................................................161
                 Testowanie filtra 3D .................................................................................................163
              Tworzenie obiektu zarządzającego dźwiękiem...............................................................167
                 Klasa Sound ..............................................................................................................167
                 Klasa SoundManager ................................................................................................168
                 Zmienne lokalne dla wątków ....................................................................................175
              Odtwarzanie muzyki .......................................................................................................176
                 Odtwarzanie dźwięku CD .........................................................................................177
                 Odtwarzanie plików MP3 i Ogg Vorbis ...................................................................177
Spis treści                                                                                                                                      7


                  Odtwarzanie muzyki MIDI .......................................................................................178
                  Tworzenie muzyki adaptacyjnej ...............................................................................182
               Podsumowanie ................................................................................................................184
Rozdział 5. Tworzenie dwuwymiarowej gry platformowej ................................... 185
               Tworzenie mapy zło onej z kafelków.............................................................................186
                  Implementacja mapy korzystającej z kafelków ........................................................187
                  Ładowanie mapy zło onej z kafelków......................................................................190
                  Rysowanie mapy zło onej z kafelków......................................................................193
                  Rysowanie duszków..................................................................................................195
                  Przewijanie z paralaksą.............................................................................................195
                  Premie .......................................................................................................................197
                  Proste obiekty wrogów .............................................................................................200
               Wykrywanie kolizji .........................................................................................................207
                  Detekcja kolizji .........................................................................................................207
                  Obsługa kolizji ..........................................................................................................208
                  Kolizje duszków........................................................................................................212
               Dokończenie i przyspieszanie gry...................................................................................213
               Tworzenie wykonywalnego pliku .jar.............................................................................213
               Pomysły na rozszerzenie gry...........................................................................................215
               Podsumowanie ................................................................................................................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 ............................................................................220
                  Kanały .......................................................................................................................220
                  Bufory .......................................................................................................................223
                  Selektory oraz klasy SelectionKey ...........................................................................226
               ChatterBox, prosta aplikacja dla wielu u ytkowników...................................................227
                  Serwer: ChatterServer...............................................................................................227
                  Kompilowanie i uruchamianie serwera ....................................................................233
                  Klient: ChatterClient.................................................................................................235
                  Kompilowanie i uruchamianie klienta ......................................................................236
               Szkielet serwera gry wieloosobowej ...............................................................................237
                  Cele projektu i taktyka ..............................................................................................237
                  Projekt .......................................................................................................................238
                  Wspólne klasy i interfejsy.........................................................................................242
                  Implementacja serwera .............................................................................................244
                  Klient.........................................................................................................................252
               Przykładowa gra: RPS (kamień, papier, no yczki).........................................................253
                  Klasy .........................................................................................................................253
                  Uruchamianie gry RPS .............................................................................................256
               Wykończanie gry: rozbudowa szkieletu .........................................................................258
                  Interfejs klienta .........................................................................................................258
                  Trwałość....................................................................................................................258
                  Listy znajomych, pokoje i czat .................................................................................258
               Administracja serwera.....................................................................................................259
                  Rejestracja zdarzeń ...................................................................................................259
                  Uruchamianie i wyłączanie.......................................................................................260
                  Konsole administracyjne serwera .............................................................................261
                  Śledzenie gry.............................................................................................................261
               Zagadnienia zaawansowane ............................................................................................262
                  Rozłączenia i ponowne połączenia ...........................................................................262
                  Tunelowanie HTTP...................................................................................................263
8                                                                                                                 Java. Tworzenie gier


                  Testowanie za pomocą botów...................................................................................265
                  Te nieznośne modemy ..............................................................................................266
                  Profilowanie i tworzenie statystyk wydajności.........................................................266
                  Dostrajanie wydajności.............................................................................................268
               Podsumowanie ................................................................................................................270

Część II       Grafika trójwymiarowa
               i zaawansowane techniki programowania gier ...............271
Rozdział 7. Grafika trójwymiarowa ................................................................... 273
               Typy renderowania grafiki trójwymiarowej ...................................................................274
               Nie zapominajmy o matematyce .....................................................................................275
                   Trygonometria i trójkąty prostokątne .......................................................................276
                   Wektory.....................................................................................................................276
               Podstawy grafiki trójwymiarowej ...................................................................................281
               Algebra trzech wymiarów ...............................................................................................284
               Wielokąty ........................................................................................................................289
               Przekształcenia przestrzeni trójwymiarowej...................................................................292
                   Rotacje ......................................................................................................................293
                   Hermetyzacja przekształceń rotacji i translacji.........................................................295
                   Stosowanie transformacji..........................................................................................298
                   Porządek rotacji ........................................................................................................300
               Prosty potok tworzenia grafiki 3D ..................................................................................301
               Ruch kamery ...................................................................................................................305
               Bryły i usuwanie niewidocznych powierzchni................................................................305
                   Iloczyn skalarny wektorów .......................................................................................307
                   Iloczyn wektorowy wektorów...................................................................................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.....................................................................................321
               Ostateczny potok renderowania ......................................................................................324
               Podsumowanie ................................................................................................................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............................................................................340
                  Wady naszego prostego mechanizmu renderującego ...............................................347
               Optymalizowanie mapowania tekstur .............................................................................348
                  Przechowywanie tekstur ...........................................................................................349
                  Prosta optymalizacja .................................................................................................352
                  Rozwijanie metod w miejscu wywołania .................................................................356
                  Przykładowy program korzystający z szybkiego mapowania tekstur ......................358
               Prosty mechanizm generowania oświetlenia...................................................................359
                  Odbicie rozproszone .................................................................................................359
                  Światło otoczenia ......................................................................................................360
                  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ą....................................................360
                  Implementowanie punktowego źródła światła..........................................................361
               Implementowanie oświetlania tekstur.............................................................................362
               Tworzenie zaawansowanych trików oświetleniowych za pomocą map cieniowania.....369
                  Odnajdywanie prostokąta ograniczającego...............................................................369
                  Stosowanie mapy cieniowania..................................................................................371
Spis treści                                                                                                                                     9


                  Budowanie mapy cieniowania ..................................................................................373
                  Budowanie powierzchni............................................................................................375
                  Przechowywanie powierzchni w pamięci podręcznej ..............................................378
                  Przykład z cieniowaniem powierzchni .....................................................................384
               Dodatkowe pomysły........................................................................................................385
                  Sugerowanie głębi.....................................................................................................385
                  Fałszywe cienie.........................................................................................................386
                  Mapowanie MIP........................................................................................................386
                  Interpolacja dwuliniowa............................................................................................386
                  Interpolacja trójliniowa.............................................................................................387
                  Mapy wektorów normalnych i mapy głębokości......................................................387
                  Inne typy oświetlenia ................................................................................................388
               Podsumowanie ................................................................................................................388
Rozdział 9. Obiekty trójwymiarowe................................................................... 389
               Usuwanie ukrytych powierzchni.....................................................................................390
                  Algorytm malarza .....................................................................................................390
                  Odwrotny algorytm malarza .....................................................................................391
                  Z-bufor ......................................................................................................................391
                  Z-bufor z wartościami 1/z.........................................................................................393
                  Obliczanie z-głębokości............................................................................................396
               Animacja trójwymiarowa................................................................................................397
                  Ruch postępowy........................................................................................................400
                  Ruch obrotowy..........................................................................................................402
               Grupy wielokątów ...........................................................................................................407
                  Iteracyjna obsługa wszystkich wielokątów nale ących do grupy.............................411
               Wczytywanie grup wielokątów z pliku OBJ...................................................................413
                  Format pliku OBJ......................................................................................................414
                  Format pliku MTL ....................................................................................................420
               Obiekty w grze ................................................................................................................421
               Zarządzanie obiektami w grze.........................................................................................425
               Łączenie elementów........................................................................................................427
               Mo liwe rozszerzenia w przyszłości...............................................................................433
               Podsumowanie ................................................................................................................434
Rozdział 10. Zarządzanie sceną trójwymiarową za pomocą drzew BSP ................ 435
               Wprowadzenie do drzew BSP.........................................................................................436
               Podstawy drzew binarnych..............................................................................................437
               Jednowymiarowe drzewo BSP........................................................................................440
               Dwuwymiarowe drzewo BSP .........................................................................................442
                  Przykład budowy drzewa BSP..................................................................................443
                  Przykład przeglądania drzewa BSP ..........................................................................447
               Implementacja dwuwymiarowego drzewa BSP..............................................................448
                  Linia podziału BSP ...................................................................................................450
                  Wyznaczanie poło enia punktu względem linii .......................................................450
                  Dwójkowy podział wielokąta ...................................................................................454
                  Przeglądanie drzewa BSP .........................................................................................455
                  Przeglądanie poprzeczne...........................................................................................457
                  Przeglądanie od przodu do tyłu.................................................................................458
                  Budowa drzewa.........................................................................................................459
                  Znajdowanie punktu przecięcia dwóch prostych......................................................463
                  Przycinanie wielokątów do linii................................................................................465
                  Usuwanie pustych przestrzeni T-złączy....................................................................467
                  Testowanie drzewa BSP ...........................................................................................469
10                                                                                                                 Java. Tworzenie gier


                Rysowanie wielokątów od przodu do tyłu ......................................................................471
                Pierwszy przykład wykorzystania drzewa BSP ..............................................................479
                Rysowanie obiektów na scenie .......................................................................................480
                Wczytywanie map z pliku ...............................................................................................482
                Łączenie elementów........................................................................................................486
                Rozszerzenia....................................................................................................................486
                Podsumowanie ................................................................................................................488
Rozdział 11. Wykrywanie kolizji ......................................................................... 489
                Podstawy kolizji ..............................................................................................................490
                Kolizje typu obiekt-obiekt...............................................................................................491
                   Eliminowanie testów.................................................................................................491
                   Sfery otaczające ........................................................................................................493
                   Walce otaczające.......................................................................................................495
                   Problem przetwarzania dyskretno-czasowego..........................................................498
                Kolizje typu obiekt-świat ................................................................................................499
                   Prostopadłościany otaczające, wykorzystywane do wykrywania kolizji
                     z podłogami ............................................................................................................499
                   Znajdowanie liścia drzewa BSP dla danego poło enia.............................................500
                   Implementacja testów wysokości podłogi i sufitu ....................................................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 .................................................................................................508
                   Implementacja wykrywania kolizji typu obiekt-świat..............................................509
                Prosty program demonstracyjny wykrywający kolizje ...................................................511
                Obsługa kolizji z przesuwaniem .....................................................................................512
                   Przesuwanie obiektu wzdłu innego obiektu............................................................512
                   Przesuwanie obiektu wzdłu ściany..........................................................................515
                   Grawitacja i płynny ruch na schodach (przesuwanie obiektu wzdłu podłogi)........517
                   Skakanie....................................................................................................................520
                Program demonstracyjny obsługujący kolizje z przesuwaniem .....................................521
                Rozszerzenia....................................................................................................................522
                Podsumowanie ................................................................................................................522
Rozdział 12. Odnajdywanie drogi w grze ............................................................. 523
                Podstawowa wiedza na temat technik odnajdywania drogi ............................................524
                Pierwsze przymiarki do odnajdywania drogi w grze ......................................................524
                    Przeszukiwanie wszerz .............................................................................................527
                Podstawy algorytmu A* ..................................................................................................530
                Stosowanie algorytmu A* w grze ...................................................................................535
                Algorytm A* w połączeniu z drzewami BSP..................................................................536
                    Przejścia ....................................................................................................................536
                    Implementowanie portali ..........................................................................................537
                Uniwersalny mechanizm odnajdywania drogi ................................................................541
                Przygotowywanie robota PathBot...................................................................................545
                Sposoby ulepszania przeszukiwania A* .........................................................................549
                Podsumowanie ................................................................................................................550
Rozdział 13. Sztuczna inteligencja ..................................................................... 551
                Podstawy sztucznej inteligencji ......................................................................................552
                Pozbawianie botów ich boskiej mocy .............................................................................553
                   „Widzenie”................................................................................................................554
                   „Słyszenie”................................................................................................................556
Spis treści                                                                                                                                       11


                Maszyny stanów i obsługa reakcji ..................................................................................559
                Maszyny probabilistyczne...............................................................................................561
                    Przydatne funkcje generujące liczby losowe ............................................................563
                Podejmowanie decyzji.....................................................................................................564
                Wzorce ............................................................................................................................566
                    Unikanie....................................................................................................................567
                    Atakowanie ...............................................................................................................569
                    Uciekanie ..................................................................................................................572
                    Celowanie .................................................................................................................573
                    Strzelanie...................................................................................................................574
                Tworzenie obiektów........................................................................................................575
                Łączenie elementów........................................................................................................576
                    Mózgi!.......................................................................................................................576
                    Zdrowie i umieranie..................................................................................................577
                    Dodawanie HUD-a....................................................................................................581
                Uczenie się ......................................................................................................................585
                    Wskrzeszanie botów .................................................................................................586
                    Uczenie się botów .....................................................................................................588
                    Rozszerzenia programu demonstracyjnego ..............................................................593
                Inne podejścia do sztucznej inteligencji..........................................................................593
                    Zespołowa sztuczna inteligencja...............................................................................594
                Podsumowanie ................................................................................................................594
Rozdział 14. Skrypty gry.................................................................................... 595
                Ksią ka kucharska skryptów: czego potrzebujemy ........................................................596
                Implementacja powiadomień wejścia i wyjścia ..............................................................597
                   Wyzwalacze ..............................................................................................................599
                Nasłuch obiektów gry......................................................................................................600
                Skrypty ............................................................................................................................604
                   Projektowanie skryptu ..............................................................................................606
                   Wbudowywanie BeanShell.......................................................................................608
                Zdarzenia opóźnione .......................................................................................................612
                   Tworzenie zdarzeń opóźnionych w BeanShell .........................................................615
                Łączymy wszystko razem ...............................................................................................616
                Rozszerzenia....................................................................................................................617
                Podsumowanie ................................................................................................................619
Rozdział 15. Trwałość — zapisywanie gry .......................................................... 621
                Podstawy zapisywania gier .............................................................................................621
                Wykorzystanie API serializacji do zapisywania stanu gry .............................................623
                   Wprowadzenie do serializacji ...................................................................................623
                   Serializacja: podstawy ..............................................................................................623
                   Serializacja: zasady...................................................................................................626
                   Serializacja: pułapki..................................................................................................629
                   Zmiana domyślnego działania mechanizmu serializacji...........................................633
                Tworzenie zrzutu ekranu gry...........................................................................................636
                   Tworzenie miniatury ze zrzutem ekranu...................................................................638
                   Zapisywanie rysunku ................................................................................................639
                Zapisywanie gier we właściwym miejscu.......................................................................641
                Podsumowanie ................................................................................................................642
12                                                                                                                 Java. Tworzenie gier


Część III Optymalizacja i kończenie gry.......................................643
Rozdział 16. Techniki optymalizacji.................................................................... 645
               Zasady optymalizacji.......................................................................................................646
               Profilowanie ....................................................................................................................646
                   Testowanie wydajności.............................................................................................647
                   U ycie programu profilującego HotSpot ..................................................................647
               HotSpot............................................................................................................................651
                   Optymalizacje specyficzne dla języka Java ..............................................................652
                   Eliminacja nieu ywanego kodu ................................................................................652
                   Wyciąganie niezmienników pętli..............................................................................653
                   Eliminacja wspólnych podwyra eń ..........................................................................653
                   Propagacja stałych ....................................................................................................653
                   Rozwijanie pętli (tylko maszyna wirtualna server) ..................................................654
                   Metody inline ............................................................................................................654
               Sztuczki optymalizacji ....................................................................................................655
                   Algorytmy .................................................................................................................655
                   Zmniejszanie siły operacji: przesuwanie bitów ........................................................656
                   Zmniejszanie siły operacji: reszta z dzielenia...........................................................657
                   Zmniejszanie siły operacji: mno enie.......................................................................657
                   Zmniejszanie siły operacji: potęgowanie..................................................................658
                   Więcej na temat wyciągania niezmienników pętli....................................................658
                   Tablice wartości funkcji............................................................................................659
                   Arytmetyka stałoprzecinkowa ..................................................................................662
                   Wyjątki......................................................................................................................662
                   Wejście-wyjście ........................................................................................................662
                   Pliki mapowane w pamięci .......................................................................................663
               Wykorzystanie pamięci i zbieranie nieu ytków..............................................................664
                   Sterta Java oraz zbieranie nieu ytków ......................................................................664
                   Monitorowanie zbierania nieu ytków.......................................................................665
                   Monitorowanie u ycia pamięci.................................................................................666
                   Dostrajanie sterty ......................................................................................................670
                   Dostrajanie procesu zbierania nieu ytków ...............................................................671
                   Redukowanie tworzenia obiektów............................................................................672
                   Ponowne wykorzystanie obiektów ...........................................................................672
                   Pule obiektów............................................................................................................673
               Zauwa alna wydajność ...................................................................................................674
                   Rozdzielczość zegara ................................................................................................674
               Podsumowanie ................................................................................................................679
Rozdział 17. Tworzenie dźwięków i grafiki gry .................................................... 681
               Wybór wyglądu i sposobu działania gry .........................................................................682
                   Szukanie inspiracji ....................................................................................................682
                   Zachowywanie spójności ..........................................................................................683
               Zdobywanie darmowych materiałów do gry...................................................................683
               Praca z grafikami i autorami dźwięków..........................................................................684
               Narzędzia.........................................................................................................................685
               Tworzenie dźwięków ......................................................................................................685
                   Formaty plików dźwiękowych..................................................................................687
               Tworzenie tekstur i duszków...........................................................................................687
                   Formaty plików graficznych .....................................................................................688
                   Tworzenie tekstur bezszwowych ..............................................................................689
                   Tworzenie tekstur zastępczych .................................................................................690
Spis treści                                                                                                                                    13


                   Tworzenie tekstur przejściowych .............................................................................691
                   Tworzenie wielopoziomowych tekstur .....................................................................692
                Tworzenie obrazów tytułowych i grafiki dla wyświetlaczy HUD..................................694
                Tworzenie grafiki interfejsu u ytkownika ......................................................................694
                   Dostosowywanie komponentów Swing....................................................................694
                Tworzenie własnych czcionek ........................................................................................696
                Podsumowanie ................................................................................................................701
Rozdział 18. Projekt gry i ostatnie 10% prac ...................................................... 703
                Ostatnie 10% prac ...........................................................................................................704
                   Efekty........................................................................................................................704
                   Maszyna stanów gry .................................................................................................705
                Elementy projektu gry.....................................................................................................711
                   Środowiska................................................................................................................712
                   Fabuła........................................................................................................................712
                   Właściwa gra.............................................................................................................714
                   Uczenie gracza sposobu gry......................................................................................716
                Tworzenie edytora map...................................................................................................717
                Szukanie błędów .............................................................................................................719
                   Problemy z szukaniem błędów w Java2D ................................................................722
                   Rejestrowanie zdarzeń ..............................................................................................723
                Ochrona kodu ..................................................................................................................725
                Dystrybucja gry ...............................................................................................................726
                Dystrybucja gry za pomocą Java Web Start....................................................................728
                   Pobieranie zasobów z plików .jar .............................................................................728
                   Podpisywanie plików .jar..........................................................................................728
                   Tworzenie pliku JNLP ..............................................................................................729
                   Konfigurowanie serwera WWW...............................................................................731
                Dystrybucja gry w postaci kompilacji natywnej .............................................................732
                Aktualizacje i łatki ..........................................................................................................733
                Problem obcią enia serwera............................................................................................733
                Opinie u ytkowników i testy beta...................................................................................734
                Zarabianie pieniędzy .......................................................................................................736
                Łączymy wszystko razem ...............................................................................................737
                Podsumowanie ................................................................................................................737
Rozdział 19. Przyszłość ..................................................................................... 739
                Ewolucja Javy .................................................................................................................739
                   Java Community Process ..........................................................................................740
                   Bug Parade ................................................................................................................740
                Przyszłość: Java 1.5 „Tiger” ...........................................................................................740
                   Szablony (JSR 14).....................................................................................................741
                   Wyliczenia (JSR 201) ...............................................................................................742
                   Statyczne importowanie (JSR 201)...........................................................................743
                   Poprawiona pętla for (JSR 201)................................................................................744
                   Interfejs API kompilatora (JSR 199) ........................................................................744
                   Format transferu sieciowego (JSR 200)....................................................................745
                   Współdzielona maszyna wirtualna (JSR 121) ..........................................................745
                Wymagania stawiane platformie Java.............................................................................746
                   Potrzebne: więcej opcji dla obsługi myszy i klawiatury...........................................746
                   Potrzebne: obsługa joysticka.....................................................................................747
                   Potrzebne: przyspieszane sprzętowo, półprzezroczyste obrazy................................747
                   Potrzebne: dokładniejszy zegar.................................................................................747
14                                                                                                           Java. Tworzenie gier


                 Potrzebne: grafika przyspieszana sprzętowo i tryb pełnoekranowy
                   w systemie Linux....................................................................................................748
                 Potrzebne: trójwymiarowa grafika przyspieszana sprzętowo,
                   włączona do środowiska Javy ................................................................................748
                 Potrzebne: optymalizacja rozkazów SIMD w maszynie HotSpot ............................749
                 Po ądane: więcej opcji wygładzania czcionek .........................................................750
                 Pozostałe mo liwości................................................................................................752
              Nowe urządzenia i Javy Games Profile (JSR 134) .........................................................752
              Podsumowanie ................................................................................................................753

Dodatki .......................................................................................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 przesuwaniem.
       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 kolizji.
490        Część II ♦ Grafika trójwymiarowa i zaawansowane techniki programowania 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 znajdują się na dwóch ró nych krańcach
          świata przedstawionego w grze. Nale y się tak e zastanowić, czy w świecie
          z 1 000 poruszających się obiektów ma sens testowanie wystąpienia kolizji
          pomiędzy ka dą parą obiektów — czyli w sumie 999 000 testów? Powinniśmy
          więc próbować maksymalnie ograniczyć liczbę obiektów, w przypadku których
          staramy się wykryć wystąpienie zdarzenia kolizji. Najprostszym sposobem
          na wprowadzenie takiego ograniczenia jest testowanie tylko obiektów
          znajdujących się stosunkowo blisko gracza.
          Wykrywanie kolizji. Wybór techniki wykrywania kolizji zale y od oczekiwanej
          dokładności kolizji w grze. Mo na oczywiście zastosować doskonały algorytm
          wykrywania kolizji i sprawdzać wszystkie wielokąty nale ące do obiektu
          ze wszystkimi wielokątami tworzącymi inny obiekt, nale y jednak brać pod
          uwagę związany z takim działaniem koszt obliczeniowy. Podobnie, w świecie
          dwuwymiarowym moglibyśmy testować ewentualne kolizje wszystkich pikseli
          jednego dwuwymiarowego obiektu ze wszystkimi pikselami innego obiektu.
          W grach komputerowych stosuje się zwykle mniej dokładne techniki wykrywania
          kolizji, które jednak wykonują swoje zadanie znacznie szybciej.
          Obsługa kolizji. Jeśli dany obiekt koliduje z innym elementem sceny, nale y
          być przygotowanym na ró ne sposoby obsługi ró nych typów kolizji. Przykładowo,
          pocisk kolidujący z robotem mo e spowodować zniszczenie zarówno pocisku,
          jak i robota. Obiekt dochodzący do ściany mo e się dalej 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 kolizji;
          szybkie podejmowanie decyzji, czy kolizja wystąpiła;
          zapewnianie mechanizmu wykrywania kolizji o wystarczającej precyzji;
          obsługiwanie kolizji w naturalny sposób, który nie będzie 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 niektó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 lub z elementami
             środowiska.
          3. Jeśli wykryto kolizję, ustaw obiekt na jego wcześniejszej 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ędzy 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 obiekty, 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 programowania 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 polach. Jeśli wykorzystujemy drzewo BSP, mo emy rysować tyl-
         ko te obiekty, które znajdują się w polach z widocznymi liśćmi.

         Kod przypisujący obiekty do pól siatki jest trywialny — na potrzeby przykładów z tego
         rozdziału zaimplementowaliśmy go w klasie )TKF)COG1DLGEV/CPCIGT. Kiedy obiekt jest
         aktualizowany, wywoływana jest metoda EJGEM1DLGEV%QNNKUKQP
 (patrz listing 11.1),
         która odpowiada za wykrywanie ewentualnych kolizji pomiędzy tym obiektem a obiek-
         tami znajdującymi się w tych samych i w przylegających polach siatki.
Listing 11.1. Sprawdzanie przylegających komórek (plik GridGameObjectManager.java)
-NCUC %GNN TGRTGGPVWLG MQOÎTMú UKCVMK -NCUC CYKGTC NKUVú QDKGMVÎY
                   Y ITG K YUMC PKM KEJ YKFQEPQ EK
RTKXCVG UVCVKE ENCUU %GNN ]
                 .KUV QDLGEVU
                 DQQNGCP XKUKDNG

                   %GNN
 ]
                       QDLGEVU  PGY #TTC[.KUV

                       XKUKDNG  HCNUG
                   _
             _
Rozdział 11. ♦ Wykrywanie kolizji                                                            493
5RTCYFC E[ FCP[ QDKGMV MQNKFWLG  MVÎT[OMQNYKGM  RQQUVC [EJ
                  QDKGMVÎY
RWDNKE DQQNGCP EJGEM1DLGEV%QNNKUKQP
)COG1DLGEV QDLGEV 8GEVQT QNF.QECVKQP
            ]

                  DQQNGCP EQNNKUKQP  HCNUG

                   7 [L YURÎ TúFP[EJ 
Z FNC QDKGMVW 
RQ[ELC Y RQKQOKG
                  KPV Z  EQPXGTV/CR:VQ)TKF:

KPVQDLGEVIGV:

                  KPV [  EQPXGTV/CR;VQ)TKF;

KPVQDLGEVIGV


                   5RTCYF  MQOÎTGM QVCECLæE[EJ QDKGMV
                  HQT 
KPV KZ KZ
 K

 ]
                      HQT 
KPV L[ L[
 L

 ]
                          %GNN EGNN  IGV%GNN
K L
                          KH 
EGNN  PWNN ]
                              EQNNKUKQP ^ EQNNKUKQPGVGEVKQPEJGEM1DLGEV
QDLGEV EGNNQDLGEVU
                              QNF.QECVKQP
                          _
                      _
                  _

                  TGVWTP EQNNKUKQP
            _


         Powy szy kod wywołuje zdefiniowaną w klasie %QNNKUKQPGVGEVKQP metodę EJGEM
         1DLGEV
, która wykrywa kolizję pomiędzy danym obiektem a listą obiektów. Imple-
         mentacją klasy %QNNKUKQPGVGEVKQP zajmiemy się za chwilę.


Sfery otaczające
         Niedokładną, ale szybką techniką wykrywania kolizji jest zastosowanie tzw. sfer otacza-
         jących; przykład takiej sfery otaczającej obiekt przedstawia rysunek 11.2.

Rysunek 11.2.
Do wykrywania kolizji
mo na u yć sfer otaczających




         Kiedy sfery otaczające dwa obiekty kolidują ze sobą, ich kolizja jest traktowana jak
         kolizja otaczanych przez nie obiektów. Oto nasza pierwsza próba zaimplementowania
         testu wykrywającego kolizję dwóch sfer otaczających:
494             Część II ♦ Grafika trójwymiarowa i zaawansowane techniki programowania gier


             FZ  QDLGEV#Z  QDLGEV$Z
             F[  QDLGEV#[  QDLGEV$[
             F  QDLGEV#  QDLGEV$
             OKPKUVCPEG  QDLGEV#TCFKWU 
 QDLGEV$TCFKWU
             KH 
/CVJUSTV
FZ
FZ 
 F[
F[ 
 F
F  OKPKUVCPEG ]
                  9[MT[VQ MQNKLú
             _

         Wywołanie funkcji /CVJUSTV
 wią e się jednak z wykonaniem du ej ilości obliczeń.
         Mo emy uniknąć tego wywołania, podnosząc do kwadratu obie strony nierówności
         i otrzymując prostsze oraz znacznie szybciej obliczane wyra enie warunkowe:
             KH 
FZ
FZ 
 F[
F[ 
 F
F  OKPKUVCPEG
OKPKUVCPEG ]
                  9[MT[VQ MQNKLú
             _

         Jeśli Twoja gra wyświetla obraz dwuwymiarowy zamiast scen trójwymiarowych, za-
         miast kolizji sfer mo esz testować wystąpienia kolizji okręgów, wystarczy usunąć z rów-
         nań składniki odnoszące się do współrzędnej z.

         Testowanie występowania kolizji pomiędzy sferami otaczającymi jest stosunkowo pro-
         ste, ale tak e bardzo niedokładne. Przykładowo na rysunku 11.3 widać sferę otaczającą
         gracza, która koliduje ze sferą otaczającą robota, chocia same obiekty gracza i robota
         wcale ze sobą nie kolidują.

Rysunek 11.3.
Niedokładność sfer
otaczających: para
sfer ze sobą koliduje,
mimo e otaczane
obiekty znajdują się
w pewnej odległości




         Oczywiście taka niedokładność w wielu grach nie będzie dla gracza zauwa alna. Przy-
         kładowo w przypadku szybkiej gry akcji, w której biegamy po pomieszczeniach oraz
         podnosimy apteczki i amunicję, prawdopodobnie nie będzie dla nas miało znaczenia, czy
         podnosimy te obiekty na moment przed ich faktycznym dotknięciem. Jednak w innych
         sytuacjach taki brak precyzji mo e być irytujący, np. kiedy uda Ci się zranić przeciw-
         nika, którego nawet nie dotknąłeś.

         Po otrzymaniu pozytywnego wyniku testu kolizji sfer otaczających mo emy pójść krok
         dalej i wykonać bardziej szczegółowe testy, np. sprawdzić ewentualne występowanie
         kolizji pomiędzy wszystkimi parami wielokątów tworzących oba obiekty.

         Inną metodą jest wykorzystanie do testów zbioru sfer otaczających (patrz rysunek 11.4).
         Na rysunku dla robota skonstruowano trzy sfery otaczające, które bardziej precyzyjnie
         opisują jego kształt. Po otrzymaniu pozytywnego wyniku testu kolizji podstawowych
         (najmniej dokładnych) sfer otaczających mo emy przetestować drugi (bardziej dokład-
         ny) zbiór sfer. Jeśli którakolwiek ze zbioru sfer gracza koliduje z którąkolwiek ze zbioru
         sfer robota, wówczas mo emy uznać, e oba obiekty ze sobą kolidują.
Rozdział 11. ♦ Wykrywanie kolizji                                                         495


Rysunek 11.4.
Wiele sfer otaczających mo na
wykorzystać do przeprowadzania
bardziej precyzyjnych testów
występowania kolizji




        Mamy więc dwa poziomy sfer dla wszystkich obiektów w grze. Nie musimy oczywiście
        na tym poprzestawać. Moglibyśmy dodać jeszcze kilka poziomów, z których ka dy
        opierałby się na większej liczbie sfer otaczających i zapewniałby większą dokładność.
        Taka technika jest często nazywana drzewem sfer lub podziałem sfer. Mo emy w ten
        sposób szybko wykluczyć z przetwarzania obiekty, które ze sobą nie kolidują, oraz wy-
        konać bardziej precyzyjne testy dla obiektów powodujących potencjalną kolizję. Oma-
        wiane podejście pozwala nam tak e stwierdzić, która część obiektu została trafiona,
        dzięki czemu mo emy wykrytą kolizję odpowiednio obsłu yć. Przykładowo robota tra-
        fionego pociskiem rakietowym mo emy pozbawić uszkodzonej nogi.

        Zauwa , e drzewa sfer otaczających musza się obracać wraz z obracającym się otacza-
        nym obiektem. Przykładowo sfery muszą zmieniać swoje poło enie wraz ze zmianą
        poło enia ramienia robota. W kodzie zaprezentowanym w rozdziale 9., „Obiekty trój-
        wymiarowe”, zdefiniowaliśmy trójwymiarowe obiekty reprezentowane jako zagnie -
        d one grupy wielokątów. Poniewa była to ju struktura drzewiasta, w celu zaimple-
        mentowania drzewa sfer mo emy nadać ka dej grupie wielokątów jej własny zbiór sfer
        i zapewnić przeło enie ruchu grup na odpowiedni ruch sfer. W tym rozdziale nie bę-
        dziemy implementować drzew sfer, warto jednak brać pod uwagę takie rozwiązanie pod-
        czas tworzenia gier.

        Podsumujmy: przed narysowaniem typowej klatki większość obiektów nie wymaga
        przeprowadzania testów wystąpienia kolizji. W niektórych przypadkach konieczne jest
        przeprowadzenie prostego testu, a kilka obiektów wymaga najbardziej skomplikowa-
        nych i kosztownych obliczeniowo testów na wystąpienie kolizji.


Walce otaczające
        Alternatywą dla sfer otaczających są pionowe walce otaczające (patrz rysunek 11.5). Ta-
        kie rozwiązanie pozwala zredukować testy na występowanie kolizji do sprawdzenia dwu-
        wymiarowych okręgów i testów poło enia pionowych linii (a więc w jednym wymiarze).
496              Część II ♦ Grafika trójwymiarowa i zaawansowane techniki programowania gier


Rysunek 11.5.
Do wykrywania kolizji
mo na tak e wykorzystać
pionowy walec otaczający




        Pionowe walce otaczające najlepiej nadają się do — lepszego ni w przypadku poje-
        dynczej sfery otaczającej — opisywania wysokich, cienkich obiektów (np. graczy lub
        potworów). W tym rozdziale w naszym mechanizmie trójwymiarowym zaimplemen-
        tujemy wykrywanie kolizji typu obiekt-obiekt właśnie przy wykorzystaniu pionowych
        walców otaczających.

        Całość prezentowanego kodu odpowiadającego za proste wykrywanie kolizji umie-
        ściliśmy w klasie %QNNKUKQPGVGEVKQP. Zawarte w tej klasie metody obsługujące kolizje
        typu obiekt-obiekt przedstawiono na listingu 11.2.

Listing 11.2. Sprawdzanie obiektów CollisionDetection.java
5RTCYFC E[ FCP[ QDKGMV MQNKFWLG  FQYQNP[O KPP[O QDKGMVGO
                 RTGEJQY[YCP[O PC RTGMCCPGL NK EKG
RWDNKE DQQNGCP EJGEM1DLGEV
)COG1DLGEV QDLGEV# .KUV QDLGEVU 8GEVQT QNF.QECVKQP
           ]
               DQQNGCP EQNNKUKQP  HCNUG
               HQT 
KPV K KQDLGEVUUKG
 K

 ]
                   )COG1DLGEV QDLGEV$  
)COG1DLGEVQDLGEVUIGV
K
                   EQNNKUKQP ^ EJGEM1DLGEV
QDLGEV# QDLGEV$
                       QNF.QECVKQP
               _
               TGVWTP EQNNKUKQP
           _
YTCEC YCTVQ è VTWG LG NK FYC RTGMCCPG QDKGMV[ G UQDæ MQNKFWLæ
                 1DKGMV # RQTWUC UKú C QDKGMV $ RQFNGIC URTCYFGPKW /GVQFC Y[MQT[UVWLG
                 FQ Y[MT[YCPKC MQNKLK RKQPQYG YCNEG QVCECLæEG 
Q QMTæI GL RQFUVCYKG
RWDNKE DQQNGCP EJGEM1DLGEV
)COG1DLGEV QDLGEV#
               )COG1DLGEV QDLGEV$ 8GEVQT QNF.QECVKQP
           ]
                1DKGMV PKG OQ G MQNKFQYCè  UCO[O UQDæ
               KH 
QDLGEV#  QDLGEV$ ]
                   TGVWTP HCNUG
               _
Rozdział 11. ♦ Wykrywanie kolizji                                                             497


                 2QN[IQP)TQWR$QWPFU DQWPFU#  QDLGEV#IGV$QWPFU

                 2QN[IQP)TQWR$QWPFU DQWPFU$  QDLGEV$IGV$QWPFU


                  0CLRKGTY URTCYFCO[ MQNKLG Y QUK [ 
CM CFCO[ G Y[UQMQ è LGUV UVC C
                 HNQCV #[  QDLGEV#IGV;
 
 DQWPFU#IGV$QVVQO*GKIJV

                 HNQCV #[  QDLGEV#IGV;
 
 DQWPFU#IGV6QR*GKIJV

                 HNQCV $[  QDLGEV$IGV;
 
 DQWPFU$IGV$QVVQO*GKIJV

                 HNQCV $[  QDLGEV$IGV;
 
 DQWPFU$IGV6QR*GKIJV

                 KH 
$[  #[ ^^ $[ #[ ]
                     TGVWTP HCNUG
                 _

                  0CUVúRPKG URTCYFCO[ FYC Y[OKCT[  MQNKLG RQYKGTEJPK Z
                  
QMTæI [EJ RQFUVCY YCNEÎY
                 HNQCV FZ  QDLGEV#IGV:
  QDLGEV$IGV:

                 HNQCV F  QDLGEV#IGV
  QDLGEV$IGV

                 HNQCV OKPKUV  DQWPFU#IGV4CFKWU
 
 DQWPFU$IGV4CFKWU

                 HNQCV FKUV5S  FZ
FZ 
 F
F
                 HNQCV OKPKUV5S  OKPKUV
OKPKUV
                 KH 
FKUV5S  OKPKUV5S ]
                      TGVWTP JCPFNG1DLGEV%QNNKUKQP
QDLGEV# QDLGEV$ FKUV5S
                         OKPKUV5S QNF.QECVKQP
                 _
                 TGVWTP HCNUG
           _
1DU WIWLG MQNKLú QDKGMVW 1DKGMV # RQTWUC UKú PCVQOKCUV QDKGMV $ LGUV V[O
                 QDKGMVGO  MVÎT[O MQNKFWLG QDKGMV #
RTQVGEVGF DQQNGCP JCPFNG1DLGEV%QNNKUKQP
)COG1DLGEV QDLGEV# )COG1DLGEV QDLGEV$
           HNQCV FKUV5S HNQCV OKPKUV5S 8GEVQT QNF.QECVKQP
           ]
               QDLGEV#PQVKH[1DLGEV%QNNKUKQP
QDLGEV$
               TGVWTP VTWG
           _


        W powy szym kodzie obiekty w grze są związane z obiektami klasy 2QN[IQP)TQWR
        $QWPFU, które otaczają tworzące je grupy wielokątów odpowiednimi walcami. Opis wal-
        ca otaczającego składa się z promienia podstawy walca oraz wysokości, na jakiej znaj-
        duje się podstawa dolna walca (zwykle 0) i podstawa górna.

        Metoda EJGEM1DLGEV
 jedynie sprawdza, czy dwa walce otaczające ze sobą kolidują;
        jeśli tak się dzieje, wywoływana jest metoda JCPFNG1DLGEV%QNNKUKQP
.

        Metoda JCPFNG1DLGEV%QNNKUKQP
 jedynie sygnalizuje (za pomocą metody PQVKH[1DLGEV
        %QNNKUKQP
) poruszającemu się obiektowi, e jego ruch spowodował kolizję. Ta i inne
        metody umo liwiające sygnalizowanie podobnych zdarzeń znajdują się w klasie )COG
        1DLGEV, nie ma w ich przypadku jednak domyślnie zdefiniowanych działań — w razie
        potrzeby podklasy klasy )COG1DLGEV mogą przesłaniać te metody. Przykładowo zdefinio-
        wana w klasie $NCUV metoda PQVKH[1DLGEV%QNNKUKQP
 jest wykorzystywana do niszcze-
        nia robota, który koliduje z pociskiem reprezentowanym przez obiekt tej klasy:

More Related Content

What's hot

Triki najlepszych programistów gier 3D. Vademecum profesjonalisty
Triki najlepszych programistów gier 3D. Vademecum profesjonalistyTriki najlepszych programistów gier 3D. Vademecum profesjonalisty
Triki najlepszych programistów gier 3D. Vademecum profesjonalistyWydawnictwo Helion
 
Blender 2.3. Oficjalny podręcznik
Blender 2.3. Oficjalny podręcznikBlender 2.3. Oficjalny podręcznik
Blender 2.3. Oficjalny podręcznikWydawnictwo Helion
 
Real World Adobe Photoshop CS2. Edycja polska
Real World Adobe Photoshop CS2. Edycja polskaReal World Adobe Photoshop CS2. Edycja polska
Real World Adobe Photoshop CS2. Edycja polskaWydawnictwo Helion
 
Profesjonalne programowanie. Część 1. Zrozumieć komputer
Profesjonalne programowanie. Część 1. Zrozumieć komputerProfesjonalne programowanie. Część 1. Zrozumieć komputer
Profesjonalne programowanie. Część 1. Zrozumieć komputerWydawnictwo Helion
 
Windows XP PL. Ilustrowany przewodnik
Windows XP PL. Ilustrowany przewodnikWindows XP PL. Ilustrowany przewodnik
Windows XP PL. Ilustrowany przewodnikWydawnictwo Helion
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningWydawnictwo Helion
 
Linux. Niezbędnik programisty
Linux. Niezbędnik programistyLinux. Niezbędnik programisty
Linux. Niezbędnik programistyWydawnictwo Helion
 

What's hot (13)

Java 2. Techniki zaawansowane
Java 2. Techniki zaawansowaneJava 2. Techniki zaawansowane
Java 2. Techniki zaawansowane
 
Triki najlepszych programistów gier 3D. Vademecum profesjonalisty
Triki najlepszych programistów gier 3D. Vademecum profesjonalistyTriki najlepszych programistów gier 3D. Vademecum profesjonalisty
Triki najlepszych programistów gier 3D. Vademecum profesjonalisty
 
Blender 2.3. Oficjalny podręcznik
Blender 2.3. Oficjalny podręcznikBlender 2.3. Oficjalny podręcznik
Blender 2.3. Oficjalny podręcznik
 
Real World Adobe Photoshop CS2. Edycja polska
Real World Adobe Photoshop CS2. Edycja polskaReal World Adobe Photoshop CS2. Edycja polska
Real World Adobe Photoshop CS2. Edycja polska
 
Flash 8. Klatka po klatce
Flash 8. Klatka po klatceFlash 8. Klatka po klatce
Flash 8. Klatka po klatce
 
Biblia Q3
Biblia Q3Biblia Q3
Biblia Q3
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
 
Profesjonalne programowanie. Część 1. Zrozumieć komputer
Profesjonalne programowanie. Część 1. Zrozumieć komputerProfesjonalne programowanie. Część 1. Zrozumieć komputer
Profesjonalne programowanie. Część 1. Zrozumieć komputer
 
CorelDraw X3 PL. Kurs
CorelDraw X3 PL. KursCorelDraw X3 PL. Kurs
CorelDraw X3 PL. Kurs
 
Windows XP PL. Ilustrowany przewodnik
Windows XP PL. Ilustrowany przewodnikWindows XP PL. Ilustrowany przewodnik
Windows XP PL. Ilustrowany przewodnik
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny trening
 
100 sposobów na Flash
100 sposobów na Flash100 sposobów na Flash
100 sposobów na Flash
 
Linux. Niezbędnik programisty
Linux. Niezbędnik programistyLinux. Niezbędnik programisty
Linux. Niezbędnik programisty
 

Viewers also liked

Damian Jarosch- Budowanie aplikacji mobilnych na platformy iOS/Android/Window...
Damian Jarosch- Budowanie aplikacji mobilnych na platformy iOS/Android/Window...Damian Jarosch- Budowanie aplikacji mobilnych na platformy iOS/Android/Window...
Damian Jarosch- Budowanie aplikacji mobilnych na platformy iOS/Android/Window...Women in Technology Poland
 
Bohater UI bez front end developera ?
Bohater UI bez front end developera ?Bohater UI bez front end developera ?
Bohater UI bez front end developera ?Quick-Solution
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczneWydawnictwo Helion
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IIWydawnictwo Helion
 
Developing Gadgets
Developing GadgetsDeveloping Gadgets
Developing GadgetsQuirk
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsWydawnictwo Helion
 
Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyWydawnictwo Helion
 
45. Testowanie, diagnozowanie i wymiana podzespołów
45. Testowanie, diagnozowanie i wymiana podzespołów 45. Testowanie, diagnozowanie i wymiana podzespołów
45. Testowanie, diagnozowanie i wymiana podzespołów Lukas Pobocha
 
Tworzenie wieloplatformowych gier mobilnych
Tworzenie wieloplatformowych gier mobilnychTworzenie wieloplatformowych gier mobilnych
Tworzenie wieloplatformowych gier mobilnychGameDesire Company
 

Viewers also liked (13)

Pure MVC - Mediovski
Pure MVC - MediovskiPure MVC - Mediovski
Pure MVC - Mediovski
 
Edytory Grafiki
Edytory GrafikiEdytory Grafiki
Edytory Grafiki
 
Damian Jarosch- Budowanie aplikacji mobilnych na platformy iOS/Android/Window...
Damian Jarosch- Budowanie aplikacji mobilnych na platformy iOS/Android/Window...Damian Jarosch- Budowanie aplikacji mobilnych na platformy iOS/Android/Window...
Damian Jarosch- Budowanie aplikacji mobilnych na platformy iOS/Android/Window...
 
Bohater UI bez front end developera ?
Bohater UI bez front end developera ?Bohater UI bez front end developera ?
Bohater UI bez front end developera ?
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
 
Developing Gadgets
Developing GadgetsDeveloping Gadgets
Developing Gadgets
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
 
Projektowanie i programowanie aplikacji nowej generacji
Projektowanie i programowanie aplikacji nowej generacjiProjektowanie i programowanie aplikacji nowej generacji
Projektowanie i programowanie aplikacji nowej generacji
 
Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. Projekty
 
45. Testowanie, diagnozowanie i wymiana podzespołów
45. Testowanie, diagnozowanie i wymiana podzespołów 45. Testowanie, diagnozowanie i wymiana podzespołów
45. Testowanie, diagnozowanie i wymiana podzespołów
 
ABC sam naprawiam komputer
ABC sam naprawiam komputerABC sam naprawiam komputer
ABC sam naprawiam komputer
 
Tworzenie wieloplatformowych gier mobilnych
Tworzenie wieloplatformowych gier mobilnychTworzenie wieloplatformowych gier mobilnych
Tworzenie wieloplatformowych gier mobilnych
 

Similar to Java. Tworzenie gier

Język Cg. Programowanie grafiki w czasie rzeczywistym
Język Cg. Programowanie grafiki w czasie rzeczywistymJęzyk Cg. Programowanie grafiki w czasie rzeczywistym
Język Cg. Programowanie grafiki w czasie rzeczywistymWydawnictwo Helion
 
Po prostu JavaScript i Ajax. Wydanie VI
Po prostu JavaScript i Ajax. Wydanie VIPo prostu JavaScript i Ajax. Wydanie VI
Po prostu JavaScript i Ajax. Wydanie VIWydawnictwo Helion
 
Asembler. Podręcznik programisty
Asembler. Podręcznik programistyAsembler. Podręcznik programisty
Asembler. Podręcznik programistyWydawnictwo Helion
 
Flash CS3 Professional PL. Klatka po klatce
Flash CS3 Professional PL. Klatka po klatceFlash CS3 Professional PL. Klatka po klatce
Flash CS3 Professional PL. Klatka po klatceWydawnictwo Helion
 
.Net. Najpilniej strzeżone tajemnice
.Net. Najpilniej strzeżone tajemnice.Net. Najpilniej strzeżone tajemnice
.Net. Najpilniej strzeżone tajemniceWydawnictwo Helion
 
Efekty graficzne i animowane dla aplikacji Desktop Java. Tworzenie atrakcyjny...
Efekty graficzne i animowane dla aplikacji Desktop Java. Tworzenie atrakcyjny...Efekty graficzne i animowane dla aplikacji Desktop Java. Tworzenie atrakcyjny...
Efekty graficzne i animowane dla aplikacji Desktop Java. Tworzenie atrakcyjny...Wydawnictwo Helion
 
ABC grafiki komputerowej i obróbki zdjęć
ABC grafiki komputerowej i obróbki zdjęćABC grafiki komputerowej i obróbki zdjęć
ABC grafiki komputerowej i obróbki zdjęćWydawnictwo Helion
 
ABC grafiki komputerowej. Wydanie II
ABC grafiki komputerowej. Wydanie IIABC grafiki komputerowej. Wydanie II
ABC grafiki komputerowej. Wydanie IIWydawnictwo Helion
 
Real World Digital Audio. Edycja polska
Real World Digital Audio. Edycja polskaReal World Digital Audio. Edycja polska
Real World Digital Audio. Edycja polskaWydawnictwo Helion
 
Macromedia Flash 8. Oficjalny podręcznik
Macromedia Flash 8. Oficjalny podręcznikMacromedia Flash 8. Oficjalny podręcznik
Macromedia Flash 8. Oficjalny podręcznikWydawnictwo Helion
 
Multimedia w Linuksie. Praktyczne rozwiązania
Multimedia w Linuksie. Praktyczne rozwiązaniaMultimedia w Linuksie. Praktyczne rozwiązania
Multimedia w Linuksie. Praktyczne rozwiązaniaWydawnictwo Helion
 

Similar to Java. Tworzenie gier (20)

J2ME. Praktyczne projekty
J2ME. Praktyczne projektyJ2ME. Praktyczne projekty
J2ME. Praktyczne projekty
 
Java. Sztuka programowania
Java. Sztuka programowaniaJava. Sztuka programowania
Java. Sztuka programowania
 
OpenGL. Ćwiczenia
OpenGL. ĆwiczeniaOpenGL. Ćwiczenia
OpenGL. Ćwiczenia
 
Aplikacje Direct3D
Aplikacje Direct3DAplikacje Direct3D
Aplikacje Direct3D
 
Język Cg. Programowanie grafiki w czasie rzeczywistym
Język Cg. Programowanie grafiki w czasie rzeczywistymJęzyk Cg. Programowanie grafiki w czasie rzeczywistym
Język Cg. Programowanie grafiki w czasie rzeczywistym
 
Po prostu JavaScript i Ajax. Wydanie VI
Po prostu JavaScript i Ajax. Wydanie VIPo prostu JavaScript i Ajax. Wydanie VI
Po prostu JavaScript i Ajax. Wydanie VI
 
Asembler. Podręcznik programisty
Asembler. Podręcznik programistyAsembler. Podręcznik programisty
Asembler. Podręcznik programisty
 
ActionScript 2.0. Od podstaw
ActionScript 2.0. Od podstawActionScript 2.0. Od podstaw
ActionScript 2.0. Od podstaw
 
Flash CS3 Professional PL. Klatka po klatce
Flash CS3 Professional PL. Klatka po klatceFlash CS3 Professional PL. Klatka po klatce
Flash CS3 Professional PL. Klatka po klatce
 
.Net. Najpilniej strzeżone tajemnice
.Net. Najpilniej strzeżone tajemnice.Net. Najpilniej strzeżone tajemnice
.Net. Najpilniej strzeżone tajemnice
 
Java. Kompendium programisty
Java. Kompendium programistyJava. Kompendium programisty
Java. Kompendium programisty
 
Pajączek 5 NxG
Pajączek  5 NxGPajączek  5 NxG
Pajączek 5 NxG
 
Efekty graficzne i animowane dla aplikacji Desktop Java. Tworzenie atrakcyjny...
Efekty graficzne i animowane dla aplikacji Desktop Java. Tworzenie atrakcyjny...Efekty graficzne i animowane dla aplikacji Desktop Java. Tworzenie atrakcyjny...
Efekty graficzne i animowane dla aplikacji Desktop Java. Tworzenie atrakcyjny...
 
Praktyczny kurs Java
Praktyczny kurs JavaPraktyczny kurs Java
Praktyczny kurs Java
 
ABC grafiki komputerowej i obróbki zdjęć
ABC grafiki komputerowej i obróbki zdjęćABC grafiki komputerowej i obróbki zdjęć
ABC grafiki komputerowej i obróbki zdjęć
 
ABC grafiki komputerowej. Wydanie II
ABC grafiki komputerowej. Wydanie IIABC grafiki komputerowej. Wydanie II
ABC grafiki komputerowej. Wydanie II
 
Real World Digital Audio. Edycja polska
Real World Digital Audio. Edycja polskaReal World Digital Audio. Edycja polska
Real World Digital Audio. Edycja polska
 
Macromedia Flash 8. Oficjalny podręcznik
Macromedia Flash 8. Oficjalny podręcznikMacromedia Flash 8. Oficjalny podręcznik
Macromedia Flash 8. Oficjalny podręcznik
 
ActionScript. Receptury
ActionScript. RecepturyActionScript. Receptury
ActionScript. Receptury
 
Multimedia w Linuksie. Praktyczne rozwiązania
Multimedia w Linuksie. Praktyczne rozwiązaniaMultimedia w Linuksie. Praktyczne rozwiązania
Multimedia w Linuksie. Praktyczne rozwiązania
 

More from Wydawnictwo Helion

Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikWydawnictwo Helion
 
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieE-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieWydawnictwo Helion
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuWydawnictwo Helion
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIWydawnictwo Helion
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykWydawnictwo Helion
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaWydawnictwo Helion
 
Serwer SQL 2008. Administracja i programowanie
Serwer SQL 2008. Administracja i programowanieSerwer SQL 2008. Administracja i programowanie
Serwer SQL 2008. Administracja i programowanieWydawnictwo Helion
 
USB. Praktyczne programowanie z Windows API w C++
USB. Praktyczne programowanie z Windows API w C++USB. Praktyczne programowanie z Windows API w C++
USB. Praktyczne programowanie z Windows API w C++Wydawnictwo Helion
 
Microsoft Visual Studio 2008. Księga eksperta
Microsoft Visual Studio 2008. Księga ekspertaMicrosoft Visual Studio 2008. Księga eksperta
Microsoft Visual Studio 2008. Księga ekspertaWydawnictwo Helion
 
Rewizor GT. Prowadzenie ewidencji księgowej
Rewizor GT. Prowadzenie ewidencji księgowejRewizor GT. Prowadzenie ewidencji księgowej
Rewizor GT. Prowadzenie ewidencji księgowejWydawnictwo Helion
 
Fotografia cyfrowa. Poradnik bez kantów
Fotografia cyfrowa. Poradnik bez kantówFotografia cyfrowa. Poradnik bez kantów
Fotografia cyfrowa. Poradnik bez kantówWydawnictwo Helion
 
Windows Vista. Naprawa i optymalizacja. Ćwiczenia praktyczne
Windows Vista. Naprawa i optymalizacja. Ćwiczenia praktyczneWindows Vista. Naprawa i optymalizacja. Ćwiczenia praktyczne
Windows Vista. Naprawa i optymalizacja. Ćwiczenia praktyczneWydawnictwo Helion
 

More from Wydawnictwo Helion (20)

Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnik
 
Access w biurze i nie tylko
Access w biurze i nie tylkoAccess w biurze i nie tylko
Access w biurze i nie tylko
 
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieE-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
 
Serwer SQL 2008. Administracja i programowanie
Serwer SQL 2008. Administracja i programowanieSerwer SQL 2008. Administracja i programowanie
Serwer SQL 2008. Administracja i programowanie
 
USB. Praktyczne programowanie z Windows API w C++
USB. Praktyczne programowanie z Windows API w C++USB. Praktyczne programowanie z Windows API w C++
USB. Praktyczne programowanie z Windows API w C++
 
Microsoft Visual Studio 2008. Księga eksperta
Microsoft Visual Studio 2008. Księga ekspertaMicrosoft Visual Studio 2008. Księga eksperta
Microsoft Visual Studio 2008. Księga eksperta
 
Rewizor GT. Prowadzenie ewidencji księgowej
Rewizor GT. Prowadzenie ewidencji księgowejRewizor GT. Prowadzenie ewidencji księgowej
Rewizor GT. Prowadzenie ewidencji księgowej
 
Fotografia cyfrowa. Poradnik bez kantów
Fotografia cyfrowa. Poradnik bez kantówFotografia cyfrowa. Poradnik bez kantów
Fotografia cyfrowa. Poradnik bez kantów
 
Windows Vista. Naprawa i optymalizacja. Ćwiczenia praktyczne
Windows Vista. Naprawa i optymalizacja. Ćwiczenia praktyczneWindows Vista. Naprawa i optymalizacja. Ćwiczenia praktyczne
Windows Vista. Naprawa i optymalizacja. Ćwiczenia praktyczne
 

Java. Tworzenie gier

  • 1. IDZ DO PRZYK£ADOWY ROZDZIA£ SPIS TRE CI Java. Tworzenie gier Autorzy: David Brackeen, Bret Barker, Laurence Vanhelsuwe KATALOG KSI¥¯EK 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) KATALOG ONLINE ISBN: 83-7361-411-7 Tytu³ orygina³u: Developing Games in Java ZAMÓW DRUKOWANY KATALOG Format: B5, stron: 756 Przyk³ady na ftp: 4924 kB TWÓJ KOSZYK Wykorzystaj do tworzenia gier DODAJ DO KOSZYKA 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 CENNIK I INFORMACJE 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 ZAMÓW INFORMACJE brakowa³o jednak twórców gier i aplikacji „rozrywkowych”. Dotychczas w Javie O NOWO CIACH 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 ZAMÓW CENNIK 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 CZYTELNIA sprzêtowo i przestrzennym d wiêkiem. „Java. Tworzenie gier” to ksi¹¿ka o programowaniu gier, na jak¹ czeka³e . Zawiera FRAGMENTY KSI¥¯EK ONLINE 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 Wydawnictwo Helion • Mapowanie tekstur i symulacja o wietlenia ul. Chopina 6 • Drzewa BSP 44-100 Gliwice • Algorytmy detekcji kolizji i wykrywania drogi tel. (32)230-98-63 • Sztuczna inteligencja i tworzenie botów e-mail: helion@helion.pl • 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.
  • 2. 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? ...............................................................................................................28 Tworzenie i uruchamianie wątków w języku Java............................................................28 Rozszerzanie klasy Thread .........................................................................................29 Implementacja interfejsu Runnable ............................................................................29 U ycie anonimowej klasy wewnętrznej......................................................................29 Oczekiwanie na zakończenie wątku ...........................................................................30 Uśpione wątki .............................................................................................................30 Synchronizacja ..................................................................................................................30 Po co nam synchronizacja?.........................................................................................30 Jak synchronizować? ..................................................................................................31 Kiedy nale y synchronizować?...................................................................................32 Kiedy nie synchronizować? ........................................................................................33 Unikanie zakleszczeń..................................................................................................33 U ycie wait() oraz notify()................................................................................................34 Model zdarzeń Javy...........................................................................................................35 Kiedy u ywać wątków? ....................................................................................................36 Kiedy nie u ywać wątków?...............................................................................................36 Podsumowanie: pule wątków............................................................................................36 Podsumowanie ..................................................................................................................41 Rozdział 2. Grafika 2D oraz animacja ................................................................. 43 Grafika pełnoekranowa .....................................................................................................44 Układ ekranu...............................................................................................................44 Kolor piksela i głębia koloru.......................................................................................45 Częstotliwość odświe ania .........................................................................................46 Przełączanie do trybu pełnoekranowego ....................................................................46 Anti-aliasing................................................................................................................50 Który tryb graficzny nale y zastosować? ...................................................................51 Rysunki..............................................................................................................................52 Przezroczystość...........................................................................................................52 Formaty plików...........................................................................................................52 Odczytywanie rysunków.............................................................................................53
  • 3. 6 Java. Tworzenie gier Rysunki przyspieszane sprzętowo ..............................................................................56 Program testujący wydajność rysowania rysunków ...................................................58 Animacja .....................................................................................................................61 Renderowanie aktywne...............................................................................................64 Pętla animacji..............................................................................................................64 Usuwanie migotania i szarpania........................................................................................67 Podwójne buforowanie ...............................................................................................67 Przełączanie stron .......................................................................................................68 Odświe anie monitora i szarpanie ..............................................................................70 Klasa BufferStrategy...................................................................................................70 Tworzenie zarządcy ekranów .....................................................................................71 Duszki .........................................................................................................................78 Proste efekty......................................................................................................................84 Przekształcenia rysunków...........................................................................................84 Podsumowanie ..................................................................................................................89 Rozdział 3. Interaktywność i interfejs użytkownika ............................................. 91 Model zdarzeń AWT.........................................................................................................94 Zdarzenia klawiatury.........................................................................................................95 Zdarzenia myszy ...............................................................................................................99 Przesuwanie myszy metodą „rozglądania się”................................................................103 Ukrywanie wskaźnika myszy ...................................................................................107 Tworzenie klasy InputManager.......................................................................................108 Zastosowanie obiektu InputManager ..............................................................................119 Zatrzymywanie gry ...................................................................................................119 Dodajemy grawitację ................................................................................................120 Projektowanie intuicyjnych interfejsów u ytkownika ....................................................125 Wskazówki do projektu interfejsu u ytkownika.......................................................126 Wykorzystanie komponentów Swing..............................................................................127 Podstawy Swing........................................................................................................127 Stosowanie Swing w trybie pełnoekranowym..........................................................128 Tworzenie prostego menu ...............................................................................................130 Konfiguracja klawiatury przez u ytkownika ..................................................................135 Podsumowanie ................................................................................................................141 Rozdział 4. Efekty dźwiękowe oraz muzyka....................................................... 143 Podstawy dźwięku...........................................................................................................144 API Java Sound ...............................................................................................................144 Otwieranie pliku dźwiękowego ................................................................................145 Zastosowanie interfejsu Line ....................................................................................145 Odtwarzanie dźwięków ...................................................................................................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 .....................................................................................................159 Mechanizmy potrzebne do tworzenia filtra 3D ........................................................160 Implementacja filtra 3D ............................................................................................161 Testowanie filtra 3D .................................................................................................163 Tworzenie obiektu zarządzającego dźwiękiem...............................................................167 Klasa Sound ..............................................................................................................167 Klasa SoundManager ................................................................................................168 Zmienne lokalne dla wątków ....................................................................................175 Odtwarzanie muzyki .......................................................................................................176 Odtwarzanie dźwięku CD .........................................................................................177 Odtwarzanie plików MP3 i Ogg Vorbis ...................................................................177
  • 4. Spis treści 7 Odtwarzanie muzyki MIDI .......................................................................................178 Tworzenie muzyki adaptacyjnej ...............................................................................182 Podsumowanie ................................................................................................................184 Rozdział 5. Tworzenie dwuwymiarowej gry platformowej ................................... 185 Tworzenie mapy zło onej z kafelków.............................................................................186 Implementacja mapy korzystającej z kafelków ........................................................187 Ładowanie mapy zło onej z kafelków......................................................................190 Rysowanie mapy zło onej z kafelków......................................................................193 Rysowanie duszków..................................................................................................195 Przewijanie z paralaksą.............................................................................................195 Premie .......................................................................................................................197 Proste obiekty wrogów .............................................................................................200 Wykrywanie kolizji .........................................................................................................207 Detekcja kolizji .........................................................................................................207 Obsługa kolizji ..........................................................................................................208 Kolizje duszków........................................................................................................212 Dokończenie i przyspieszanie gry...................................................................................213 Tworzenie wykonywalnego pliku .jar.............................................................................213 Pomysły na rozszerzenie gry...........................................................................................215 Podsumowanie ................................................................................................................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 ............................................................................220 Kanały .......................................................................................................................220 Bufory .......................................................................................................................223 Selektory oraz klasy SelectionKey ...........................................................................226 ChatterBox, prosta aplikacja dla wielu u ytkowników...................................................227 Serwer: ChatterServer...............................................................................................227 Kompilowanie i uruchamianie serwera ....................................................................233 Klient: ChatterClient.................................................................................................235 Kompilowanie i uruchamianie klienta ......................................................................236 Szkielet serwera gry wieloosobowej ...............................................................................237 Cele projektu i taktyka ..............................................................................................237 Projekt .......................................................................................................................238 Wspólne klasy i interfejsy.........................................................................................242 Implementacja serwera .............................................................................................244 Klient.........................................................................................................................252 Przykładowa gra: RPS (kamień, papier, no yczki).........................................................253 Klasy .........................................................................................................................253 Uruchamianie gry RPS .............................................................................................256 Wykończanie gry: rozbudowa szkieletu .........................................................................258 Interfejs klienta .........................................................................................................258 Trwałość....................................................................................................................258 Listy znajomych, pokoje i czat .................................................................................258 Administracja serwera.....................................................................................................259 Rejestracja zdarzeń ...................................................................................................259 Uruchamianie i wyłączanie.......................................................................................260 Konsole administracyjne serwera .............................................................................261 Śledzenie gry.............................................................................................................261 Zagadnienia zaawansowane ............................................................................................262 Rozłączenia i ponowne połączenia ...........................................................................262 Tunelowanie HTTP...................................................................................................263
  • 5. 8 Java. Tworzenie gier Testowanie za pomocą botów...................................................................................265 Te nieznośne modemy ..............................................................................................266 Profilowanie i tworzenie statystyk wydajności.........................................................266 Dostrajanie wydajności.............................................................................................268 Podsumowanie ................................................................................................................270 Część II Grafika trójwymiarowa i zaawansowane techniki programowania gier ...............271 Rozdział 7. Grafika trójwymiarowa ................................................................... 273 Typy renderowania grafiki trójwymiarowej ...................................................................274 Nie zapominajmy o matematyce .....................................................................................275 Trygonometria i trójkąty prostokątne .......................................................................276 Wektory.....................................................................................................................276 Podstawy grafiki trójwymiarowej ...................................................................................281 Algebra trzech wymiarów ...............................................................................................284 Wielokąty ........................................................................................................................289 Przekształcenia przestrzeni trójwymiarowej...................................................................292 Rotacje ......................................................................................................................293 Hermetyzacja przekształceń rotacji i translacji.........................................................295 Stosowanie transformacji..........................................................................................298 Porządek rotacji ........................................................................................................300 Prosty potok tworzenia grafiki 3D ..................................................................................301 Ruch kamery ...................................................................................................................305 Bryły i usuwanie niewidocznych powierzchni................................................................305 Iloczyn skalarny wektorów .......................................................................................307 Iloczyn wektorowy wektorów...................................................................................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.....................................................................................321 Ostateczny potok renderowania ......................................................................................324 Podsumowanie ................................................................................................................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............................................................................340 Wady naszego prostego mechanizmu renderującego ...............................................347 Optymalizowanie mapowania tekstur .............................................................................348 Przechowywanie tekstur ...........................................................................................349 Prosta optymalizacja .................................................................................................352 Rozwijanie metod w miejscu wywołania .................................................................356 Przykładowy program korzystający z szybkiego mapowania tekstur ......................358 Prosty mechanizm generowania oświetlenia...................................................................359 Odbicie rozproszone .................................................................................................359 Światło otoczenia ......................................................................................................360 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ą....................................................360 Implementowanie punktowego źródła światła..........................................................361 Implementowanie oświetlania tekstur.............................................................................362 Tworzenie zaawansowanych trików oświetleniowych za pomocą map cieniowania.....369 Odnajdywanie prostokąta ograniczającego...............................................................369 Stosowanie mapy cieniowania..................................................................................371
  • 6. Spis treści 9 Budowanie mapy cieniowania ..................................................................................373 Budowanie powierzchni............................................................................................375 Przechowywanie powierzchni w pamięci podręcznej ..............................................378 Przykład z cieniowaniem powierzchni .....................................................................384 Dodatkowe pomysły........................................................................................................385 Sugerowanie głębi.....................................................................................................385 Fałszywe cienie.........................................................................................................386 Mapowanie MIP........................................................................................................386 Interpolacja dwuliniowa............................................................................................386 Interpolacja trójliniowa.............................................................................................387 Mapy wektorów normalnych i mapy głębokości......................................................387 Inne typy oświetlenia ................................................................................................388 Podsumowanie ................................................................................................................388 Rozdział 9. Obiekty trójwymiarowe................................................................... 389 Usuwanie ukrytych powierzchni.....................................................................................390 Algorytm malarza .....................................................................................................390 Odwrotny algorytm malarza .....................................................................................391 Z-bufor ......................................................................................................................391 Z-bufor z wartościami 1/z.........................................................................................393 Obliczanie z-głębokości............................................................................................396 Animacja trójwymiarowa................................................................................................397 Ruch postępowy........................................................................................................400 Ruch obrotowy..........................................................................................................402 Grupy wielokątów ...........................................................................................................407 Iteracyjna obsługa wszystkich wielokątów nale ących do grupy.............................411 Wczytywanie grup wielokątów z pliku OBJ...................................................................413 Format pliku OBJ......................................................................................................414 Format pliku MTL ....................................................................................................420 Obiekty w grze ................................................................................................................421 Zarządzanie obiektami w grze.........................................................................................425 Łączenie elementów........................................................................................................427 Mo liwe rozszerzenia w przyszłości...............................................................................433 Podsumowanie ................................................................................................................434 Rozdział 10. Zarządzanie sceną trójwymiarową za pomocą drzew BSP ................ 435 Wprowadzenie do drzew BSP.........................................................................................436 Podstawy drzew binarnych..............................................................................................437 Jednowymiarowe drzewo BSP........................................................................................440 Dwuwymiarowe drzewo BSP .........................................................................................442 Przykład budowy drzewa BSP..................................................................................443 Przykład przeglądania drzewa BSP ..........................................................................447 Implementacja dwuwymiarowego drzewa BSP..............................................................448 Linia podziału BSP ...................................................................................................450 Wyznaczanie poło enia punktu względem linii .......................................................450 Dwójkowy podział wielokąta ...................................................................................454 Przeglądanie drzewa BSP .........................................................................................455 Przeglądanie poprzeczne...........................................................................................457 Przeglądanie od przodu do tyłu.................................................................................458 Budowa drzewa.........................................................................................................459 Znajdowanie punktu przecięcia dwóch prostych......................................................463 Przycinanie wielokątów do linii................................................................................465 Usuwanie pustych przestrzeni T-złączy....................................................................467 Testowanie drzewa BSP ...........................................................................................469
  • 7. 10 Java. Tworzenie gier Rysowanie wielokątów od przodu do tyłu ......................................................................471 Pierwszy przykład wykorzystania drzewa BSP ..............................................................479 Rysowanie obiektów na scenie .......................................................................................480 Wczytywanie map z pliku ...............................................................................................482 Łączenie elementów........................................................................................................486 Rozszerzenia....................................................................................................................486 Podsumowanie ................................................................................................................488 Rozdział 11. Wykrywanie kolizji ......................................................................... 489 Podstawy kolizji ..............................................................................................................490 Kolizje typu obiekt-obiekt...............................................................................................491 Eliminowanie testów.................................................................................................491 Sfery otaczające ........................................................................................................493 Walce otaczające.......................................................................................................495 Problem przetwarzania dyskretno-czasowego..........................................................498 Kolizje typu obiekt-świat ................................................................................................499 Prostopadłościany otaczające, wykorzystywane do wykrywania kolizji z podłogami ............................................................................................................499 Znajdowanie liścia drzewa BSP dla danego poło enia.............................................500 Implementacja testów wysokości podłogi i sufitu ....................................................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 .................................................................................................508 Implementacja wykrywania kolizji typu obiekt-świat..............................................509 Prosty program demonstracyjny wykrywający kolizje ...................................................511 Obsługa kolizji z przesuwaniem .....................................................................................512 Przesuwanie obiektu wzdłu innego obiektu............................................................512 Przesuwanie obiektu wzdłu ściany..........................................................................515 Grawitacja i płynny ruch na schodach (przesuwanie obiektu wzdłu podłogi)........517 Skakanie....................................................................................................................520 Program demonstracyjny obsługujący kolizje z przesuwaniem .....................................521 Rozszerzenia....................................................................................................................522 Podsumowanie ................................................................................................................522 Rozdział 12. Odnajdywanie drogi w grze ............................................................. 523 Podstawowa wiedza na temat technik odnajdywania drogi ............................................524 Pierwsze przymiarki do odnajdywania drogi w grze ......................................................524 Przeszukiwanie wszerz .............................................................................................527 Podstawy algorytmu A* ..................................................................................................530 Stosowanie algorytmu A* w grze ...................................................................................535 Algorytm A* w połączeniu z drzewami BSP..................................................................536 Przejścia ....................................................................................................................536 Implementowanie portali ..........................................................................................537 Uniwersalny mechanizm odnajdywania drogi ................................................................541 Przygotowywanie robota PathBot...................................................................................545 Sposoby ulepszania przeszukiwania A* .........................................................................549 Podsumowanie ................................................................................................................550 Rozdział 13. Sztuczna inteligencja ..................................................................... 551 Podstawy sztucznej inteligencji ......................................................................................552 Pozbawianie botów ich boskiej mocy .............................................................................553 „Widzenie”................................................................................................................554 „Słyszenie”................................................................................................................556
  • 8. Spis treści 11 Maszyny stanów i obsługa reakcji ..................................................................................559 Maszyny probabilistyczne...............................................................................................561 Przydatne funkcje generujące liczby losowe ............................................................563 Podejmowanie decyzji.....................................................................................................564 Wzorce ............................................................................................................................566 Unikanie....................................................................................................................567 Atakowanie ...............................................................................................................569 Uciekanie ..................................................................................................................572 Celowanie .................................................................................................................573 Strzelanie...................................................................................................................574 Tworzenie obiektów........................................................................................................575 Łączenie elementów........................................................................................................576 Mózgi!.......................................................................................................................576 Zdrowie i umieranie..................................................................................................577 Dodawanie HUD-a....................................................................................................581 Uczenie się ......................................................................................................................585 Wskrzeszanie botów .................................................................................................586 Uczenie się botów .....................................................................................................588 Rozszerzenia programu demonstracyjnego ..............................................................593 Inne podejścia do sztucznej inteligencji..........................................................................593 Zespołowa sztuczna inteligencja...............................................................................594 Podsumowanie ................................................................................................................594 Rozdział 14. Skrypty gry.................................................................................... 595 Ksią ka kucharska skryptów: czego potrzebujemy ........................................................596 Implementacja powiadomień wejścia i wyjścia ..............................................................597 Wyzwalacze ..............................................................................................................599 Nasłuch obiektów gry......................................................................................................600 Skrypty ............................................................................................................................604 Projektowanie skryptu ..............................................................................................606 Wbudowywanie BeanShell.......................................................................................608 Zdarzenia opóźnione .......................................................................................................612 Tworzenie zdarzeń opóźnionych w BeanShell .........................................................615 Łączymy wszystko razem ...............................................................................................616 Rozszerzenia....................................................................................................................617 Podsumowanie ................................................................................................................619 Rozdział 15. Trwałość — zapisywanie gry .......................................................... 621 Podstawy zapisywania gier .............................................................................................621 Wykorzystanie API serializacji do zapisywania stanu gry .............................................623 Wprowadzenie do serializacji ...................................................................................623 Serializacja: podstawy ..............................................................................................623 Serializacja: zasady...................................................................................................626 Serializacja: pułapki..................................................................................................629 Zmiana domyślnego działania mechanizmu serializacji...........................................633 Tworzenie zrzutu ekranu gry...........................................................................................636 Tworzenie miniatury ze zrzutem ekranu...................................................................638 Zapisywanie rysunku ................................................................................................639 Zapisywanie gier we właściwym miejscu.......................................................................641 Podsumowanie ................................................................................................................642
  • 9. 12 Java. Tworzenie gier Część III Optymalizacja i kończenie gry.......................................643 Rozdział 16. Techniki optymalizacji.................................................................... 645 Zasady optymalizacji.......................................................................................................646 Profilowanie ....................................................................................................................646 Testowanie wydajności.............................................................................................647 U ycie programu profilującego HotSpot ..................................................................647 HotSpot............................................................................................................................651 Optymalizacje specyficzne dla języka Java ..............................................................652 Eliminacja nieu ywanego kodu ................................................................................652 Wyciąganie niezmienników pętli..............................................................................653 Eliminacja wspólnych podwyra eń ..........................................................................653 Propagacja stałych ....................................................................................................653 Rozwijanie pętli (tylko maszyna wirtualna server) ..................................................654 Metody inline ............................................................................................................654 Sztuczki optymalizacji ....................................................................................................655 Algorytmy .................................................................................................................655 Zmniejszanie siły operacji: przesuwanie bitów ........................................................656 Zmniejszanie siły operacji: reszta z dzielenia...........................................................657 Zmniejszanie siły operacji: mno enie.......................................................................657 Zmniejszanie siły operacji: potęgowanie..................................................................658 Więcej na temat wyciągania niezmienników pętli....................................................658 Tablice wartości funkcji............................................................................................659 Arytmetyka stałoprzecinkowa ..................................................................................662 Wyjątki......................................................................................................................662 Wejście-wyjście ........................................................................................................662 Pliki mapowane w pamięci .......................................................................................663 Wykorzystanie pamięci i zbieranie nieu ytków..............................................................664 Sterta Java oraz zbieranie nieu ytków ......................................................................664 Monitorowanie zbierania nieu ytków.......................................................................665 Monitorowanie u ycia pamięci.................................................................................666 Dostrajanie sterty ......................................................................................................670 Dostrajanie procesu zbierania nieu ytków ...............................................................671 Redukowanie tworzenia obiektów............................................................................672 Ponowne wykorzystanie obiektów ...........................................................................672 Pule obiektów............................................................................................................673 Zauwa alna wydajność ...................................................................................................674 Rozdzielczość zegara ................................................................................................674 Podsumowanie ................................................................................................................679 Rozdział 17. Tworzenie dźwięków i grafiki gry .................................................... 681 Wybór wyglądu i sposobu działania gry .........................................................................682 Szukanie inspiracji ....................................................................................................682 Zachowywanie spójności ..........................................................................................683 Zdobywanie darmowych materiałów do gry...................................................................683 Praca z grafikami i autorami dźwięków..........................................................................684 Narzędzia.........................................................................................................................685 Tworzenie dźwięków ......................................................................................................685 Formaty plików dźwiękowych..................................................................................687 Tworzenie tekstur i duszków...........................................................................................687 Formaty plików graficznych .....................................................................................688 Tworzenie tekstur bezszwowych ..............................................................................689 Tworzenie tekstur zastępczych .................................................................................690
  • 10. Spis treści 13 Tworzenie tekstur przejściowych .............................................................................691 Tworzenie wielopoziomowych tekstur .....................................................................692 Tworzenie obrazów tytułowych i grafiki dla wyświetlaczy HUD..................................694 Tworzenie grafiki interfejsu u ytkownika ......................................................................694 Dostosowywanie komponentów Swing....................................................................694 Tworzenie własnych czcionek ........................................................................................696 Podsumowanie ................................................................................................................701 Rozdział 18. Projekt gry i ostatnie 10% prac ...................................................... 703 Ostatnie 10% prac ...........................................................................................................704 Efekty........................................................................................................................704 Maszyna stanów gry .................................................................................................705 Elementy projektu gry.....................................................................................................711 Środowiska................................................................................................................712 Fabuła........................................................................................................................712 Właściwa gra.............................................................................................................714 Uczenie gracza sposobu gry......................................................................................716 Tworzenie edytora map...................................................................................................717 Szukanie błędów .............................................................................................................719 Problemy z szukaniem błędów w Java2D ................................................................722 Rejestrowanie zdarzeń ..............................................................................................723 Ochrona kodu ..................................................................................................................725 Dystrybucja gry ...............................................................................................................726 Dystrybucja gry za pomocą Java Web Start....................................................................728 Pobieranie zasobów z plików .jar .............................................................................728 Podpisywanie plików .jar..........................................................................................728 Tworzenie pliku JNLP ..............................................................................................729 Konfigurowanie serwera WWW...............................................................................731 Dystrybucja gry w postaci kompilacji natywnej .............................................................732 Aktualizacje i łatki ..........................................................................................................733 Problem obcią enia serwera............................................................................................733 Opinie u ytkowników i testy beta...................................................................................734 Zarabianie pieniędzy .......................................................................................................736 Łączymy wszystko razem ...............................................................................................737 Podsumowanie ................................................................................................................737 Rozdział 19. Przyszłość ..................................................................................... 739 Ewolucja Javy .................................................................................................................739 Java Community Process ..........................................................................................740 Bug Parade ................................................................................................................740 Przyszłość: Java 1.5 „Tiger” ...........................................................................................740 Szablony (JSR 14).....................................................................................................741 Wyliczenia (JSR 201) ...............................................................................................742 Statyczne importowanie (JSR 201)...........................................................................743 Poprawiona pętla for (JSR 201)................................................................................744 Interfejs API kompilatora (JSR 199) ........................................................................744 Format transferu sieciowego (JSR 200)....................................................................745 Współdzielona maszyna wirtualna (JSR 121) ..........................................................745 Wymagania stawiane platformie Java.............................................................................746 Potrzebne: więcej opcji dla obsługi myszy i klawiatury...........................................746 Potrzebne: obsługa joysticka.....................................................................................747 Potrzebne: przyspieszane sprzętowo, półprzezroczyste obrazy................................747 Potrzebne: dokładniejszy zegar.................................................................................747
  • 11. 14 Java. Tworzenie gier Potrzebne: grafika przyspieszana sprzętowo i tryb pełnoekranowy w systemie Linux....................................................................................................748 Potrzebne: trójwymiarowa grafika przyspieszana sprzętowo, włączona do środowiska Javy ................................................................................748 Potrzebne: optymalizacja rozkazów SIMD w maszynie HotSpot ............................749 Po ądane: więcej opcji wygładzania czcionek .........................................................750 Pozostałe mo liwości................................................................................................752 Nowe urządzenia i Javy Games Profile (JSR 134) .........................................................752 Podsumowanie ................................................................................................................753 Dodatki .......................................................................................755 Skorowidz...................................................................................... 757
  • 12. 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 przesuwaniem. 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 kolizji.
  • 13. 490 Część II ♦ Grafika trójwymiarowa i zaawansowane techniki programowania 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 znajdują się na dwóch ró nych krańcach świata przedstawionego w grze. Nale y się tak e zastanowić, czy w świecie z 1 000 poruszających się obiektów ma sens testowanie wystąpienia kolizji pomiędzy ka dą parą obiektów — czyli w sumie 999 000 testów? Powinniśmy więc próbować maksymalnie ograniczyć liczbę obiektów, w przypadku których staramy się wykryć wystąpienie zdarzenia kolizji. Najprostszym sposobem na wprowadzenie takiego ograniczenia jest testowanie tylko obiektów znajdujących się stosunkowo blisko gracza. Wykrywanie kolizji. Wybór techniki wykrywania kolizji zale y od oczekiwanej dokładności kolizji w grze. Mo na oczywiście zastosować doskonały algorytm wykrywania kolizji i sprawdzać wszystkie wielokąty nale ące do obiektu ze wszystkimi wielokątami tworzącymi inny obiekt, nale y jednak brać pod uwagę związany z takim działaniem koszt obliczeniowy. Podobnie, w świecie dwuwymiarowym moglibyśmy testować ewentualne kolizje wszystkich pikseli jednego dwuwymiarowego obiektu ze wszystkimi pikselami innego obiektu. W grach komputerowych stosuje się zwykle mniej dokładne techniki wykrywania kolizji, które jednak wykonują swoje zadanie znacznie szybciej. Obsługa kolizji. Jeśli dany obiekt koliduje z innym elementem sceny, nale y być przygotowanym na ró ne sposoby obsługi ró nych typów kolizji. Przykładowo, pocisk kolidujący z robotem mo e spowodować zniszczenie zarówno pocisku, jak i robota. Obiekt dochodzący do ściany mo e się dalej 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 kolizji; szybkie podejmowanie decyzji, czy kolizja wystąpiła; zapewnianie mechanizmu wykrywania kolizji o wystarczającej precyzji; obsługiwanie kolizji w naturalny sposób, który nie będzie 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 niektórych miejscach mapy.
  • 14. 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 lub z elementami środowiska. 3. Jeśli wykryto kolizję, ustaw obiekt na jego wcześniejszej 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ędzy 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 obiekty, 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ć
  • 15. 492 Część II ♦ Grafika trójwymiarowa i zaawansowane techniki programowania 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 polach. Jeśli wykorzystujemy drzewo BSP, mo emy rysować tyl- ko te obiekty, które znajdują się w polach z widocznymi liśćmi. Kod przypisujący obiekty do pól siatki jest trywialny — na potrzeby przykładów z tego rozdziału zaimplementowaliśmy go w klasie )TKF)COG1DLGEV/CPCIGT. Kiedy obiekt jest aktualizowany, wywoływana jest metoda EJGEM1DLGEV%QNNKUKQP (patrz listing 11.1), która odpowiada za wykrywanie ewentualnych kolizji pomiędzy tym obiektem a obiek- tami znajdującymi się w tych samych i w przylegających polach siatki. Listing 11.1. Sprawdzanie przylegających komórek (plik GridGameObjectManager.java)
  • 16.
  • 17. -NCUC %GNN TGRTGGPVWLG MQOÎTMú UKCVMK -NCUC CYKGTC NKUVú QDKGMVÎY Y ITG K YUMC PKM KEJ YKFQEPQ EK
  • 18. RTKXCVG UVCVKE ENCUU %GNN ] .KUV QDLGEVU DQQNGCP XKUKDNG %GNN ] QDLGEVU PGY #TTC[.KUV XKUKDNG HCNUG _ _
  • 19. Rozdział 11. ♦ Wykrywanie kolizji 493
  • 20.
  • 21. 5RTCYFC E[ FCP[ QDKGMV MQNKFWLG MVÎT[OMQNYKGM RQQUVC [EJ QDKGMVÎY
  • 22. RWDNKE DQQNGCP EJGEM1DLGEV%QNNKUKQP )COG1DLGEV QDLGEV 8GEVQT QNF.QECVKQP ] DQQNGCP EQNNKUKQP HCNUG 7 [L YURÎ TúFP[EJ Z FNC QDKGMVW RQ[ELC Y RQKQOKG KPV Z EQPXGTV/CR:VQ)TKF: KPVQDLGEVIGV: KPV [ EQPXGTV/CR;VQ)TKF; KPVQDLGEVIGV 5RTCYF MQOÎTGM QVCECLæE[EJ QDKGMV HQT KPV KZ KZ K ] HQT KPV L[ L[ L ] %GNN EGNN IGV%GNN K L KH EGNN PWNN ] EQNNKUKQP ^ EQNNKUKQPGVGEVKQPEJGEM1DLGEV QDLGEV EGNNQDLGEVU QNF.QECVKQP _ _ _ TGVWTP EQNNKUKQP _ Powy szy kod wywołuje zdefiniowaną w klasie %QNNKUKQPGVGEVKQP metodę EJGEM 1DLGEV , która wykrywa kolizję pomiędzy danym obiektem a listą obiektów. Imple- mentacją klasy %QNNKUKQPGVGEVKQP zajmiemy się za chwilę. Sfery otaczające Niedokładną, ale szybką techniką wykrywania kolizji jest zastosowanie tzw. sfer otacza- jących; przykład takiej sfery otaczającej obiekt przedstawia rysunek 11.2. Rysunek 11.2. Do wykrywania kolizji mo na u yć sfer otaczających Kiedy sfery otaczające dwa obiekty kolidują ze sobą, ich kolizja jest traktowana jak kolizja otaczanych przez nie obiektów. Oto nasza pierwsza próba zaimplementowania testu wykrywającego kolizję dwóch sfer otaczających:
  • 23. 494 Część II ♦ Grafika trójwymiarowa i zaawansowane techniki programowania gier FZ QDLGEV#Z QDLGEV$Z F[ QDLGEV#[ QDLGEV$[ F QDLGEV# QDLGEV$ OKPKUVCPEG QDLGEV#TCFKWU QDLGEV$TCFKWU KH /CVJUSTV FZ
  • 24. FZ F[
  • 25. F[ F
  • 26. F OKPKUVCPEG ] 9[MT[VQ MQNKLú _ Wywołanie funkcji /CVJUSTV wią e się jednak z wykonaniem du ej ilości obliczeń. Mo emy uniknąć tego wywołania, podnosząc do kwadratu obie strony nierówności i otrzymując prostsze oraz znacznie szybciej obliczane wyra enie warunkowe: KH FZ
  • 27. FZ F[
  • 28. F[ F
  • 30. OKPKUVCPEG ] 9[MT[VQ MQNKLú _ Jeśli Twoja gra wyświetla obraz dwuwymiarowy zamiast scen trójwymiarowych, za- miast kolizji sfer mo esz testować wystąpienia kolizji okręgów, wystarczy usunąć z rów- nań składniki odnoszące się do współrzędnej z. Testowanie występowania kolizji pomiędzy sferami otaczającymi jest stosunkowo pro- ste, ale tak e bardzo niedokładne. Przykładowo na rysunku 11.3 widać sferę otaczającą gracza, która koliduje ze sferą otaczającą robota, chocia same obiekty gracza i robota wcale ze sobą nie kolidują. Rysunek 11.3. Niedokładność sfer otaczających: para sfer ze sobą koliduje, mimo e otaczane obiekty znajdują się w pewnej odległości Oczywiście taka niedokładność w wielu grach nie będzie dla gracza zauwa alna. Przy- kładowo w przypadku szybkiej gry akcji, w której biegamy po pomieszczeniach oraz podnosimy apteczki i amunicję, prawdopodobnie nie będzie dla nas miało znaczenia, czy podnosimy te obiekty na moment przed ich faktycznym dotknięciem. Jednak w innych sytuacjach taki brak precyzji mo e być irytujący, np. kiedy uda Ci się zranić przeciw- nika, którego nawet nie dotknąłeś. Po otrzymaniu pozytywnego wyniku testu kolizji sfer otaczających mo emy pójść krok dalej i wykonać bardziej szczegółowe testy, np. sprawdzić ewentualne występowanie kolizji pomiędzy wszystkimi parami wielokątów tworzących oba obiekty. Inną metodą jest wykorzystanie do testów zbioru sfer otaczających (patrz rysunek 11.4). Na rysunku dla robota skonstruowano trzy sfery otaczające, które bardziej precyzyjnie opisują jego kształt. Po otrzymaniu pozytywnego wyniku testu kolizji podstawowych (najmniej dokładnych) sfer otaczających mo emy przetestować drugi (bardziej dokład- ny) zbiór sfer. Jeśli którakolwiek ze zbioru sfer gracza koliduje z którąkolwiek ze zbioru sfer robota, wówczas mo emy uznać, e oba obiekty ze sobą kolidują.
  • 31. Rozdział 11. ♦ Wykrywanie kolizji 495 Rysunek 11.4. Wiele sfer otaczających mo na wykorzystać do przeprowadzania bardziej precyzyjnych testów występowania kolizji Mamy więc dwa poziomy sfer dla wszystkich obiektów w grze. Nie musimy oczywiście na tym poprzestawać. Moglibyśmy dodać jeszcze kilka poziomów, z których ka dy opierałby się na większej liczbie sfer otaczających i zapewniałby większą dokładność. Taka technika jest często nazywana drzewem sfer lub podziałem sfer. Mo emy w ten sposób szybko wykluczyć z przetwarzania obiekty, które ze sobą nie kolidują, oraz wy- konać bardziej precyzyjne testy dla obiektów powodujących potencjalną kolizję. Oma- wiane podejście pozwala nam tak e stwierdzić, która część obiektu została trafiona, dzięki czemu mo emy wykrytą kolizję odpowiednio obsłu yć. Przykładowo robota tra- fionego pociskiem rakietowym mo emy pozbawić uszkodzonej nogi. Zauwa , e drzewa sfer otaczających musza się obracać wraz z obracającym się otacza- nym obiektem. Przykładowo sfery muszą zmieniać swoje poło enie wraz ze zmianą poło enia ramienia robota. W kodzie zaprezentowanym w rozdziale 9., „Obiekty trój- wymiarowe”, zdefiniowaliśmy trójwymiarowe obiekty reprezentowane jako zagnie - d one grupy wielokątów. Poniewa była to ju struktura drzewiasta, w celu zaimple- mentowania drzewa sfer mo emy nadać ka dej grupie wielokątów jej własny zbiór sfer i zapewnić przeło enie ruchu grup na odpowiedni ruch sfer. W tym rozdziale nie bę- dziemy implementować drzew sfer, warto jednak brać pod uwagę takie rozwiązanie pod- czas tworzenia gier. Podsumujmy: przed narysowaniem typowej klatki większość obiektów nie wymaga przeprowadzania testów wystąpienia kolizji. W niektórych przypadkach konieczne jest przeprowadzenie prostego testu, a kilka obiektów wymaga najbardziej skomplikowa- nych i kosztownych obliczeniowo testów na wystąpienie kolizji. Walce otaczające Alternatywą dla sfer otaczających są pionowe walce otaczające (patrz rysunek 11.5). Ta- kie rozwiązanie pozwala zredukować testy na występowanie kolizji do sprawdzenia dwu- wymiarowych okręgów i testów poło enia pionowych linii (a więc w jednym wymiarze).
  • 32. 496 Część II ♦ Grafika trójwymiarowa i zaawansowane techniki programowania gier Rysunek 11.5. Do wykrywania kolizji mo na tak e wykorzystać pionowy walec otaczający Pionowe walce otaczające najlepiej nadają się do — lepszego ni w przypadku poje- dynczej sfery otaczającej — opisywania wysokich, cienkich obiektów (np. graczy lub potworów). W tym rozdziale w naszym mechanizmie trójwymiarowym zaimplemen- tujemy wykrywanie kolizji typu obiekt-obiekt właśnie przy wykorzystaniu pionowych walców otaczających. Całość prezentowanego kodu odpowiadającego za proste wykrywanie kolizji umie- ściliśmy w klasie %QNNKUKQPGVGEVKQP. Zawarte w tej klasie metody obsługujące kolizje typu obiekt-obiekt przedstawiono na listingu 11.2. Listing 11.2. Sprawdzanie obiektów CollisionDetection.java
  • 33.
  • 34. 5RTCYFC E[ FCP[ QDKGMV MQNKFWLG FQYQNP[O KPP[O QDKGMVGO RTGEJQY[YCP[O PC RTGMCCPGL NK EKG
  • 35. RWDNKE DQQNGCP EJGEM1DLGEV )COG1DLGEV QDLGEV# .KUV QDLGEVU 8GEVQT QNF.QECVKQP ] DQQNGCP EQNNKUKQP HCNUG HQT KPV K KQDLGEVUUKG K ] )COG1DLGEV QDLGEV$ )COG1DLGEVQDLGEVUIGV K EQNNKUKQP ^ EJGEM1DLGEV QDLGEV# QDLGEV$ QNF.QECVKQP _ TGVWTP EQNNKUKQP _
  • 36.
  • 37. YTCEC YCTVQ è VTWG LG NK FYC RTGMCCPG QDKGMV[ G UQDæ MQNKFWLæ 1DKGMV # RQTWUC UKú C QDKGMV $ RQFNGIC URTCYFGPKW /GVQFC Y[MQT[UVWLG FQ Y[MT[YCPKC MQNKLK RKQPQYG YCNEG QVCECLæEG Q QMTæI GL RQFUVCYKG
  • 38. RWDNKE DQQNGCP EJGEM1DLGEV )COG1DLGEV QDLGEV# )COG1DLGEV QDLGEV$ 8GEVQT QNF.QECVKQP ] 1DKGMV PKG OQ G MQNKFQYCè UCO[O UQDæ KH QDLGEV# QDLGEV$ ] TGVWTP HCNUG _
  • 39. Rozdział 11. ♦ Wykrywanie kolizji 497 2QN[IQP)TQWR$QWPFU DQWPFU# QDLGEV#IGV$QWPFU 2QN[IQP)TQWR$QWPFU DQWPFU$ QDLGEV$IGV$QWPFU 0CLRKGTY URTCYFCO[ MQNKLG Y QUK [ CM CFCO[ G Y[UQMQ è LGUV UVC C HNQCV #[ QDLGEV#IGV; DQWPFU#IGV$QVVQO*GKIJV HNQCV #[ QDLGEV#IGV; DQWPFU#IGV6QR*GKIJV HNQCV $[ QDLGEV$IGV; DQWPFU$IGV$QVVQO*GKIJV HNQCV $[ QDLGEV$IGV; DQWPFU$IGV6QR*GKIJV KH $[ #[ ^^ $[ #[ ] TGVWTP HCNUG _ 0CUVúRPKG URTCYFCO[ FYC Y[OKCT[ MQNKLG RQYKGTEJPK Z QMTæI [EJ RQFUVCY YCNEÎY HNQCV FZ QDLGEV#IGV: QDLGEV$IGV: HNQCV F QDLGEV#IGV QDLGEV$IGV HNQCV OKPKUV DQWPFU#IGV4CFKWU DQWPFU$IGV4CFKWU HNQCV FKUV5S FZ
  • 40. FZ F
  • 41. F HNQCV OKPKUV5S OKPKUV
  • 42. OKPKUV KH FKUV5S OKPKUV5S ] TGVWTP JCPFNG1DLGEV%QNNKUKQP QDLGEV# QDLGEV$ FKUV5S OKPKUV5S QNF.QECVKQP _ TGVWTP HCNUG _
  • 43.
  • 44. 1DU WIWLG MQNKLú QDKGMVW 1DKGMV # RQTWUC UKú PCVQOKCUV QDKGMV $ LGUV V[O QDKGMVGO MVÎT[O MQNKFWLG QDKGMV #
  • 45. RTQVGEVGF DQQNGCP JCPFNG1DLGEV%QNNKUKQP )COG1DLGEV QDLGEV# )COG1DLGEV QDLGEV$ HNQCV FKUV5S HNQCV OKPKUV5S 8GEVQT QNF.QECVKQP ] QDLGEV#PQVKH[1DLGEV%QNNKUKQP QDLGEV$ TGVWTP VTWG _ W powy szym kodzie obiekty w grze są związane z obiektami klasy 2QN[IQP)TQWR $QWPFU, które otaczają tworzące je grupy wielokątów odpowiednimi walcami. Opis wal- ca otaczającego składa się z promienia podstawy walca oraz wysokości, na jakiej znaj- duje się podstawa dolna walca (zwykle 0) i podstawa górna. Metoda EJGEM1DLGEV jedynie sprawdza, czy dwa walce otaczające ze sobą kolidują; jeśli tak się dzieje, wywoływana jest metoda JCPFNG1DLGEV%QNNKUKQP . Metoda JCPFNG1DLGEV%QNNKUKQP jedynie sygnalizuje (za pomocą metody PQVKH[1DLGEV %QNNKUKQP ) poruszającemu się obiektowi, e jego ruch spowodował kolizję. Ta i inne metody umo liwiające sygnalizowanie podobnych zdarzeń znajdują się w klasie )COG 1DLGEV, nie ma w ich przypadku jednak domyślnie zdefiniowanych działań — w razie potrzeby podklasy klasy )COG1DLGEV mogą przesłaniać te metody. Przykładowo zdefinio- wana w klasie $NCUV metoda PQVKH[1DLGEV%QNNKUKQP jest wykorzystywana do niszcze- nia robota, który koliduje z pociskiem reprezentowanym przez obiekt tej klasy:
  • 46. 498 Część II ♦ Grafika trójwymiarowa i zaawansowane techniki programowania gier RWDNKE XQKF PQVKH[1DLGEV%QNNKUKQP )COG1DLGEV QDLGEV ] 0KUE[ TQDQVC K UCO RQEKUM KH QDLGEV KPUVCPEGQH $QV ] UGV5VCVG QDLGEV 56#6'A'5641;' UGV5VCVG 56#6'A'5641;' _ _ Na razie w klasie )TKF)COG1DLGEV/CPCIGT zastosujemy rozwiązanie, w którym poru- szający się obiekt powodujący kolizję jest przenoszony do swojej poprzedniej lokaliza- cji. W przyszłości opracujemy bardziej realistyczną reakcję na kolizje typu obiekt-obiekt, czyli przemieszczanie się wzdłu obiektu. Problem przetwarzania dyskretno-czasowego Typowa gra aktualizuje swój stan w dyskretnych odstępach czasowych — w taki wła- śnie sposób aktualizujemy poło enie ka dego obiektu na podstawie czasu, jaki upłynął od ostatniej aktualizacji. Przykładowo na rysunku 11.6 widać widziany z góry ruch obiektu, ujęty w kolejnych odstępach czasu. Widać wyraźnie, jak poruszający się obiekt koliduje z większym obiektem w trzeciej klatce. Rysunek 11.6. Widziane z góry kolejne lokalizacje poruszającego się obiektu Niestety, taki sposób obsługi ruchu obiektów mo e uniemo liwiać prawidłowe wykry- wanie kolizji. Wyobraź sobie, e obiekt porusza się szybciej lub szybkość odtwarza- nia klatek jest mniejsza. W takiej sytuacji poruszający się obiekt mo e „minąć” obiekt, z którym faktycznie powinien kolidować. Przykładowo na rysunku 11.7 poruszający się obiekt koliduje z większym obiektem pomiędzy drugą a trzecią klatką. Rysunek 11.7. Problem powodowany przez przetwarzanie dyskretno-czasowe: obiekt mo e „minąć” inny obiekt w sytuacji, gdy powinna zostać wykryta kolizja
  • 47. Rozdział 11. ♦ Wykrywanie kolizji 499 Istnieje kilka rozwiązań tego problemu. Bardziej precyzyjnym, ale te bardziej kosztow- nym obliczeniowo sposobem jest połączenie walców (lub innych brył) otaczających poruszający się obiekt w jedną bryłę, od początkowej do końcowej lokalizacji (patrz rysunek 11.8). Rysunek 11.8. Poruszający się obiekt mo na traktować jak „rurę”, co rozwiązuje problem powodowany przez przetwarzanie dyskretno-czasowe Alternatywnym rozwiązaniem jest testowanie wystąpień kolizji w dodatkowych punk- tach pomiędzy początkową i końcową lokalizacją poruszającego się obiektu. Na rysun- ku 11.7 takie punkty moglibyśmy dodać w połowie odległości pomiędzy ka dą klatką. Kolizje typu obiekt-świat Kolizje obiektów ze środowiskiem, w którym występują, powinny być obsługiwane ze szczególną starannością. Nie chcemy przecie , by gracz lub inny obiekt mógł przechodzić przez ścianę lub by nienaturalnie się trząsł podczas przemieszczania się wzdłu ściany. W rozdziale 5. zaimplementowaliśmy kolizje typu obiekt-świat, zmieniając w tym sa- mym czasie tylko jedną współrzędną (najpierw x, potem y), co sprawdzało się doskonale w przypadku prostego świata dwuwymiarowego, w którym obiekty nie przemieszczają się szybciej ni o jedną jednostkę w klatce. W trójwymiarowym świecie nie istnieją tak zdefiniowane jednostki — zwykle mo emy jednak opisać taki świat za pomocą struktury ułatwiającej wykrywanie kolizji, np. drze- wa BSP. Do zaimplementowania kolizji obiektów z podłogami, sufitami i ścianami wy- korzystamy opracowane w poprzednim rozdziale dwuwymiarowe drzewo BSP. Prostopadłościany otaczające, wykorzystywane do wykrywania kolizji z podłogami W dwuwymiarowej grze, stworzonej w rozdziale 5., do wykrywania kolizji potrzebo- waliśmy prostokątów otaczających. W środowisku trójwymiarowym, poza stosowa- niem sfer, okręgów, walców i prostopadłościanów otaczających, istnieje jeszcze kilka innych popularnych mechanizmów wykrywania kolizji. Dostępne są dwa typy prosto- padłościanów otaczających: o dowolnym ustawieniu i dopasowane do osi. Prostopa- dłościany otaczające o dowolnym ustawieniu mo na swobodnie obracać, natomiast prostopadłościany dopasowane do osi muszą zawsze być wyrównane do osi x, y i z. W tym rozdziale będziemy wykorzystywali pionowe walce otaczające do wykrywania
  • 48. 500 Część II ♦ Grafika trójwymiarowa i zaawansowane techniki programowania gier kolizji typu obiekt-obiekt, natomiast do wykrywania kolizji typu obiekt-świat u yje- my dopasowanych do osi prostopadłościanów otaczających. W pierwszej kolejności zajmiemy się kolizjami z podłogami i sufitami. Chcielibyśmy, by w środowisku, w któ- rym podłogi mogą się znajdować na ró nych wysokościach, obiekty znajdowały się na najwy szym poziomie podłogi pod prostopadłościanem otaczającym (patrz rysunek 11.9). Podobnie nie chcemy, by obiekty poruszały się w obszarach, gdzie strop jest dla nich zbyt niski. Chcielibyśmy tak e umo liwić obiektom w grze pokonywanie niewysokich stopni bez zatrzymywania. W sytuacji przedstawionej na poni szym rysunku gracz mo- e płynnie pokonać stopień znajdujący się nieznacznie wy ej ni podłoga. Rysunek 11.9. Kolizja prostopadłościanu otaczającego z podłogą (stopniem): prostopadłościan otaczający gracza częściowo znajduje się na stopniu, zatem wysokość tego stopnia jest wykorzystywana jako wysokość „podłogi” pod graczem Na rysunku 11.9 najwy szy poziom pod zastosowaną bryłą otaczającą obiekt jest wyko- rzystywany do wyznaczenia wysokości, na której ten obiekt się znajduje. Testując wy- stępowanie ewentualnych kolizji pomiędzy obiektem a podłogą lub sufitem w danym pomieszczeniu, mo emy sprawdzić, czy którykolwiek z wierzchołków prostopadłościa- nu nie znajduje się pod powierzchnią podłogi lub nad powierzchnią sufitu. Oznacza to, e sprawdzenie, na jakiej wysokości powinien się znaleźć obiekt, wymaga przete- stowania czterech wierzchołków prostopadłościanu otaczającego. Warto zaznaczyć, e prostopadłościany otaczające mo na wykorzystać tak e do wy- krywania kolizji typu obiekt-obiekt. Mo emy tak e stworzyć drzewo prostopadłościa- nów otaczających, tak jak drzewo sfer otaczających. Znajdowanie liścia drzewa BSP dla danego położenia Informacje o podłodze są przechowywane w liściu dwuwymiarowego drzewa BSP. Istnieje mo liwość stosunkowo łatwego odszukania właściwego liścia dla danej loka- lizacji — wystarczy wykorzystać algorytm podobny do tego, za pomocą którego prze- glądaliśmy drzewo w poprzednim rozdziale (patrz listing 11.3). Listing 11.3. Metoda getLeaf() dostępna w pliku BSPTree.java
  • 49.
  • 50. YTCEC NK è Y MVÎT[O PCLFWLG UKú RWPMV Q YURÎ TúFP[EJ Z
  • 51. RWDNKE .GCH IGV.GCH HNQCV Z HNQCV ] TGVWTP IGV.GCH TQQV Z _
  • 52. Rozdział 11. ♦ Wykrywanie kolizji 501 RTQVGEVGF .GCH IGV.GCH 0QFG PQFG HNQCV Z HNQCV ] KH PQFG PWNN ^^ PQFG KPUVCPEGQH .GCH ] TGVWTP .GCHPQFG _ KPV UKFG PQFGRCTVKVKQPIGV5KFG6JKP Z KH UKFG $52.KPG$#%- ] TGVWTP IGV.GCH PQFGDCEM Z _ GNUG ] TGVWTP IGV.GCH PQFGHTQPV Z _ _ Za pomocą powy szej metody znajdujemy oczywiście liść tylko dla jednej lokalizacji, natomiast prostopadłościan otaczający obiekt mo e teoretycznie rozciągać się na kilka liści. Oznacza to, e powinniśmy znajdować liście dla wszystkich wierzchołków pro- stopadłościanu otaczającego. Implementacja testów wysokości podłogi i sufitu Testowanie wszystkich wierzchołków prostopadłościanu otaczającego w porównaniu z wysokościami podłogi i sufitu jest realizowane za pomocą kilku metod dostępnych w klasie %QNNKUKQPGVGEVKQP (patrz listing 11.4). Listing 11.4. Sprawdzanie kolizji z podłogą i sufitem (plik CollisionDetection.java)
  • 53.
  • 54. 9KGTEJQ MK QVCECLæEG QDKGMV Y ITG Uæ Y[MQT[UV[YCPG FQ Y[MT[YCPKC MQNKLK RQKQO[OK YKGNQMæVCOK RQF QICOK K UWHKVCOK RTGEJQY[YCP[OK Y FTGYKG $52 9KGTEJQ MK Uæ WRQTæFMQYCPG Y MQNGLPQ EK CNDQ IQFPGL MKGTWPMKGO TWEJW YUMCÎYGM GICTC CNDQ IQFPGL QFYTQVP[O MKGTWPMKGO
  • 55. RTKXCVG UVCVKE HKPCN 2QKPV(NQCV=? %140'45 ] PGY 2QKPV(NQCV PGY 2QKPV(NQCV PGY 2QKPV(NQCV PGY 2QKPV(NQCV _ IGV(NQQT#PF%GKNKPI QDLGEV EJGEM(NQQT#PF%GKNKPI QDLGEV GNCRUGF6KOG
  • 56.
  • 57. YTCEC YCTVQ EK QRKUWLæEG RQF QIú K UWHKV FNC FCPGIQ QDKGMVW Y ITG QDKGMVW MNCU[ )COG1DLGEV 9[YQ WLG OGVQF[ QDLGEVUGV(NQQT*GKIJV K QDLGEVUGV%GKN*GKIJV Y EGNW WUVCYKGPKC QFRQYKGFPKEJ YCTVQ EK FNC RQF QIK K UWHKVW
  • 58. RWDNKE XQKF IGV(NQQT#PF%GKNKPI )COG1DLGEV QDLGEV ] HNQCV Z QDLGEVIGV: HNQCV QDLGEVIGV
  • 59. 502 Część II ♦ Grafika trójwymiarowa i zaawansowane techniki programowania gier HNQCV T QDLGEVIGV$QWPFU IGV4CFKWU HNQCV HNQQT*GKIJV (NQCV/+0A8#.7' HNQCV EGKN*GKIJV (NQCV/#:A8#.7' $526TGG.GCH NGCH DUR6TGGIGV.GCH Z KH NGCH PWNN ] HNQQT*GKIJV NGCHHNQQT*GKIJV EGKN*GKIJV NGCHEGKN*GKIJV _ 5RTCYFC EVGT[ QVCECLæEG RWPMV[ HQT KPV K K%140'45NGPIVJ K ] HNQCV Z1HHUGV T
  • 60. %140'45=K?Z HNQCV 1HHUGV T
  • 61. %140'45=K?[ NGCH DUR6TGGIGV.GCH Z Z1HHUGV 1HHUGV KH NGCH PWNN ] HNQQT*GKIJV /CVJOCZ HNQQT*GKIJV NGCHHNQQT*GKIJV EGKN*GKIJV /CVJOKP EGKN*GKIJV NGCHEGKN*GKIJV _ _ QDLGEVUGV(NQQT*GKIJV HNQQT*GKIJV QDLGEVUGV%GKN*GKIJV EGKN*GKIJV _
  • 62.
  • 63. 5RTCYFC E[ QDKGMV MQNKFWLG RQF QIæ K UWHKVGO 9[MQT[UVWLG OGVQF[ QDLGEVIGV(NQQT*GKIJV K QDLGEVIGV%GKN*GKIJV FQ QVT[OCPKC YCTVQ EK QRKUWLæE[EJ RQF QIú K UWHKV