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()
修复说明
- 把
pygame.init()移到最开头,确保所有Pygame操作都在初始化之后执行。 - 合并两个主循环为一个,所有绘制逻辑(角色、Surface、图片)都放在循环内部,每次循环都重新绘制,保证元素实时显示。
- 删除了多余的窗口创建代码,只保留一个主窗口。
- 重命名了冲突的变量,避免覆盖
sys.exit。 - 修正了Surface的填充写法,确保每个Surface都被正确设置颜色。
- 把资源加载和Surface创建放在初始化之后、主循环之前,避免重复加载资源。
内容的提问来源于stack exchange,提问作者Milockery
相关产品推荐
相关产品推荐

