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

Pygame/PGZero实现角色显示及控制时出现AttributeError问题求助

问题解决方案

报错原因

你触发AttributeError: 'NoneType' object has no attribute 'blit'以及其他报错的核心问题是混用了Pygame Zero(pgzero)和原生Pygame的开发规范,同时存在语法缩进错误,具体问题如下:

  • 手动调用pygame.display.set_mode()给screen变量赋值,覆盖了Pygame Zero自动初始化的内置screen对象,Actor的draw()方法依赖内置screen的blit接口,被覆盖后找不到对应属性
  • draw()函数的缩进错误,除了screen.clear()之外的绘制逻辑全部写在了函数外部,执行时机完全错误
  • 未导入sys模块就调用了sys.exit()
  • 自行编写了while True事件循环,和Pygame Zero内置的事件循环逻辑冲突
  • 初始坐标x、y赋值和player初始位置不一致,会覆盖你设置的初始坐标
  • 上下移动的y轴逻辑写反,Pygame坐标系左上角为(0,0),向上移动应该减小y值,向下移动增大y值

修正后完整代码

import pgzrun
import sys

# 音乐、精灵和背景配置
music.play("temp.mp3")
WIDTH = 850
HEIGHT = 425
vel = 5

# 初始化精灵和位置
title = Actor('title.png')
title.pos = 400, 212
cont = Actor('cont.png')
cont.pos = 470, 300
player = Actor('ship.png')
player.pos = 100, 56
foe = Actor('foe.png')
foe.pos = 200, 112

# 坐标初始值和player初始位置对齐
x, y = player.pos

def draw():
    screen.clear()
    screen.fill((0, 0, 0))
    title.draw()
    cont.draw()
    player.draw()
    foe.draw()

def update():
    global x, y
    # 检测按键状态更新坐标
    if keyboard.left or keyboard.a:
        x -= vel
    if keyboard.right or keyboard.d:
        x += vel
    if keyboard.up or keyboard.w:
        y -= vel
    if keyboard.down or keyboard.s:
        y += vel
    # 边界判断,防止角色移出屏幕
    x = max(0, min(x, WIDTH))
    y = max(0, min(y, HEIGHT))
    player.pos = x, y

def on_key_down(key):
    if key == keys.Q:
        pygame.quit()
        sys.exit()

# 启动Pygame Zero运行循环
pgzrun.go()

运行说明

代码保存后直接用pgzrun 你的文件名.py命令执行即可,不需要手动调用原生Pygame的接口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:09:03