Jak napisać silnik do gier (1)

Robię kolejny silnik do gier. Ale robię go w sposób inny niż zwykle. No bo zwykle, jak robię takie rzeczy (bo ja to już nie jeden silnik zrobiłem, nawet jeśli były to małe silniki), zajmuję się najpierw technicznymi aspektami takimi jak wydajne wyświetlanie grafiki w WebGL choćby. A teraz? No teraz właśnie uznałem, że techniczne aspekty mam już obcykane, bo nauczyłem się ich w poprzednich projektach. Teraz co robię? Ano zdbam o samą architekturę tego silnika. Żeby to dało się utrzymywać potem.

Ogólnie zanim zacząłem pisać, to sobie rozpisałem to na kartce, jak to ma wyglądać, cały przepływ danych. I wygląda to mniej więcej tak:

INPUT -> EVENT HANDLERS -> ACTION DISPATCHER -> STATE -> STATE DELTAS -> RENDERER

Czyli najpierw jest input, jakieś zewnętrzne zdarzenie, które powoduje odpalenie kodu. Np. użytkownik wcisnął jakiś klawisz. Albo po prostu odpalił się czas na apdejt kolejnej klatki.

Event handlery coś tam robią i następnie rozsyłają odpowiednie akcje (jak w Redux, ale NIE używam Reduxa, po prostu chodzi o nazewnictwo i samą koncepcję).

Dispatcher obsługuje akcje i zamienia na konkretne wywołania metod, które zmieniają stan.

Stan jest mutowalny, ale każda mutacja jest śledzona i później tworzone są tzw. delty, tj. obiekty zawierające informacje o zmianach.

Te delty łapie renderer, który na ich podstawie może sobie ogarnąć, co dalej zrobić (np. obecny renderer działa na divach, więc przy dodaniu obiektu, renderer tworzy diva, a przy apdejcie stanu, uaktualnia tego diva (np. zmienia mu pozycję).

No i tak to wygląda mniej więcej, chociaż możliwe, że jeszcze to trochę pozmieniam.

No i mam jeszcze dylemat - gdzie powinna być fizyka czy AI? Ale przypuszczalnie tam gdzie Event Handlers. Bo w zasadzie część "decydująca", aktywna jest przed action dispatcherem, później to już jedzie z automatu, action dispatcher rozsyła akcje, stan się aktualizuje, później renderer to przetwarza.

No i na razie tyle. Taki tylko szkic silnika wam tutaj pokazałem. Zapewne będą jeszcze apdejty z tego projektu. Albo przykładowe gry utworzone w tym silniku. Tyle, że to robota na ileś miesięcy tak naprawdę, więc wiecie...

Komentarze

Popularne posty z tego bloga

Ściemy z ogłoszeń o pracę

Zostać programistą (2) - czy się nadajesz?

Czego się nauczyłem w 2021?