Ich bin an dem Punkt in meinem Traveller Ich versuche Player-unabhängige Updates zum Spielstatus zu verarbeiten. Als Referenz ist das Projekt here (der Entwicklungszweig ist der relevante für diese Frage).Functional Banana Traveller - Timer und playerunabhängige Events
Libraries/Universe/GameState.hs
hat eine Funktion, updateGS
, die alle Player-Updates auf den Spielstatus behandelt. Die EventNetwork
sieht jetzt so aus.
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
Das Problem mit diesen Timer bei der Implementierung ist, dass alle Beispiele, die ich auf einen Anwendungsfall anders haben ausgesehen haben von mir, Physik-Simulation. Es gibt keine Physik in diesem Spiel. Ich versuche, einen Timer zu verwenden, um den Spielstatus unabhängig von Spieleraktionen zu bewerten. Fürs Erste, das einzige, was ich verwalten möchte, ist Hyperraum-Reisen. Wenn es vollständig implementiert ist, ändert sich der Wechsel von einem Planeten zum anderen von Agent
zu location
zu Right Hyperspace
. Was jetzt passieren muss ist, dass wenn tick
passiert, distanceTraversed
um eins erhöht wird. Wenn distanceTraversed
gleich totalDistance
Agent
ist, wird der Standort Left Planet
.
Also was würde das aus der Sicht EventNetwork
aussehen?
let bHyperspace = accumB initialGS $ foo <$> eTick
jetzt Verhaltensweisen zu kombinieren
let bBaz = (++) <$> bGameState <*> bHyperspace
Ist das der richtige Weg?
Ich hatte gemerkt, dass updateGS ein Problem sein würde, aber ich rettete diese Frage für einen anderen Tag. –