我在我的 Traveler 中尝试处理与玩家无关的游戏状态更新。作为参考,项目在这里(开发分支是这个问题的相关分支)。
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
实现这个计时器的问题是,我看过的所有示例都有一个与我不同的用例,即物理模拟。这个游戏不涉及物理。我正在尝试使用计时器来评估游戏状态,而不受玩家操作的影响。目前,我唯一想要管理的就是超空间旅行。完全实施后,从一个行星移动到另一个行星会将Agent
's更改location
为Right Hyperspace
。现在需要发生的是,当 atick
发生时,distanceTraversed
加一。那么如果distanceTraversed
equalstotalDistance
Agent
的位置就变成了Left Planet
。
EventNetwork
那么从的角度来看,这会是什么样子呢?
let bHyperspace = accumB initialGS $ foo <$> eTick
现在结合行为
let bBaz = (++) <$> bGameState <*> bHyperspace
这是正确的轨道吗?