Я нахожусь в своем Traveler, я пытаюсь обрабатывать независимые от игрока обновления состояния игры. Для справки: проект находится здесь (для этого вопроса подходит ветка devel).
Libraries/Universe/GameState.hs
имеет функцию updateGS
, которая обрабатывает все обновления игрока для состояния игры. 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
Проблема с реализацией этого таймера заключается в том, что все примеры, которые я рассмотрел, имеют вариант использования, отличный от моего, симуляции физики. В этой игре нет никакой физики. Я пытаюсь использовать таймер, чтобы состояние игры оценивалось независимо от действий игрока. На данный момент, единственное, чем я хочу управлять, это путешествия в гиперпространстве. После полной реализации перемещение с одной планеты на другую изменит location
Agent
на Right Hyperspace
. Что должно произойти сейчас, так это то, что когда происходит tick
, distanceTraversed
увеличивается на единицу. Затем, если distanceTraversed
равно totalDistance
, местоположение Agent
становится Left Planet
.
Так как бы это выглядело с точки зрения EventNetwork
?
let bHyperspace = accumB initialGS $ foo <$> eTick
Теперь, чтобы объединить поведение
let bBaz = (++) <$> bGameState <*> bHyperspace
Это правильный трек?