我想检查精灵组中的哪个对象与另一个对象发生碰撞,然后在该位置创建一个新的精灵(如爆炸)。
在while循环中,我移动对象,然后检查碰撞。
if not game_over:
move_coins()
move_pointer()
if pygame.sprite.spritecollideany(pointer, coin_group):
print_text(pygame.font.Font(None,16), 0, 0, "Collision!")
check_collision()
此处的碰撞成功,因为它将文本打印到屏幕上。然后继续check_collision()。
def check_collision():
for coin in coin_group:
if pygame.sprite.collide_rect(coin, pointer):
create_newcoin()
def create_newcoin():
bcoin = Coin()
bcoin.load("coin1s.png", 32, 32, 1)
bcoin.position = 0,0
collected_group.add(bcoin)
create_newcoin()函数在check_collision()之外正常工作,但是当它在这个循环中运行时,我得到一个属性错误。
Coin() has no attribute 'image'
有人可以解释为什么我会收到此错误以及我需要做些什么才能修复它?如果有必要,我可以提供更多代码,但我认为我已将其缩小到此部分,从而导致错误。感谢。
呃,我只是粘贴我正在使用的代码。 http://pastebin.com/TuAZxUkq和http://pastebin.com/kmYytiYV
错误:
Traceback (most recent call last):
File "C:\Users\User\Desktop\Coins!\Coins!.py", line 129, in <module>
collected_group.draw(screen)
File "C:\Python32\lib\site-packages\pygame\sprite.py", line 475, in draw
self.spritedict[spr] = surface_blit(spr.image, spr.rect)
AttributeError: 'Coin' object has no attribute 'image'
答案 0 :(得分:0)
pygame.sprite.Group.draw()
和 pygame.sprite.Group.update()
是由 pygame.sprite.Group
提供的方法。
前者将 委托给包含的 pygame.sprite.Sprite
s 的 update
方法 - 您必须实现该方法。见pygame.sprite.Group.update()
:
对组中的所有 Sprite 调用 update()
方法 [...]
后者使用包含的 image
的 rect
和 pygame.sprite.Sprite
属性来绘制对象 - 您必须确保 pygame.sprite.Sprite
具有所需的属性。见pygame.sprite.Group.draw()
:
将包含的精灵绘制到 Surface 参数。这对源表面使用 Sprite.image
属性和 Sprite.rect
。 [...]
类 Coin
子类 MySprite
。 MySprite
是一个属性 master_image
,但没有属性 image
。因此,调用 pygame.sprite.Group.draw()
将导致错误:
Coin() 没有属性 'image'
只需将 mater_image
重命名为 image
即可解决问题:
class MySprite(pygame.sprite.Sprite):
def load(self, filename, width=0, height=0, columns=1):
self.set_image(image e, width, height, columns)
def set_image(self, image, width=0, height=0, columns=1):
self.image = image
# [...]