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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:50:45