私はトラベラーで、プレイヤーに依存しないゲーム状態の更新を処理しようとしているところです。参考までに、プロジェクトはこちらです(この質問に関連するブランチは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
このタイマーを実装する際の問題は、私が見たすべての例が私の物理シミュレーションとは異なるユースケースを持っていることです。このゲームには物理演算は含まれていません。タイマーを使用して、プレーヤーのアクションとは無関係にゲームの状態を評価しようとしています。今のところ、私が管理したいのはハイパースペース旅行だけです. 完全に実装されると、ある惑星から別の惑星に移動すると、 が に変わりAgent
ます。ここで必要なことは、aが発生したときに1 ずつインクリメントすることです。すると if equalsの位置は になります。location
Right Hyperspace
tick
distanceTraversed
distanceTraversed
totalDistance
Agent
Left Planet
EventNetwork
では、の視点からはどのように見えるでしょうか?
let bHyperspace = accumB initialGS $ foo <$> eTick
今すぐ行動を組み合わせる
let bBaz = (++) <$> bGameState <*> bHyperspace
これは正しい軌道ですか?