AFRP的整个主题听起来非常令人兴奋,我正在尝试在其中开始自己的项目。我发现了Yampa和yampa-glut,这似乎是对GLUT的良好绑定(看起来,GLUT是在Windows和Linux上均可运行的唯一图形库)。
yampa-glut
来源带有一个简单的example,我已经复制了此书以进行研究。然后,我想扩展它,为关键事件添加一个简单的测试。它的完整来源是here,除了第23行和按键功能之外,没有什么新的东西:
keys = proc ev -> do
rec
e <- keyAction -< ev
let s = event Nothing (Just . show) e
res <- identity -< s
returnA -< res
预期的结果是,每当我按下或释放键时,外壳上就会输出一个简单的输出。但这不会发生,没有输出。
如果我将最后一行之前的行更改为此:
res <- delay 0.2 Nothing -< s
然后我得到了一些关键输入,但不是全部,很多都被跳过了。
我找不到对此的一些解释,所以我希望有人可以向我解释我哪里出了问题以及如何获得键盘和鼠标按钮输入。
经过一段时间后,我发现我一直在思考完全错误的方式。这是上面测试按钮“ ESC”按下的扩展:
simple :: Reaction
simple = proc ev -> do
r <- integral -< 50
displayAction <- arr (uncurry tag) <<< first redisplay -< (ev, actionIO . display $ r)
reshapedAction <- arr (fmap (actionIO . reshape)) <<< reshaped -< ev
returnA -< mconcat [reshapedAction, displayAction]
anim :: Reaction
anim = switch (simple &&& keyPressed) route
where
route (Left '\ESC') = arr (\_ -> Event actionExit)
route _ = simple
这似乎很好。 (将使用以上解决方案进行编辑)