問題タブ [reactive-banana]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - Functional Banana Traveler - タイマーとプレイヤーに依存しないイベント
私はトラベラーで、プレイヤーに依存しないゲーム状態の更新を処理しようとしているところです。参考までに、プロジェクトはこちらです(この質問に関連するブランチはdevelブランチです)。
Libraries/Universe/GameState.hs
updateGS
ゲームの状態に対するすべてのプレーヤーの更新を処理する関数があります。今のEventNetwork
姿はこんな感じ。
このタイマーを実装する際の問題は、私が見たすべての例が私の物理シミュレーションとは異なるユースケースを持っていることです。このゲームには物理演算は含まれていません。タイマーを使用して、プレーヤーのアクションとは無関係にゲームの状態を評価しようとしています。今のところ、私が管理したいのはハイパースペース旅行だけです. 完全に実装されると、ある惑星から別の惑星に移動すると、 が に変わりAgent
ます。ここで必要なことは、aが発生したときに1 ずつインクリメントすることです。すると if equalsの位置は になります。location
Right Hyperspace
tick
distanceTraversed
distanceTraversed
totalDistance
Agent
Left Planet
EventNetwork
では、の視点からはどのように見えるでしょうか?
今すぐ行動を組み合わせる
これは正しい軌道ですか?
haskell - Functional Banana Traveler - 壊れたタイプのミステリー
次のエラーが表示されます。
のt0
とEvent
のt1
がBehavior
問題の手がかりですが、この手がかりをどのように解釈すればよいかわかりません。それでは、いくつかのタイプ、誤ったコード、およびそれが機能する理由についての私の推論から始めましょう。
initialAMap :: AgentMap
updateAgentMap :: HyperMap -> PlanetMap -> AgentMap -> AgentMap
bHyperMap :: Behavior t HyperMap
bPlanetMap :: Behavior t PlanetMap
accumB :: a -> Event t (a -> a) -> Behavior t a
これで、最初のパラメーターAgentMap
. 2 つ目は である必要がありますEvent t (AgentMap -> AgentMap)
。そこに着く方法?から始めるとupdateAgentMap <$> bHyperMap
、タイプは になりますBehavior t (PlanetMap -> AgentMap -> AgentMap)
。さて、もう 1 つのパラメータupdateAgentMap <$> bHyperMap <*> bPlanetMap
で type を指定しますBehavior t (AgentMap -> AgentMap)
。もうすぐですよね?
これを考える
(<@) :: f a -> g b -> g a
と、
eTick :: Event t ()
Iの代わりa
に(AgentMap -> AgentMap)
これを行うことができるはずです
(updateAgentMap <$> bHyperMap <*> bPlanetMap)
<@ eTick
取得するためEvent t (AgentMap -> AgentMap)
しかし、それほど速くはありません。私の推論はどこかで失敗しているに違いありません。誰か教えてくれませんか?
更新: eTick が定義されていなかったために、この問題が発生したことが判明しました (と思います)。コードの多くを独自のファイルに分離しようとしました。eTick を離れるundefined
ことは満足のいくものではないことはわかっていましたが、これについて何をしたいのかまだ考えていません。そのため、その間、コードを元のようにletバインディングに移動し始めました。これでコードがコンパイルされます。let
バインディングがそこに長く留まることを望みません。私の期待は、ブレークアウトプロジェクトを再訪することで、コードをより適切に構造化する方法が示されることです。
haskell - 反応バナナでビヘイビアに他のビヘイビアを含める方法
みんなリアクティブバナナFRPフレームワークでコンピューターゲームをやっているみたいなので、私もやってみました。ただし、ゲーム データをリアクティブ バナナ型として記述しようとして、初期段階に行き詰まっていBehavior
ます。
基本的に、私はゲーム キャラクター (フロドやサムなど) の (変化する) リストを作成しようとしています。ゲーム キャラクターは、ゲーム ティック (ティック イベントとしてモデル化) ごとに更新される場合があります。ゲーム キャラクターが変更されるたびにシングルEvent (Character)
がトリガーされ、最終的にキャラクターの更新がネットワーク経由で送信されるという考え方です。Asteroids.hsの例と比較した場合の利点は、ゲーム ステート全体 (ゲーム キャラクターの全リスト) をネットワーク経由で送信する必要がないことです。これは、単一のゲーム キャラクターを持つ多数のイベントが発生するためです。ゲーム キャラクター リストを含む単一のイベントの代わりに。
1 つのゲーム キャラクターの場合、これで問題なく動作します。Behavior (Character)
withを作成してmapaccum
、キャラクターが更新されたときにキャラクター更新シグナルが送信されるようにしました。Behavior
私が解決できない問題は、これをゲーム キャラクターのリストで機能させる方法です。
Behavior
ゲーム中にキャラクターが出入りする可能性があるため、ゲームキャラクターリストを としてモデル化しようとしています。ここで動的イベント切り替えを使用する必要がありますか? またはBehavior
、個々のゲーム キャラクターを使用しない場合 (Behavior
ゲーム キャラクター リストのみを使用する場合)、キャラクター リストを調べているときに条件付きで更新イベントをトリガーする方法はありますか? それとも、ここで何かを理解していませんか?
haskell - Functional Banana Traveler - 入力 処理 : これは私が望むことをしますか?
ゲームの入力を管理したい方法は、TChan をポーリングし、eTick が発生したときにイベントを作成することです。しかし、私が試している方法は機能しますか?
data UAC = UAC (AID,PlayerCommand) deriving Show
fromPoll
「入力、現在の時刻などの可変データを頻繁にポーリングして動作を取得します。結果の動作は、イベント ネットワークが入力イベントを処理するたびに更新されます。」のドキュメントから。
私はこれを正しく理解していますか?TChannel は他のコードから取り込まれており、それeTick
を空にして別のコードを取得するたびにEvent t [UAC]
?
私の理解が間違っているか、この計算は fromPoll には高すぎるのかもしれません。その場合、どの方向に進むのがより良いですか?
haskell - Functional Banana Traveler - tick イベントの何が問題になっていますか?
私は tick イベントを実装しようとしていますが、それが機能しないことを示す小さなテストを以下に示します。なぜそれが機能しないのかについての洞察をいただければ幸いです。
ここにいくつかのテストデータがあります。
上記を実行すると、Main
この出力が得られます。
ファイルCommands.txt
が存在することはありません。この問題は、ティックイベントの不良に起因すると考えています。
thisからタイマーの実装についてのアイデアを得ましたが、これについて間違った方法で考えているのだろうか。何か案は?
fromPoll
編集:正しいことをしているという保証が欲しかった. 上記のテストを追加しました。
haskell - 再帰的に自分自身に依存するリアクティブ バナナ動作を実装する方法は?
イベントの発生と動作の現在の値に基づいて値を変更したい動作があります。以下の例では、ブール値の動作が True であるか False であるかに基づいて更新される 2 つのカウンターがあります。このコードは<<loop>>
例外でクラッシュしますが、再構築して機能させる方法や、この問題に対処する方法がわかりません。
haskell - リアクティブバナナで重複イベントをフィルタリングする
私が持っているとしましょう
最初のコンポーネントを取得できます。
ただし、このイベントは、最初のコンポーネントが変更されていない場合でも発生します。コストのかかる再計算がトリガーされるため、これは避けたいと思います。
A
のインスタンスでEq
あるため、最初のコンポーネントが最後の値と比較して変更されていない連続したイベントを削除できるようにしたいと考えています。
理想的には、関数が欲しい
Moment
モナドに頼らずにそれを行うでしょう。出来ますか?または、これを行うための最良の方法は何ですか?