Racket 更改球拍中“大爆炸”键的轮询率/滴答率

Racket 更改球拍中“大爆炸”键的轮询率/滴答率,racket,Racket,假设我有这样一个函数: (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")

假设我有这样一个函数:

(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]))
(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)))
然后是一个画点的函数(但最终与问题无关)

现在,我的动作在按下键的时候很不平稳。我想这是因为on键是以默认的拍子滴答声频率被调用的。我试着把滴答声的速度提高到0.01来缓和这一点,但没什么不同

如何具体更改on键轮询键盘以使其移动更平稳的速率?

big bang
不会“轮询键盘”,这就是问题所在。相反,只要操作系统传递按键事件,它就会调用键上的
处理程序。当您按住键盘上的某个键时,操作系统将根据您在计算机上配置的按键重复的速率发送许多按键事件,但除了允许用户键入文本之外,您不希望依赖这些事件

不要依赖操作系统的按键重复速度(在不同的计算机之间,甚至在同一台计算机的用户之间,重复速度可能会有很大的差异),而是跟踪当前按下的按键,并使用该信息更新玩家角色在勾号处理程序中的位置,该处理程序在可靠的时钟上执行。例如,定义如下所示的世界状态:

(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]))
(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)))
在键上的
处理程序中,更新世界状态以将
世界状态键的相关部分更改为
#t
,并在释放键时添加相应的
处理程序以在释放键时将标志更改回
#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)))))
您可以使用勾号上的
中的信息以可靠的速率更新播放机的位置,而不是依赖操作系统配置的按键重复速率的不确定性行为