Wzory jako fundamenty mechaniki gier komputerowych

Gry komputerowe to niezwykle złożone programy. Ich proces tworzenia wymaga wielu godzin myślenia nad najróżniejszymi aspektami. Rozgrywka, fabuła i klimat – to tylko niektóre z nich, a każde wymaga uprzedniego zaprojektowania.

W tym artykule przyjrzymy się mechanice gier, czyli zagadnieniu które definiuje co dzieje się za kulisami w momencie: zadawania ciosu przez wielkiego barbarzyńce, wystrzału piłki w grze sportowej lub naciśnięcia przycisku końca tury w strategicznym starciu z oponentem.

Jako że nie stworzyłem jeszcze żadnej z przedstawionych wyżej gier, a tematy chciałbym omawiać na przykładach, spojrzymy bliżej na mechanikę turowej gry wyścigowej mojego autorstwa. Wiem, nie brzmi zbyt ekscytująco…
Gwarantuję jednak, że kryje się za nią dużo wartościowej oraz uniwersalnej wiedzy, która tylko czeka, by ktoś po nią sięgnął.

Gra po rozpoczęciu nowego wyścigu składa się z dwóch segmentów: wyboru jakiego konkurenta chcemy zaatakować oraz wykonaniu odpowiedniej akcji. Od strony aplikacji musimy jednak zadbać o więcej aspektów, a tym który nas dzisiaj interesuję będzie etap odpowiadający za obliczanie wyników czasowych oraz ewentualnych poślizgnięć rajdowców.

Rozpoczyna się on, gdy gracz został już zaatakowany przez swoich rywali oraz odpowiednio przyspieszył lub zahamował w zależności od sytuacji. Teraz czas na wykonanie obliczeń… No właśnie i tu dochodzimy do sedna sprawy – potrzebujemy odpowiednich wzorów, a będąc bardziej precyzyjnym całego algorytmu, który będzie je zawierał. Bez niego nasza gra nie będzie responsywna. Znaczy to, że mimo licznych kliknięć użytkownika na tablicy wyników nadal będzie to samo zero, które widział na początku..

Jak więc się do tego zabrać? Intuicja podpowiadałaby żeby wpisać
ten problem w oknie przeglądarki, ale w tym konkretnym
przypadku (Algorytm na wynik w turowej grze wyścigowej) raczej
nie przyniesie to zadowalających skutków. Przejdźmy więc do
tworzenia planu.

A teraz to co dokładnie chcemy zrobić:

  • wziąć parametry określające gracza,
  • wziąć także informacje o trasie,
  • przerobić je w taki sposób, aby otrzymać informacje o tym czy pojazd nie został uszkodzony, a jeśli tak to jak bardzo,

Parametry określające gracza – są to: jego szybkość, to czy usiłował wykonać drift oraz rodzaj wybranych przez niego opon.

Informacje o trasie – powiadamia o tym z jakim terenem mamy do czynienia i czy jest to zakręt, a jeżeli tak to jaka jest prędkość bezpieczna.

Przerobienie informacji – Ten punkt musimy rozbić znowu na podpunkty, ponieważ operacji do wykonania jest kilka.

  • Jeśli droga jest prosta będziemy pomijać fazę testów – zakładamy, że kierowca jest trzeźwy. Dodajemy jednak test na atak gdyż przeciwnicy wciąż mogą nas zepchnąć z trasy.
  • Jeżeli pole przed nami jest zakrętem musimy stworzyć wzór, który zwróci nam procentową szanse na powodzenie, a gdy ją otrzymamy przepuści ją przez algorytm związany z przyczepnością. Czyli pod uwagę weźmiemy parametry opony na powierzchni pola na którym się znajdujemy.
  • Niezależnie od dwóch poprzednich punktów określimy za pomocą kolejnego wzoru – biorącego pod uwagę jedynie prędkość oraz ewentualny drift postaci gracza – wynik.

Jak widzisz zadanie jest naprawdę złożone, pokazuje ono jak ogromne jest spektrum kreacji w programistycznym świecie gier komputerowych. Pozwól, że nie będę jednak omawiał całości zagadnień przedstawionych wyżej. Przypomnę, że tematem są wzory, a nie tworzenie całego fragmentu gry. Zejdźmy więc nieco na ziemie i przyjrzyjmy się ostatniemu punktowi – wynik na podstawie prędkości i ewentualnego driftu.

Załóżmy, że jedno pole to sto metrów, a czas chcemy mierzyć w sekundach. Dodatkowo dla bezpieczeństwa dodajmy, że nasz wzór będzie abstrakcyjny. Czemu? Po pierwsze to gra komputerowa, więc nie wszystko musi być realistyczne, a po drugie rozwiązuje to inny problem, ale o tym zaraz. Zauważyłeś(aś) już pewnie, że moglibyśmy sprowadzić to do prostego wzoru czas = droga przez prędkość. Drift też dalibyśmy radę pod to podciągnąć np. używając go jako mnożnika do prędkości. Czemu więc nie skorzystamy z gotowca?

Nie zrobimy jednak operacji „kopiuj wklej”, ponieważ problem który wspomniałem wcześniej ją uniemożliwia. Wynika on z niemożności dzielenia przez 0. Sytuacja taka mogłaby wystąpić w czasie rozgrywki w momencie kraksy lub poważnego incydentu, które obniżają prędkość gracza do tej nie wygodnej dla nas liczby. Matematyka uratowała nas właśnie przed potencjalnym błędem. Musimy, więc temu zaradzić. Jak to zrobimy ? Dodajmy we wzorze jeden do prędkości tak aby nasz pojazd zawsze poruszał się co najmniej jeden km/h. Nasz wzór wygląda więc tak:

Hmm… mam nadzieję że nie czujesz się źle z tym, że moje długie wypracowanie zwieńczył jednolinijkowy kod skopiowany z książki od fizyki, do którego dodałem jeden.
Pamiętaj, że dobry programista może sobie pozwolić na odrobinę lenistwa, oraz że matematyka to fundament mechaniki w grach komputerowych.

https://github.com/Meridor6919
MB