4

我在 Haskell 中制作了一个场景图功能渲染引擎,我想知道如何在混合中添加交互。

起初,我以为我可以只拥有另一个 Handler 节点,它接收其他节点之一,然后对其应用一些 IORef。例如,如果我有

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

这种方法可能有效,但还有更好的方法。我特别喜欢使用名为TQueue.

TQueue事务队列的缩写;您可以将事件从渲染线程传递到其中,然后从绘图线程中读取它们。这样你就可以把它们当作一个简单的、纯粹的值来处理;事件列表。

一般来说,Haskell 倾向于对可变状态进行纯操作。可用的渲染框架强调将逻辑状态纯粹转换为屏幕上的内容。不过,在这种情况下,像State OSGmonad 这样的东西可能还可以。

于 2015-04-09T15:21:34.807 回答