碰撞检测错误:AttributeError:type object' Ship_laser'没有属性' sprites'

时间:2014-08-11 20:14:10

标签: python pygame

我正在尝试使用模型编写游戏,但我收到错误:

 "File "C:\Python27\lib\site-packages\pygame\sprite.py", line 1514, in spritecollide
    for s in group.sprites():AttributeError: type object 'Ship_laser' has no attribute 'sprites'" 

当运行脚本时。如果我没有调用我的碰撞功能,那么脚本会运行,因此该函数是错误的,但我不明白错误在哪里。这是函数的代码:

def collisions():
for enemy_ship in classes.Enemy_ship.List:
    enemy_laser = pygame.sprite.spritecollide(enemy_ship, classes.Ship_laser, True)
    if len(enemy_laser) > 0:
        for hit in enemy_laser:
            enemy_ship.health -= 25




for laser in classes.Ship_laser.List:
    if pygame.sprite.spritecollide(laser, enemy_ship, True):
        laser.destroy()

如果需要,我将从classes.py文件中发布Ship_laser类

class Ship_laser(pygame.sprite.Sprite):
allsprites = pygame.sprite.Group()

def __init__(self, x, y,  image_string):
    pygame.sprite.Sprite.__init__(self)
    Ship_laser.allsprites.add(self)
    self.image = pygame.image.load(image_string)
    self.rect = self.image.get_rect()
    self.rect.x = x
    self.rect.y = y
    self.velx, self.vely = 0, 0

@staticmethod
def laser_movement(SCREENWIDTH, SCREENHEIGHT):
    for laser in Ship_laser.List:
        laser.rect.x += laser.velx
        laser.rect.y += laser.vely

def destroy(self):
    Ship_laser.List.remove(self)

    del self

考虑到它继承了pygame.sprite.Sprite类的Laser.ship类,我不明白错误。这是我的第一个游戏。请帮忙

1 个答案:

答案 0 :(得分:0)

我不能说我是pygame的专家,也不完全理解你是如何构建类的。当我听到船舶激光时,我想到了一个属于船舶的单个实例,但在你的类中你定义了“allsprites”,它是一个为类实例定义的可变类型(由类的所有成员共享)。

但是考虑到这一点,所有的精灵都将是在ship_laser之间共享的同一个可变对象,几乎就像你班级的黄页一样。当你调用pygame.sprite.spritecollide(基于pygame文档)时,它正在寻找sprite.Group,因此,你应该将它传递给组查找(yellowpages又名allsprites),而不是对类的引用。这应该排序你的问题。所以,这是你的代码更改:

enemy_laser = pygame.sprite.spritecollide(enemy_ship, classes.Ship_laser, True)

enemy_laser = pygame.sprite.spritecollide(enemy_ship, classes.Ship_laser.allsprites, True)