作为实验,我设置了一组模拟齿轮连接到电机并使用 OpenGL/GLUT 渲染它们。目前,Wire 网络的唯一输入是Time
. 我想用键盘来控制改变电机的速度。我还想将物理时间步从帧速率中分离出来,如修复你的时间步中所述!.
这意味着我需要使用三种不同类型的输入从三个不同的 GLUT 回调(、、和)keyboardMouseCallback
运行idleCallback
Wire网络。displayCallback
我不清楚如何将 Netwire 与 GLUT 回调集成。
作为实验,我设置了一组模拟齿轮连接到电机并使用 OpenGL/GLUT 渲染它们。目前,Wire 网络的唯一输入是Time
. 我想用键盘来控制改变电机的速度。我还想将物理时间步从帧速率中分离出来,如修复你的时间步中所述!.
这意味着我需要使用三种不同类型的输入从三个不同的 GLUT 回调(、、和)keyboardMouseCallback
运行idleCallback
Wire网络。displayCallback
我不清楚如何将 Netwire 与 GLUT 回调集成。
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)
你有没有考虑过……不这样做?
没有法律规定您必须使用(免费)GLUT。GLFW(几乎)同样有能力,它允许您根据需要控制渲染循环。它是一个基于轮询的 API,所以任何回调只会在你想要的时候发生。