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

Pygame中Surface仅关闭时显示且角色无法移动问题求助

问题修复方案

你的代码核心问题是多主循环+绘制逻辑位置错误,再加上初始化顺序、变量命名等小问题,导致Surface无法和角色同时显示。以下是具体问题分析和修复后的代码:

关键问题点

  • 初始化顺序错误:pygame.init()必须放在所有Pygame操作最前面,你先创建窗口再初始化,会导致资源加载异常。
  • 双主循环冲突:第一个循环负责角色移动,但红色方块、金币等Surface的绘制代码都在这个循环之后,只有当第一个循环结束(点击关闭按钮),第二个循环才会执行,此时角色已经停止移动,Surface才会显示。所有绘制逻辑必须放在同一个主循环内。
  • 重复创建窗口:先后创建了两个不同尺寸的窗口,后创建的窗口会覆盖前者,第一个窗口的操作完全无效。
  • 变量命名冲突:导入sys.exit后又定义了同名变量exit = True,会覆盖系统函数,可能导致退出异常。
  • Surface操作错误:部分Surface的填充写法冗余,且empty_surface1没有被正确填充颜色。

修复后的完整代码

import pygame
from sys import exit
import random

# 初始化必须放在最前面
pygame.init()

# 全局常量定义
COLOR = (255, 100, 98)
WALLCOLOR = (255,255,0)
SURFACE_COLOR = (0, 0, 0)
LIGHTGREEN = (0, 255, 0)

screenx = 1080
screeny = 600
size = (screenx, screeny)
# 只创建一个主窗口
screen = pygame.display.set_mode(size)
pygame.display.set_caption("End me.")

class Sprite(pygame.sprite.Sprite):
    def __init__(self, color, height, width):
        super().__init__()
 
        self.image = pygame.Surface([100, 100])
        self.image.fill(SURFACE_COLOR)
        self.image.set_colorkey(COLOR)
 
        pygame.draw.rect(self.image,
                         color,
                         pygame.Rect(0, 0, width, height))
 
        self.rect = self.image.get_rect()
 
    def moveRight(self, pixels):
        self.rect.x += pixels
 
    def moveLeft(self, pixels):
        self.rect.x -= pixels
 
    def moveForward(self, speed):
        self.rect.y += speed * speed/10
 
    def moveBack(self, speed):
        self.rect.y -= speed * speed/10

# 创建精灵组和玩家角色
all_sprites_list = pygame.sprite.Group()
playerCar = Sprite(LIGHTGREEN, 100, 100)
playerCar.rect.x = 50
playerCar.rect.y = 250
all_sprites_list.add(playerCar)

# 加载资源(放在初始化之后)
# image = pygame.image.load('DJ9ZEF.png')  # 如果需要可以启用,注意路径正确
img = pygame.image.load('bird.png')
coinimg = pygame.image.load('coin.png')
coinimg = pygame.transform.scale(coinimg, (200,200))

# 创建Surface资源
wall1size = (1000, 200)
empty_surface = pygame.Surface(wall1size)
empty_surface.fill((255, 0, 0))

wall1size1 = (1200, 2000)
empty_surface1 = pygame.Surface(wall1size1)
empty_surface1.fill((255, 0, 0))

clock = pygame.time.Clock()
running = True

# 唯一的主循环
while running:
    # 事件处理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_x:
                running = False

    # 角色移动控制
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        playerCar.moveLeft(10)
    if keys[pygame.K_RIGHT]:
        playerCar.moveRight(10)
    if keys[pygame.K_DOWN]:
        playerCar.moveForward(10)
    if keys[pygame.K_UP]:
        playerCar.moveBack(10)

    # 更新所有精灵
    all_sprites_list.update()

    # 清空屏幕
    screen.fill(SURFACE_COLOR)

    # 绘制所有元素(角色、Surface、图片)
    all_sprites_list.draw(screen)
    # screen.blit(image,(100,100))  # 如果需要启用这行
    screen.blit(coinimg, (850, 195))
    screen.blit(empty_surface, (250, -50))
    screen.blit(empty_surface1, (250, 425))

    # 更新屏幕显示
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
exit()

修复说明

  1. 把pygame.init()移到最开头,确保所有Pygame操作都在初始化之后执行。
  2. 合并两个主循环为一个,所有绘制逻辑(角色、Surface、图片)都放在循环内部,每次循环都重新绘制,保证元素实时显示。
  3. 删除了多余的窗口创建代码,只保留一个主窗口。
  4. 重命名了冲突的变量,避免覆盖sys.exit。
  5. 修正了Surface的填充写法,确保每个Surface都被正确设置颜色。
  6. 把资源加载和Surface创建放在初始化之后、主循环之前,避免重复加载资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:37:06