4

Haskell でシーン グラフ関数レンダリング エンジンを作成しましたが、混合物に相互作用を追加する方法を考えています。

最初は、他のノードの 1 つを取り込み、そこにいくつかの IORef を適用する別の Handler ノードを持つことができると思っていました。たとえば、私が持っていた場合

x,y,z <- IORef 0
KeyboardHandler KeyboardCallBack $ Translate x y z $ Object

トラバースするとき、私は

KeyboardHandler keyboard drawable -> case drawable of 
Translate x y z _ -> do 
(Char 'q') -> x $~! (-1)
(Char 'w') -> x $~! (+1)
(Char 'a') -> y $~! (-1)
(Char 's') -> y $~! (+1)
(Char 'z') -> z $~! (-1)
(Char 'x') -> z $~! (+1)
render drawable

そのようなことをすることは可能ですか、それとも完全に間違った方向に進んでいますか?

4

1 に答える 1

1

このアプローチはうまくいくかもしれませんが、もっと良い方法があります。と呼ばれるものを利用したGLFW-b の例が特に気に入りTQueueました。

TQueueTransactional Queue の略です。これは、レンダリング スレッドからイベントを渡して、描画スレッドから読み取ることができるものです。そうすれば、単純で純粋な値であるかのように処理できます。イベントのリスト。

一般に、Haskell は可変状態よりも純粋な操作を優先します。利用可能なレンダリング フレームワークは、論理状態を画面上の要素に純粋に変換することを強調しています。この場合、State OSGモナドのようなものはおそらく問題ないでしょう。

于 2015-04-09T15:21:34.807 に答える