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
相关产品推荐
相关产品推荐

