我有一个类试图创建一个实例,然后将其定义为精灵,但也允许这个实例有其他变量(这是我在atari突破游戏上的进展跟进,我问另一个问题here。)
只是一个旁注(可能没有解释得很好,抱歉):我原本把所有的属性都附在一块砖头上。属性:的
self.brick = pygame.sprite.Sprite() # the .brick is now a sprite
因为我认为不可能给精灵用户发明属性,例如
self.brick.hardness
所以我这样做了:
self.hardness = 1 # the object has another attribute not interfering with the sprite
这与我的sprite碰撞引擎产生了一些冲突(长话短说;
.brick
属性无法调用方法blockType
因为它不是那个类的实例),所以我只是决定让实际的实例成为一个精灵,这可能会导致与其不可告人的属性发生冲突。
精灵是通过__init_构造函数创建的,其他属性仅在调用适当的方法时添加。
class Block:
def __init__ (self):
self = pygame.sprite.Sprite()
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface([width, height])
self.rect = self.image.get_rect()
def blockType (self, hardness):
self.hardness = hardness
if self.hardness == 1:
self.image.fill (RED)
block = Block () # These parenthesis might be wrong here
block.blockType (1)
现在这个问题可能再次归因于继承,但是当我创建实例时,一切都很好。但是,当我尝试调用该方法时,我收到错误:
AttributeError: 'Block' object has no attribute 'image'
我认为这很奇怪,因为在通过运行构造函数方法创建对象之后应该拥有一个图像属性(如果我不调用该方法,我实际上完全有能力在屏幕上绘制这些精灵,所以他们在技术上存在)。我试图绕过这条路,但在这一点上,我完全不知道出了什么问题。
如果您需要更多信息,请告知我们,我会更新。
答案 0 :(得分:4)
使用此代码时
class Block:
def __init__ (self):
self = pygame.sprite.Sprite() # don't overwrite self here
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface([width, height])
self.rect = self.image.get_rect()
使用新self
实例覆盖Block
(这是对新创建的Sprite
实例的引用);并且该实例迟早会被删除,因为你没有保留它的引用。
我猜你的意图是继承Sprite
(这在使用pygame时很常见),所以你必须使用:
class Block(Sprite):
def __init__ (self):
super().__init__()
self.image = pygame.Surface([width, height])
self.rect = self.image.get_rect()
现在Block
是Sprite
的子类,并且具有image
和rect
属性。