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

Pygame显示更新异常:碰撞后提示文本仅短暂显示

问题分析与解决方案

嘿,我帮你找到了问题所在!你的代码里有几个小细节导致在macOS上"You dead"文本只显示一帧就消失,咱们一步步来解决:

核心问题原因

  1. time.sleep(2)阻塞事件循环:Pygame的渲染和事件处理都依赖主线程的循环,time.sleep()会直接卡住整个程序。macOS的窗口管理机制对这种阻塞特别敏感,会导致文本刚显示就被后续的循环覆盖,甚至窗口出现无响应的假象。
  2. 递归调用gameLoop():每次触发崩溃就直接调用gameLoop(),会造成函数栈不断累积,不仅容易溢出,还会让旧的循环逻辑和新的循环逻辑冲突,导致画面被快速重置。
  3. 未处理积压事件:崩溃触发后,事件队列里的未处理事件会直接带到新的循环中,干扰游戏流程。

修复后的代码

import pygame

pygame.init()
display_width = 800
display_height = 600
black = (0, 0, 0)
white = (255, 255, 255)
red = (255, 0, 0)

gameDisplay = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption('lil spacey')
clock = pygame.time.Clock()

characterImage = pygame.transform.scale(pygame.image.load('Longcat.jpg'), (100, 100))
spriteWidth = characterImage.get_width()  # 直接调用对象方法,更简洁
spriteHeight = characterImage.get_height()

def spriteCharacter(x, y):
    gameDisplay.blit(characterImage, (x, y))

def text_objects(text, font):
    textSurface = font.render(text, True, black)
    return textSurface, textSurface.get_rect()

def messageDisplay(text):
    largeText = pygame.font.Font('freesansbold.ttf', 115)
    TextSurf, TextRect = text_objects(text, largeText)
    TextRect.center = ((display_width/2), (display_height/2))
    gameDisplay.blit(TextSurf, TextRect)

def gameLoop():
    x = (display_width * 0.45)
    y = (display_height * 0.8)
    x_change = 0
    y_change = 0
    game_state = "playing"  # 游戏状态:playing/crashed
    crash_time = 0  # 记录崩溃发生的时间

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            
            # 仅在游戏进行中处理按键事件
            if game_state == "playing":
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_LEFT:
                        x_change = -5
                    elif event.key == pygame.K_RIGHT:
                        x_change = 5
                    elif event.key == pygame.K_UP:
                        y_change = -5
                    elif event.key == pygame.K_DOWN:
                        y_change = 5
                if event.type == pygame.KEYUP:
                    if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                        x_change = 0
                    elif event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                        y_change = 0

        if game_state == "playing":
            x += x_change
            y += y_change
            gameDisplay.fill(white)
            spriteCharacter(x, y)

            # 检测边界碰撞
            if x > display_width - spriteWidth or x < 0 or y > display_height - spriteHeight or y < 0:
                game_state = "crashed"
                crash_time = pygame.time.get_ticks()  # 记录当前时间
        
        elif game_state == "crashed":
            gameDisplay.fill(white)
            messageDisplay('You dead')
            # 检查是否已过2秒
            if pygame.time.get_ticks() - crash_time >= 2000:
                # 重置游戏状态与变量
                x = (display_width * 0.45)
                y = (display_height * 0.8)
                x_change = 0
                y_change = 0
                game_state = "playing"

        pygame.display.update()
        clock.tick(60)

gameLoop()
pygame.quit()
quit()

关键修改说明

  • 状态管理:用game_state变量区分游戏进行中和崩溃后的状态,彻底避免递归调用的问题。
  • 替代time.sleep():用pygame.time.get_ticks()计算时间差,既实现了2秒延迟,又不会阻塞事件循环,窗口始终能响应系统操作。
  • 优化事件处理:仅在游戏进行中处理按键输入,避免崩溃状态下的无效操作干扰流程。
  • 简化图片尺寸获取:直接调用characterImage.get_width(),写法更简洁直观。

现在运行修改后的代码,碰撞边界后应该会稳定显示"You dead"2秒,然后自动重置游戏啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:58:28