平滑跳过不同的 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 值指示方向。此外,您目前在下降过程中的重力比在上升过程中要强得多,但这可能完全是故意的!
我创建了一个游戏,但我无法控制玩家的跳跃。此代码是简化版本,仅显示跳转问题。请记住,在游戏本身中,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 值指示方向。此外,您目前在下降过程中的重力比在上升过程中要强得多,但这可能完全是故意的!