【发布时间】:2019-03-23 02:59:00
【问题描述】:
我想在 Haskell Gloss 中每按下一个键的帧移动一个对象,而不仅仅是开始按下键的那一帧。 (示例:按下“w”键时,每帧加速对象)
编辑:我尝试使用 EventKey 的第二个参数但无济于事。
我的代码:
--TODO - Holding keys doesn't work yet
handleKeys :: Event -> AsteroidsGame -> AsteroidsGame
handleKeys (EventKey (Char char) _ _ _) game
| char == 'w' = move 0 1
| char == 'a' = move (-1) 0
| char == 's' = move 0 (-1)
| char == 'd' = move 1 0
where move x y = game {player = accelerateObject (player game) x y}
handleKeys _ game = game
accelerateObject :: Object -> Float -> Float -> Object
accelerateObject obj hor ver = obj {vel = (vx + hor, vy + ver)}
where (vx, vy) = vel obj
【问题讨论】:
-
只跟踪 AsteroidGame 中的按键?我想 EventKey 会告诉你键是被按下还是被释放。
-
正如@Krom 所说,检查
Down事件和Up事件。根据您的环境,您应该会看到重复的Down事件,直到密钥被释放,这应该显示为Up事件。 -
@BobDalgleish 我认为 Down 事件仅在按下键时触发,而不是在已经按下时一次又一次地触发。所以它不起作用。我不知道如何确认没有更多事件,即我不知道如何在 Haskell 的其他代码中间打印一些调试信息
-
您可以使用
Debug.Trace包插入trace语句。通常,事件系统应在键开始自动重复时发出事件。例如,任何文本编辑器都会在您按住字符键时记录每个字符。检查文档以查看是否有某些内容没有过滤自动重复字符。 -
@BobDalgleish 我现在可以确认按下按钮时只有一个事件,按下按钮时没有更多事件,所以我仍然没有解决方案。