0

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

原帖

所以,我正在尝试使用 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
4

1 回答 1

3

我相信你的update函数需要构造一个pygame.Rectout of self.rect 因为map返回一个列表类型。现在,您正试图pygame.Rectlist对象上调用 a 的方法,这肯定行不通。

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

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

于 2013-06-07T18:47:41.663 回答