Jestem na etapie mojego podróżnika Próbuję poradzić sobie z niezależnymi od gracza aktualizacjami stanu gry. Dla odniesienia, projekt jest here (gałąź devel jest odpowiednia dla tego pytania).Funkcjonalny bananowy podróżnik - zdarzenia niezależne od zegara i odtwarzacza
Libraries/Universe/GameState.hs
ma funkcję, updateGS
, która obsługuje wszystkie aktualizacje odtwarzacza do stanu gry. Teraz wygląda to tak: EventNetwork
.
makeNetworkDescription :: AddHandler PlayerCommand ->
AddHandler() ->
TChan GameState ->
IO EventNetwork
makeNetworkDescription addCommandEvent tickHandler gsChannel = compile $ do
eInput <- fromAddHandler addCommandEvent
eTick <- fromAddHandler tickHandler
let bGameState = accumB initialGS $ updateGS <$> eInput
eGameState <- changes bGameState
reactimate $ (\n -> (atomically $ writeTChan gsChannel n)) <$> eGameState
Problemem w realizacji tego czasomierza jest to, że wszystkie przykłady Mam spojrzał na sprawę mają wykorzystywać różne od moich, symulacji fizyki. W tej grze nie ma fizyki. Próbuję użyć timera, aby ocenić stan gry niezależnie od działań gracza. Na razie jedyną rzeczą, którą chcę zarządzać, są podróże nadprzestrzenne. Po całkowitym wdrożeniu przejście z jednej planety na drugą zmieni 's location
do Right Hyperspace
. To, co musi się teraz stać, to fakt, że gdy tick
się dzieje, distanceTraversed
zwiększa się o jeden. Następnie, jeśli distanceTraversed
jest równa totalDistance
Agent
, lokalizacja staje się Left Planet
.
Więc jaki byłby to wyglądać z punktu widzenia EventNetwork
?
let bHyperspace = accumB initialGS $ foo <$> eTick
teraz połączyć zachowań
let bBaz = (++) <$> bGameState <*> bHyperspace
Czy to właściwe tory?
Uświadomiłem sobie, że updateGS będzie stanowić problem, ale zapisywałem to pytanie na inny dzień. –