Strona główna » Po Godzinach » Gry » Niebezpieczny Lot - Kod źródłowy
 

Niebezpieczny Lot - Kod źródłowy

· Gra · Kod Źródłowy ·

Wstęp

Poniżej znajduje się pełne wyjaśnienie kod źródłowego gry Niebezpieczny Lot. Został on zapisany w JavaScript. Gra jest wyświetlana przy wkorzystaniu HTML, CSS oraz SVG. W ten sposób gra jest kompatybilna z każdym rozmiarem ekranu i można w nią grać na każdej platformie.

Kod źródłowy

Przygotowanie gry

Przygotowanie rozgrywki rozpoczyna się w momencie pełnego załadowania DOM. Wtedy inicjalizowane jest okno rozgrywki poprzez funkcję initialize() i puszczane jest intro przy wykorzystaniu funkcji intro.

Funkcja intro() i prepareGame() to bardzo podobne funkcje, ale funkcja prepareGame() nie wyłącza funkcjonolności przeprowadzenia rozgrywki. O stanie trwania rozgrywki mówi zmienna gameRuns, która ma wartość true, gdy rozgrywka aktualnie się toczy. Przygotowanie gry polega na utworzeniu planszy funkcją createBoard() oraz uruchomieniu rozgrywki funkcją gameRun().

Podczas tworzenie planszy ustalane są domyślne parametry rozgrywki: giszex, gsizey - rozmiar okna rozgrywki, shipX, shipY - pozycja statku na mapie, frameModifier - zmienna przyśpieszająca rozgrywkę, animateStars - początkowo gwiazdy się poruszają, points - ile punktów ma gracz oraz asteroids - początkowa ilość asteroid na mapie. Potem tworzone jest pole rozgrywki - obiekt SVG do którego dodawane są gwiazdy i asteroidy z losowymi parametrami. Warto zwrócić uwagę, że początkowo asteroidy zajmują jedynie 70% dolnej części ekranu tak, aby żadna nie trafiła gracza przez pierwsze kilka sekund.

Rakieta jest ustawiana losowo. Model rakiety pobierany jest przy pomocy funkcji getRocket() i zwracany jest obiekt SVG o podanym indeksie. Podobnie jest w przypadku asteroidy. Asteroida jest pobierana przy pomocy funkcji generateAsteroid(), ale nie pobiera żadnych argumentów. W tym miejscu można dodać dodatkowe reguły dotyczące tworzenia asteroid.

Rozgrywkę można zrestartować przy pomocy funkcji restart(), która wywołuje funkcję prepareGame() z ostatnio użytymi ustawieniami.

Rozgrywka

Sercem całej gry jest funkcja gameRun(). W tym miejscu analizowana jest aktualna sytuacja w grze, wejście od użytkownika oraz modyfikowane wartości rozgrywki. Na początku, o ile rozgrywka jest aktywna, funkcja sprawdza wejście od użytkownika oraz zmienia odpowiednio pozycję statku kosmicznego.

Następnie zanimowane zostają gwiazdy, o ile wciąż mają być animowane. Ze względu na wydajność funkcja może zdecydować o wyłączeniu ich animowania. Następnym krokiem jest przesunięcie asteroid. Jednak w tym przypadku należy sprawdzić odległość od statku i jeśli jest dostatecznie mała określić czy nie doszło do kolizji. W przypadku kolizji gra zostaje przerwana, a dla każdego elementu statku wyliczony wektor przyśpieszenia.

Ostatni etap działa funkcji polega na modyfikowaniu prędkości rozgrywki oraz ilości asteroid. Dodatkowo funkcja wie dokładnie ile trwało przygotowanie kolejnej klatki rozgrywki. Na tej podstawione określany jest czas obliczenia następnej klatki. Dzięki temu gra powinna działać z identyczną szybkością na każdym sprzęcie.

Jeśli asteroida w trakcie rozgrywki schowa się po lewej stronie ekranu to jej niektóre ustawienia są resetowane funkcją resetObject(). Z kolei gwiazdy w podobnym scenariuszu metodą resetObjectStar().

Sterowanie

Sterowanie odbywa się na dwa sposoby. Wyższy priorytet ma akcelerometr niż klawiatura. Odczytywanie danych z akcelerometru odbywa się poprzez nasłuchiwanie zdarzenia deviceorientation i jest obsługiwane poprzez funkcję handleOrientation. Z kolei odczytywanie danych z klawiatury odbywa się poprzez tworzenie spacjelnej tablicy i zapisywaniu w niej zdarzenia wciśnięcia lub puszczenia klawisza. Obsługiwane zdarzenia to onkeydown i onkeyup, a dane o wciśniętych klawiszach są przechowywane w zmiennej map.

Funkcje pozostałe

W celu ograniczenia wartości zmiennej val do pewnego zakresu [min, max] można skorzystać z funkcji between(). Niektóre wartości są zaokrąglane do dwóch miejsc po przecinku funkcją near00(). W celu znalezienia miejsca uderzenia czy możliwych kolizji potrzebna jest odległość. Można ją wyliczyć przy pomocy funkcji distance().

Przełączenie gry w tryb ekranowy oraz jego wyłączenie można przeprowadzić funkcją toggleFullScreen(). Za wyświetlanie komunikatów w grze odpowiada funkcja reportStatus(). W przypadku zmiany sposoby pojawiania się komunikatów można je dostosować w tej funkcji.