Python 平滑跳过不同的FPS

Python 平滑跳过不同的FPS,python,animation,pygame,game-physics,Python,Animation,Pygame,Game Physics,我已经创建了一个游戏,但是我无法控制玩家的跳跃。此代码是一个简化版本,仅显示跳转问题。请记住,在游戏本身中,FPS可能会在中间跳跃时发生变化。我已经分离了跳转代码,因此它更容易识别,并且通过向上/向下箭头,您可以更改FPS以进行测试 问题 FPS越高,跳跃越小,FPS越低,跳跃越高 预期结果 跳跃在许多不同的FPS上达到相同的高度。示例:30和120 FPS 代码 import pygame Screen = pygame.display.set_mode((250,300)) Clock =

我已经创建了一个游戏,但是我无法控制玩家的跳跃。此代码是一个简化版本,仅显示跳转问题。请记住,在游戏本身中,FPS可能会在中间跳跃时发生变化。我已经分离了跳转代码,因此它更容易识别,并且通过向上/向下箭头,您可以更改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)
导入pygame
Screen=pygame.display.set_模式((250300))
Clock=pygame.time.Clock()
X=50;Y=250
FPS=60;当前_FPS=FPS
移动=480/当前每秒;Dir=“向上”
尽管如此:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
pygame.quit()
退出()
如果pygame.key.get_按下()[pygame.K_UP]:FPS+=10/当前_FPS
elif pygame.key.get_pressed()[pygame.K_DOWN]和FPS>2:FPS-=10/当前_FPS
pygame.display.set_标题(“FPS:+str(int(FPS)))
屏幕填充((255255))
X+=120/当前每秒
#----------------跳转码---------------------#
如果Dir==“向上”:
如果移动=250:
Dir=“向上”
X=50;Y=250
移动=480/当前每秒;Dir=“向上”
#重置/\
其他:
移动+=120/当前每秒
Y+=移动
#--------------------------------------------------#
pygame.draw.circle(屏幕,(0,0,0),(整数(X),整数(Y)),5)
pygame.display.update()
当前\u FPS=1000.0/时钟。勾选忙循环(FPS)

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

Move = 480
请注意,当您更新速度(或者在您的情况下,它看起来是速度)时,确实需要除以帧速率,因为您实际上是在乘以时间间隔:
v~u+a*dt
。更新位置时同样适用,因此这应该是
Y+=Move/Current\u FPS


还有几件事值得一提。为什么跟踪方向变量?为什么不让你的变量
Move
成为速度呢。这样,您只需要:
Y+=Move/Current\u FPS
,并用正值/负值指示方向。此外,你的重力在下降时比上升时强得多,但这完全是故意的

Move=480/当前每秒-这是你设定的跳跃速度,对吗?为什么这是FPS的功能?谢谢@MichaelRCURTIS!我的大脑不能再思考了。这是我做的第一个游戏,也是我用Python做的第一个大项目,但这却毁了它。对第一条评论的回应:我在尝试,我不知道如何让它工作。没问题!这是一次永无止境的学习经历,大约十年前我在Flash中做过类似的事情,所以我记得当时的情景。