'list'对象没有属性'colliderect'

时间:2013-06-07 18:39:27

标签: python pygame

已修复:我的问题是将我创建的自定义方法的结果与zip()一起用于我的.rect属性(下面的代码)。该方法返回一个列表对象,该对象被分配给我的射弹对象的.rect属性,将其对象类型从'pygame.Rect'更改为'list'。修复涉及将'list'结果存储在.rect属性的.topleft属性中,这是pygame.Rect从中获取其位置的'list'。非常感谢布里恩的帮助!

原始帖子

所以,我正在尝试使用pygame方法pygame.sprite.spritecollide()来检查子弹是否击中了敌人。

除非我收到错误

Traceback (most recent call last):
  File "D:\workspace\PyProjects\pygamedev-shame\testGame.py", line 61, in <module>
    pygame.sprite.spritecollide(bullet, live_enemies, True)
  File "D:\Python27\lib\site-packages\pygame\sprite.py", line 1337, in spritecollide
    spritecollide = sprite.rect.colliderect
AttributeError: 'list' object has no attribute 'colliderect'

我的代码如下所示:

live_enemies = pygame.sprite.Group(enemies)

    for bullet in player.projectiles:
        cur_bullet = pygame.sprite.Group(bullet)
        bullet.move(seconds)
        bullet.update()
        screen.blit(bullet.surface, bullet.rect)
        pygame.sprite.spritecollide(bullet, live_enemies, True)
        if bullet.rect[0] > screen_dim[0] or bullet.rect[0] < 0 or bullet.rect[len(bullet.pos) - 1] > screen_dim[1] or bullet.rect[len(bullet.pos) - 1] < 0:
            player.projectiles.remove(bullet)

抛射物类如下所示:

class projectile(pygame.sprite.Sprite):

    #ctor
    def __init__(self, pos, imgPath, face, speed):
        #extending sprite
        pygame.sprite.Sprite.__init__(self)

        #setup gfx
        self.surface = pygame.image.load(imgPath)
        self.rect = self.surface.get_rect()
        self.rect.topleft = pos

        #init projectile vars
        self.facing = face
        self.orient(self.facing)
        self.speed = speed
        self.pos = pos
        self.dest_vector = pos

    #move the object
    def move(self, cr):
        moverate = cr*self.speed
        move_vector = self.facing
        #normalize diagonal movement
        if sum(map(abs, move_vector)) == 2:
            move_vector = [p/1.4142 for p in move_vector]

        move_vector = [moverate*p for p in move_vector]

        #set the destination vector
        self.dest_vector = map(sum, zip(self.dest_vector, move_vector))

    #orient the sprite
    def orient(self, face):
        rot = math.atan2(face[0],face[1])
        rot = math.degrees(rot) - 90
        self.surface = pygame.transform.rotate(self.surface, rot)

    #update the object
    def update(self):
        #interpolate movement over frames
        self.rect = map(alg.w_avg, zip(self.rect, self.dest_vector))

我认为我有一些问题,弹丸不被认为是一个精灵,但这似乎很奇怪,因为我有超级构造函数和继承正确,据我所知。问题可能在于for循环关于列表中的项目的方式,但我不确定如何纠正它。

我是否可以深入了解错误的确切内容以及我可以采取哪些措施来解决错误?

编辑:问题可能在于我的 w_avg方法,如下所示:

def w_avg(aset):
        slow = 3
        return ((aset[0] * (slow - 1)) + aset[1]) / slow

1 个答案:

答案 0 :(得分:3)

我相信您需要update函数构建pygame.Rect self.rect,因为map会返回列表类型。现在,您正试图在pygame.Rect对象上调用list的方法,这当然不起作用。

我不知道你的alg.w_avg函数返回什么,所以你可能需要做一些比简单演员更复杂的事情,但我相信这是你问题的根源。一个潜在的解决方案是(如果alg.w_avg返回一些“不错”,足以容易地从中构造Rect):

self.rect = Rect(map(alg.w_avg, zip(self.rect, self.dest_vector))) 

修改

看到你的w_avg方法,我相信你想要做的是

self.rect.topleft = map(alg.w_avg, zip(self.rect, self.dest_vector))

center上的其他位置(self.rect等)。