已修复:我的问题是将我创建的与 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