gpt4 book ai didi

racket - 更改 Racket 中大爆炸的按键轮询率/滴答率

转载 作者:行者123 更新时间:2023-12-02 09:37:34 24 4
gpt4 key购买 nike

假设我有一个这样的函数:

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

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

目前,当按住按键时,我的 Action 非常不稳定。我认为这是因为按 Racket 的默认滴答率调用了按键。我尝试将滴答速度增加到 0.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)))

在您的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)))))

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

关于racket - 更改 Racket 中大爆炸的按键轮询率/滴答率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54408974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com