You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Pygame中跳转功能的延迟异常问题?

Pygame跑酷游戏跳跃延迟问题解析

问题情况

开发基础跑酷游戏时,为控制角色跳跃后不下落添加了延迟,但跳跃效果要等延迟结束才会显示——哪怕先调用了update_screen()也没用。

初始代码:

import pygame

screen = pygame.display.set_mode((600, 550))
run = True

positionx = 100
positiony = 300

def update_screen():
  screen.fill((0, 100, 255)) #backgorund
  player = pygame.draw.rect(screen, (255, 255, 255), (positionx, positiony, 50, 80))
  ground = pygame.draw.rect(screen, (0, 255, 0), (0, 380, 600, 550))

def jump():
  global positiony
  positiony = positiony - 60
  update_screen()
  
  pygame.time.delay(1000)
  
  positiony = positiony + 60
  update_screen()

while run:
  update_screen(0)

  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      pygame.quit
      
    if event.type == pygame.KEYDOWN and event.key == 32:
      jump()

  pygame.display.update()

修改后的jump()函数:

def jump():
  global positiony
  positiony = positiony - 60
  update_screen()
  
  pygame.time.delay(1000)
  
  positiony = positiony - 60
  update_screen()

原因分析

这不是程序故障,是对Pygame渲染机制和线程阻塞的理解偏差:

  • pygame.time.delay()会完全阻塞主线程,延迟期间程序停止所有操作,包括屏幕刷新。
  • update_screen()只是把图形绘制到内存中的Surface,并没有直接显示到屏幕;真正的屏幕刷新靠pygame.display.update()。但延迟阻塞了主线程,主循环里的pygame.display.update()根本没机会执行,直到延迟结束后,所有绘制才会被一次性刷新出来。

解决方案

别用pygame.time.delay()控制跳跃时序,改用帧驱动的方式,用状态变量跟踪跳跃阶段,在主循环里逐步处理位置变化:

import pygame

screen = pygame.display.set_mode((600, 550))
clock = pygame.time.Clock()
run = True

positionx = 100
positiony = 300
is_jumping = False
jump_step = 0
max_jump_steps = 20  # 控制跳跃高度和时长

def update_screen():
    screen.fill((0, 100, 255))  # background
    pygame.draw.rect(screen, (255, 255, 255), (positionx, positiony, 50, 80))
    pygame.draw.rect(screen, (0, 255, 0), (0, 380, 600, 550))

while run:
    clock.tick(60)  # 固定60帧/秒,保证跨设备速度一致
    update_screen()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        # 只有不在跳跃状态时才能触发新跳跃
        if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE and not is_jumping:
            is_jumping = True

    # 主循环内处理跳跃逻辑
    if is_jumping:
        if jump_step < max_jump_steps // 2:
            # 上升阶段:逐帧上移
            positiony -= 3
        elif jump_step < max_jump_steps:
            # 下落阶段:逐帧下移
            positiony += 3
        else:
            # 重置跳跃状态
            is_jumping = False
            jump_step = 0
        jump_step += 1

    pygame.display.update()

pygame.quit()
  • 用clock.tick(60)固定帧率,避免不同设备上跳跃速度不一致。
  • 通过is_jumping和jump_step跟踪跳跃的上升、下落阶段,每帧微调角色位置,不会阻塞主线程。
  • 这样跳跃过程会平滑显示,不会出现延迟后才刷新的问题。

内容的提问来源于stack exchange,提问作者Vladyslav Yeromin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:47:27