作为实验,我设置了一组连接到电机上的模拟齿轮,并使用OpenGL/GLUT渲染它们。目前,有线网络的唯一输入是Time。我想用键盘来控制电机的变速。我还想将物理时间步长从Fix your Timestep!中描述的帧速率中分离出来。
这意味着我需要使用三种不同类型的输入从三个不同的GLUT回调函数(keyboardMouseCallback、idleCallback和displayCallback)运行Wire网络。我不清楚如何将Netwire与GLUT回调集成在一起。
发布于 2012-11-17 12:01:03
GLUT对需要控制主循环的框架有点敌意,比如Netwire。这是可能的,但您可能必须使用IORef或类似的东西。据我所知,对Netwire最友好的OpenGL管理器是SDL,当然您也可以尝试一下Nicol的GLFW建议。否则,您将不得不单步执行多个事件处理程序。
为了处理实际的键盘输入,我建议您将事件信息添加到您正在使用的任何底层monad中(阅读器monad可能是最好的解决方案)。然后,实现一个keyDown连接,每当按住给定的键时都会生成:
keyDown :: (Monoid e) => Key -> Wire e (Reader GuiState) a a现在你可以做一些像这样简单的事情:
position = integral_ 0 . speed
where
direction key dir = dir . keyDown key <|> 0
speed = direction Right 1 + direction Left (-1)发布于 2012-11-17 10:01:17
你有没有想过...不这样做吗?
没有法律规定你必须使用(免费的)供过于求。GLFW (几乎)一样有能力,它允许你随心所欲地控制渲染循环。它是一个基于轮询的API,所以任何回调都只会在你想要的时候发生。
https://stackoverflow.com/questions/13426888
复制相似问题