0

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
4

1 に答える 1

3

リスト型を返す ため、 out of updateを構築する必要がある関数を信じています。今、オブジェクトで a のメソッドを呼び出そうとしていますが、これは確実に機能しません。pygame.Rectself.rectmappygame.Rectlist

関数が何を返すかわからないalg.w_avgので、単純なキャストよりも複雑なことをしなければならないかもしれませんが、それが問題の原因だと思います。潜在的な解決策は次のとおりです(alg.w_avga を簡単に構築できるようにするのに十分な「良い」ものを返す場合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

于 2013-06-07T18:47:41.663 に答える