代码之家  ›  专栏  ›  技术社区  ›  Ryan Schaefer

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

  •  3
  • Ryan Schaefer  · 技术社区  · 7 年前

    假设我有这样一个函数:

    (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]))
    

    然后是一个画点的函数(但最终与问题无关)

    如何具体更改键盘上的按键轮询速率,以实现更平稳的移动?

    1 回复  |  直到 7 年前
        1
  •  6
  •   Alexis King    7 年前

    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)))
    

    按键 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)))))
    

    您可以在中使用该信息 以可靠的速率更新玩家位置,而不是依赖操作系统配置的键重复速率的不确定性行为。