7

私はトラベラーで、プレイヤーに依存しないゲーム状態の更新を処理しようとしているところです。参考までに、プロジェクトはこちらです(この質問に関連するブランチはdevelブランチです)。

Libraries/Universe/GameState.hsupdateGSゲームの状態に対するすべてのプレーヤーの更新を処理する関数があります。今の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の位置は になります。locationRight HyperspacetickdistanceTraverseddistanceTraversedtotalDistance AgentLeft Planet

EventNetworkでは、の視点からはどのように見えるでしょうか?

let bHyperspace = accumB initialGS $ foo <$> eTick

今すぐ行動を組み合わせる

let bBaz = (++) <$> bGameState <*> bHyperspace

これは正しい軌道ですか?

4

1 に答える 1

2

質問はやや曖昧で答えにくいですが、最善を尽くします。

GameStateまず、あなたのコードを見ると、実際のゲームプレイ ロジックをモノリシック型とupdateGS関数に「アウトソーシング」しているのが奇妙だと思います。これは悪いことではなく、FRP をこのスタイルで使用するメリットがないということです。関数を完全に削除して、代わりにmakeNetworkDescription手動で偶数サンドラーを登録することができaddCommandEventます。

FRP の利点は、ゲームの状態を動作とイベントのネットワークとしてモデル化できることです。状態が十分にモジュール化されている場合、これによりコードが大幅に簡素化されます。


第二に、ハイパースペース旅行のモデル化に関するあなたの質問について。

これを行う1つの方法は次のとおりです。

-- indicates whether hyperspace travel is currently happening
bTravelling :: Behavior t Bool

-- increment travel distance, but only when travelling
bTravelDistance :: Behavior t Distance
bTravelDistance = accumB 0 $ (+1) <$> whenE bTravelling eTick

-- calculate player location from travel distance
bPlayerLocation :: Behavior t Location
bPlayerLocation =
    (\distance -> if distance > total then Left Planet else Right HyperSpace)
    <$> bTravelDistance

ただし、ゲーム内でこのプロセスを数回繰り返したいと思うかもしれません。残念ながら、reactive-banana は現在、「最初にこれを行い、次にあれを行う」ような抽象化を提供していません。動的なイベント切り替えがありますが、少し扱いに​​くいかもしれません。

于 2013-05-18T08:33:46.840 に答える