已修复:我的问题是将我创建的自定义方法的结果与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
答案 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
等)。