平滑跳过不同的 FPS

Smooth Jump over different FPS

我创建了一个游戏,但我无法控制玩家的跳跃。此代码是简化版本,仅显示跳转问题。请记住,在游戏本身中,FPS 可能会在中跳时发生变化。我已经分离了跳转代码,这样更容易识别,并且您还可以使用 UP/DOWN 箭头更改 FPS 以进行测试。

问题

FPS越高跳跃越小,FPS越低跳跃越高

预期结果

跳跃在许多不同的 FPS 下达到相同的高度。示例:30 和 120 FPS

代码

import pygame
Screen = pygame.display.set_mode((250,300))
Clock = pygame.time.Clock()
X = 50; Y = 250
FPS = 60; Current_FPS = FPS
Move = 480 / Current_FPS; Dir = "Up"

while True:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()

    if pygame.key.get_pressed()[pygame.K_UP]: FPS += 10 / Current_FPS
    elif pygame.key.get_pressed()[pygame.K_DOWN] and FPS > 2: FPS -= 10 / Current_FPS
    pygame.display.set_caption("FPS: "+str(int(FPS)))

    Screen.fill((255,255,255))

    X += 120 / Current_FPS

    #---------------- JUMP CODE ---------------------#

    if Dir == "Up":
        if Move <= 0.0: Dir = "Down"
        else:
            Move -= 10 / Current_FPS
            Y -= Move
    else:

        #RESET \/
        if Y >= 250:
            Dir = "Up"
            X = 50; Y = 250
            Move = 480 / Current_FPS; Dir = "Up"
        #RESET /\

        else:
            Move += 120 / Current_FPS
            Y += Move

    #--------------------------------------------------#

    pygame.draw.circle(Screen,(0,0,0),(int(X),int(Y)),5)
    pygame.display.update()
    Current_FPS = 1000.0 / Clock.tick_busy_loop(FPS)

您应该将初始跳跃速度设置为独立于帧速率,即:

Move = 480

请注意,当您更新速度(或者在您的情况下,看起来是速度)时,您确实需要除以帧速率,因为您实际上是乘以时间间隔:v ~ u + a*dt。更新位置时也是如此,所以应该是 Y += Move / Current_FPS.

还有几件事值得一提。为什么要跟踪方向变量?为什么不让你的变量 Move 成为速度。这样你只需要: Y += Move / Current_FPS 并且 positive/negative 值指示方向。此外,您目前在下降过程中的重力比在上升过程中要强得多,但这可能完全是故意的!