我在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
有可能做那样的事情吗?还是我走错了路?
这种方法可能有效,但也有更好的方法。我特别喜欢使用TQueue
的GLFW-b示例。
TQueue
是Transactional Queue的缩写;它是您可以从渲染线程将事件传递到中,然后从绘图线程读取它们的东西。这样你就可以把它们当作一个简单、纯粹的价值来处理;事件列表。
一般来说,Haskell倾向于纯操作而不是可变状态。可用的渲染框架强调将逻辑状态转换为屏幕上的内容。在这种情况下,像State OSG
monad这样的东西可能还可以。