Pyglet自定义Player类报错:'OrderedDict'对象无'get_texture'属性
问题分析与解决方案
兄弟,你遇到的AttributeError完全是因为把Pyglet Sprite父类的构造函数参数搞混了,而且还有几个和Pygame API差异的小坑,我给你拆解一下:
错误核心原因
Pyglet的pyglet.sprite.Sprite.__init__第一个必填参数是图像对象,但你却把self.groups(一个OrderedDict)当成第一个参数传进去了。代码里这行:
pyglet.sprite.Sprite.__init__(self, self.groups)
会让Pyglet误以为你传的OrderedDict是图像,试图调用它的get_texture()方法,自然就报错了——字典哪来这个方法嘛!
另外还有三个小问题:
- 你在调用父类构造后才给
self.image赋值,这根本没用,父类初始化的时候已经需要图像了 - Pyglet的Sprite没有
rect属性,这是Pygame的专属属性,Pyglet直接用x和y控制位置 - 主类里调用
player的参数顺序错了:你的player类__init__参数是(self, x, y, game),但你传的是player(self, 0, 0),把game参数放在了第一个位置
修正后的代码
修正Player类
import pyglet from pyglet.graphics import OrderedGroup class Player(pyglet.sprite.Sprite): def __init__(self, x, y, game): self.game = game # 先加载图像,父类初始化必须用到它 self.image = pyglet.resource.image("white_square.png") # 正确调用父类构造:第一个参数是图像,然后是x、y,最后传渲染组 super().__init__( self.image, x=x * game.tilesize, y=y * game.tilesize, groups=game.spritesPlayer ) # 主类示例 class Game: def __init__(self): self.tilesize = 32 # Pyglet的渲染组要用专用的OrderedGroup,不是普通OrderedDict self.spritesPlayer = OrderedGroup(0) # 注意参数顺序:x, y, game实例 self.player = Player(0, 0, self)
额外提醒
- Pyglet的渲染组(Group)不是普通的
OrderedDict,要用pyglet.graphics.OrderedGroup来实现分层渲染,这样才能正确管理Sprite的绘制顺序 - 别把Pygame的API习惯直接套到Pyglet上,比如
rect、构造函数参数顺序这些差异很大,建议多看看Pyglet官方的Sprite文档
内容的提问来源于stack exchange,提问作者Rebagliati Loris
相关产品推荐
相关产品推荐

