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

Pygame窗口显示黑屏,背景无法更新问题求助

Pygame窗口无法更新背景的问题修复

以下是导致背景无法显示的核心问题及修复方案:

问题点

  • 变量名不匹配:Game类初始化中定义的背景色变量是self.color,但draw_objects()方法里误用了未定义的self.white_color,导致白色背景填充失败。
  • GameObject属性名错误:GameObject类中将加载的图片存储在self.background属性中,但main.py里调用了不存在的self.background.image,属性名不对应。
  • 游戏循环逻辑错误:draw_objects()和clock.tick(60)写在了while循环外部,循环运行时完全不会执行绘制和帧率控制,窗口内容根本不会更新。
  • 事件处理逻辑问题:在事件循环内直接调用pygame.quit(),会导致循环未正常结束就提前退出,引发异常。

修正后的代码

gameObject.py

import pygame 

class GameObject:
    def __init__(self, x, y, width, height, image_path):
        # 统一属性名为image,避免与类功能混淆
        self.image = pygame.image.load(image_path)
        self.image = pygame.transform.scale(self.image, (width, height))

        self.x = x
        self.y = y
        self.width = width
        self.height = height

main.py

import pygame
from gameObject import GameObject

pygame.init()

class Player(GameObject):
    def __init__(self, x, y, width, height, image_path, speed):
        super().__init__(x, y, width, height, image_path)
        self.speed = speed 

    def move(self, direction, max_height):
        if (self.y >= max_height - self.height and direction > 0) or (self.y <= 0 and direction < 0):
            return
        self.y += (direction * self.speed)

class Game:
    def __init__(self):
        self.width = 800
        self.height = 800
        # 统一变量名,确保后续调用一致
        self.white_color = (255, 255, 255)

        self.game_window = pygame.display.set_mode((self.width, self.height))
        self.clock = pygame.time.Clock()

        self.background = GameObject(0, 0, self.width, self.height, 'assets/background.png')
        self.player1 = Player(375, 700, 50, 50, 'assets/player.png', 10) 
        self.level = 1.0

    def draw_objects(self):
        # 使用正确的背景色变量
        self.game_window.fill(self.white_color) 
        # 调用GameObject中正确的image属性
        self.game_window.blit(self.background.image, (self.background.x, self.background.y))
        # 新增绘制玩家的代码(可选,确保玩家也能显示)
        self.game_window.blit(self.player1.image, (self.player1.x, self.player1.y))
        pygame.display.update()
    
    def run_game_loop(self):
        gameRunning = True
        while gameRunning:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    gameRunning = False
            # 将绘制和帧率控制移入循环内部,确保每帧都更新
            self.draw_objects()
            self.clock.tick(60)
        # 循环正常结束后再退出pygame
        pygame.quit()

game = Game()
game.run_game_loop()
quit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 06:01:37