FIXED : 私の問題は、zip() と組み合わせて使用するために作成したカスタム メソッドの結果を .rect 属性 (以下のコード) に割り当てることにありました。このメソッドは、発射物オブジェクトの .rect 属性に割り当てられていたリスト オブジェクトを返し、そのオブジェクト タイプを「pygame.Rect」から「list」に変更しました。修正には、「リスト」の結果を .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