跟随教程编写Pygame简易游戏无法弹出黑窗口问题求助
问题原因&修复方案
你的代码存在3个核心错误导致运行无响应、无法正常显示窗口:
- 缩进逻辑完全错误:主循环
while True、循环内的事件处理、渲染逻辑的缩进层级全错,导致程序根本没有进入游戏主循环,自然不会弹出窗口也不会响应操作。而且按键事件的判断被缩进在了if event.type == pygame.QUIT的分支内部,永远不会被触发。 - 渲染顺序颠倒:你先渲染玩家角色再填充黑色背景,相当于用背景把刚画好的玩家完全覆盖,后续就算逻辑跑通也看不到玩家。
Sprite类的goto方法缺失入参定义,运行到对应逻辑时会直接抛出变量未定义的报错。
修正后的完整代码
import pygame import sys import math import random pygame.init() pygame.display.set_caption("Squid Slayer") clock = pygame.time.Clock() WIDTH = 1200 HEIGHT = 800 BLACK = (0, 0, 0) WHITE = (255, 255, 255) GREEN = (0, 255, 0) RED = (255, 0, 0) BLUE = (0, 0, 255) # 生成窗口 screen = pygame.display.set_mode((WIDTH, HEIGHT)) # 定义类 class Sprite (): def __init__(self, x, y, width, height): self.x = x self.y = y self.dx = 0 self.dy = 0 self.width = width self.height = height self.color = WHITE self.friction = 0.8 def goto(self, x, y): # 补充缺失的入参 self.x = x self.y = y def render(self): pygame.draw.rect(screen, self.color, pygame.Rect(int(self.x-self.width/2.0),int(self.y-self.height/2.0), self.width, self.height)) def is_aabb_collision(self, other): # 轴对齐碰撞盒检测 x_collision = (math.fabs(self.x-other.x)*2) < (self.width+other.width) y_collision = (math.fabs(self.y-other.y)*2) < (self.height+other.height) return (x_collision and y_collision) class Player(Sprite): def __init__(self, x, y, width, height): Sprite.__init__(self, x, y, width, height) # 创建游戏对象 player = Player(600, 400, 20, 40) # 把初始y坐标从0改到400,避免初始位置在窗口外看不到 # 主游戏循环,修正缩进 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() # 修正按键事件的缩进,移到QUIT判断的同级 if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: pass elif event.key == pygame.K_RIGHT: pass elif event.key == pygame.K_SPACE: pass # 移动/更新对象逻辑留空待后续补充 # 碰撞检测留空待后续补充 # 玩家边界检测留空待后续补充 # 渲染逻辑,先填充背景再画玩家 screen.fill(BLACK) player.render() # 刷新显示 pygame.display.flip() # 锁定30FPS clock.tick(30)
运行修正后的代码即可正常弹出黑色窗口,窗口中间会显示白色的玩家矩形。
内容的提问来源于stack exchange,提问作者mooman
相关产品推荐
相关产品推荐

