Sono al punto nel mio Traveler Sto cercando di gestire gli aggiornamenti indipendenti dal giocatore allo stato del gioco. Per riferimento, il progetto è here (il ramo di sviluppo è quello pertinente per questa domanda).Functional Banana Traveler - Eventi indipendenti dal timer e dal giocatore
Libraries/Universe/GameState.hs
ha una funzione, updateGS
che gestisce tutti gli aggiornamenti dei giocatori allo stato del gioco. Il EventNetwork
sembra proprio ora.
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
Il problema nell'attuazione della presente timer è che tutti gli esempi che ho guardato hanno un caso d'uso diversa dalla mia, la simulazione fisica. Non c'è fisica coinvolta in questo gioco. Sto cercando di utilizzare un timer per valutare lo stato del gioco indipendentemente dalle azioni del giocatore. Per ora, l'unica cosa che voglio gestire è viaggiare nell'iperspazio. Una volta implementato completamente, lo spostamento da un pianeta all'altro modificherà lo location
a Right Hyperspace
. Ciò che deve accadere ora, è che quando si verifica un tick
, incrementi di distanceTraversed
di uno. Quindi se distanceTraversed
corrisponde alla posizione totalDistance
Agent
diventa Left Planet
.
Quindi che aspetto avrebbe questo dal punto di vista di EventNetwork
?
let bHyperspace = accumB initialGS $ foo <$> eTick
ora di combinare comportamenti
let bBaz = (++) <$> bGameState <*> bHyperspace
E 'questa la strada giusta?
Mi ero reso conto che l'updateGS sarebbe stato un problema, ma stavo salvando quella domanda per un altro giorno. –