说我有这样的功能:
(define (key-handler dot-position key)
(cond
[(string=? key "right") (make-posn (modulo (+ 10 (posn-x dot-position)) (image-width PLAY-FIELD))
(posn-y dot-position))]
[(string=? key "left") (make-posn (modulo (- (posn-x dot-position) 10) (image-width PLAY-FIELD))
(posn-y dot-position))]
[(string=? key "up") (make-posn (posn-x dot-position)
(modulo (- (posn-y dot-position) 10) (image-height PLAY-FIELD)))]
[(string=? key "down")
(make-posn (posn-x dot-position)
(modulo (+ (posn-y dot-position) 10) (image-height PLAY-FIELD)))]
[else dot-position]))
Run Code Online (Sandbox Code Playgroud)
然后是一个绘制点的函数(但最终与问题无关.)
目前,当按下按键时,我的动作非常不稳定.我假设这是因为on-key是在默认的球拍滴答声中调用的.我尝试将打勾速度增加到.01以平滑这个,但它并没有什么区别.
如何具体更改按键轮询键盘以使其更平滑移动的速率?
big-bang 没有 "轮询键盘",这是问题所在.相反,它会on-key在操作系统发送按键事件时调用您的处理程序.当您按住键盘上的键时,操作系统将根据您在计算机上配置键重复的速率发送许多按键事件,但除了允许之外,这不是您想要依赖的任何内容用户输入文本.
而不是依赖于操作系统的密钥重复速度(可能在计算机之间,甚至在同一台计算机的用户之间变化很大),跟踪当前按下的键,并使用该信息更新玩家角色在on-tick处理程序中的位置,在可靠的时钟上执行.例如,定义一个这样的世界状态:
(struct world-state (player-posn keys))
(struct keys-state (up right down left))
(define initial-world (world-state initial-player-posn (keys-state #f #f #f #f)))
Run Code Online (Sandbox Code Playgroud)
在你的on-key处理程序,更新世态变化的相关部分world-state-keys对#t,并添加相应的on-release处理程序来改旗回#f按键被释放时.然后你可以根据按下的一组键计算玩家的当前速度:
(struct velocity (x y))
(define (key-state->magnitude v)
(if v 1 0))
(define (keys-state->velocity s)
(velocity (- (key-state->magnitude (keys-state-right s))
(key-state->magnitude (keys-state-left s)))
(- (key-state->magnitude (keys-state-up s))
(key-state->magnitude (keys-state-down s)))))
Run Code Online (Sandbox Code Playgroud)
您可以使用该信息on-tick以可靠的速率更新播放器的位置,而不是依赖于操作系统配置的密钥重复率的非确定性行为.