Repl.it开发Pygame项目:玩家不显示仅黑屏无报错求助
Pygame游戏黑屏且玩家移动失效的问题修复
你的代码存在多处缩进错误,这是导致黑屏和移动功能失效的核心原因,以下是具体问题和修复方案:
问题点梳理
- 类方法缩进错误:
draw和update方法没有缩进在Player类的范围内,这两个方法无法被实例调用,直接导致玩家无法被绘制,移动逻辑也无法执行。 - update方法条件嵌套错误:多个方向判断的
if语句被错误嵌套,只有同时满足多层条件时才会设置速度,完全不符合移动逻辑。 - 事件处理与渲染代码缩进错误:
KEYUP事件判断被嵌套到了KEYDOWN的分支里,且窗口填充、玩家绘制代码只在触发特定按键事件时才执行,平时窗口不会刷新,所以显示黑屏。 - 主循环核心代码缩进错误:
player.update()、pygame.display.flip()、clock.tick()这些主循环必须执行的代码被放到了while True循环外面,游戏逻辑根本不会循环更新。
修复后的完整代码
import pygame, sys WIDTH, HEIGHT = 400, 400 TITLE = "DarkRoom" pygame.init() win = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption(TITLE) clock = pygame.time.Clock() class Player: def __init__(self, x, y): self.rect = pygame.Rect(x, y, 32, 32) self.x = int(x) self.y = int(y) self.color = (255, 255, 255) self.velX = 0 self.velY = 0 self.left_pressed = False self.right_pressed = False self.up_pressed = False self.down_pressed = False self.speed = 4 # 修正缩进:属于Player类的方法 def draw(self, win): pygame.draw.rect(win, self.color, self.rect) # 修正缩进:属于Player类的方法,同时修正条件判断的嵌套 def update(self): self.velX = 0 self.velY = 0 if self.left_pressed and not self.right_pressed: self.velX = -self.speed if self.right_pressed and not self.left_pressed: self.velX = self.speed if self.up_pressed and not self.down_pressed: self.velY = -self.speed if self.down_pressed and not self.up_pressed: self.velY = self.speed self.x += self.velX self.y += self.velY self.rect = pygame.Rect(self.x, self.y, 32, 32) player = Player(WIDTH/2, HEIGHT/2) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() # 拆分KEYDOWN和KEYUP事件,修正缩进 if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: player.left_pressed = True if event.key == pygame.K_RIGHT: player.right_pressed = True if event.key == pygame.K_UP: player.up_pressed = True if event.key == pygame.K_DOWN: player.down_pressed = True if event.type == pygame.KEYUP: if event.key == pygame.K_LEFT: player.left_pressed = False if event.key == pygame.K_RIGHT: player.right_pressed = False if event.key == pygame.K_UP: player.up_pressed = False if event.key == pygame.K_DOWN: player.down_pressed = False # 渲染和更新代码放到主循环内,每次循环都执行 win.fill((12, 24, 36)) player.draw(win) player.update() pygame.display.flip() clock.tick(120)
内容的提问来源于stack exchange,提问作者TurnipYossarian
相关产品推荐
相关产品推荐

