2017-07-18 12 views
0

ここに私のコードです。ウォーキングアニメーションを作成するにはどうすればよいですか? (Pygame、python)

jack_right_1 = pg.image.load(os.path.join(img_folder, "jack_right_1.png")).convert() 
jack_right_2 = pg.image.load(os.path.join(img_folder, "jack_right_2.png")).convert() 
jack_right_3 = pg.image.load(os.path.join(img_folder, "jack_right_3.png")).convert() 

player_images = [jack_right_1, jack_right_2, jack_right_3] 

class Player(pg.sprite.Sprite): 
    def __init__(self): 
     pg.sprite.Sprite.__init__(self) 
     self.image = player_images 
     self.rect = self.image.get_rect() 
     self.pos = vec(WIDTH - 650, HEIGHT - 700) 
     self.standing = False 
     self.vel = vec(0, 0) 
     self.acc = vec(0, 0) 

    def update(self): 
     self.acc = vec(0, PLAYER_GRAVITY) 
     keystate = pg.key.get_pressed() 
     if keystate[pg.K_LEFT]: 
      player.image = pg.image.load(player_images[counter]) 
      counter = (counter + 1) % len(player_images) 

私はそれを実行しようとするたびに、 'list'オブジェクトには属性 'get_rect'がありません。私はあなたがリストからrectを得ることができないことを知っていますが、どのように画像リストを作成し、各画像のrectを取得しますか?

答えて

0

あなたはかなり近いようですね!問題は、player_images(したがって、self.image)は、実際にリストSurfaceというオブジェクトを格納しています。個のオブジェクトSurfaceです。あなたがRectオブジェクトのリストを保存したい場合は、そのような彼らをループことができます:あなたが同じことを行いワンライナーが必要な場合は

class Player(pg.sprite.Sprite): 
    def __init__(self): 
     pg.sprite.Sprite.__init__(self) 
     self.images = player_images 
     self.rects = [] 
     for image in self.images: 
      self.rects.append(image.get_rect()) 

あるいは、代わりにリストの内包を考えてみます。

class Player(pg.sprite.Sprite): 
    def __init__(self): 
     pg.sprite.Sprite.__init__(self) 
     self.images = player_images 
     self.rects = [image.get_rect() for image in self.images] 
+0

ありがとうございました! –

0

pygame.sprite.Spriteimage属性は単一のサーフェスでなければなりません。 にplayer_imagesの最初の画像のみを割り当てます。 を呼び出しましたが、self.imageget_rectメソッドを持たないリストであるため、エラーが発生しています。

また、現在のイメージのインデックスを追跡する属性も必要です(次の例ではself.counterと呼んでいます)。

イメージを更新するには、self.counterを増やして、len(player_images)のモジュロを使用してIndexErrorsを回避します。次にself.counterインデックスを使用してself.imageself.image = player_images[self.counter]を更新します。

class Player(pg.sprite.Sprite): 

    def __init__(self): 
     pg.sprite.Sprite.__init__(self) 
     self.counter = 0 # Index of the current image. 
     # Assign the first player image. 
     self.image = player_images[self.counter] 
     self.pos = vec(WIDTH - 650, HEIGHT - 700) 
     # Now get_rect works. Set the center or topleft to self.pos. 
     self.rect = self.image.get_rect(center=self.pos) 
     self.standing = False 
     self.vel = vec(0, 0) 
     self.acc = vec(0, 0) 

    def update(self): 
     self.acc = vec(0, PLAYER_GRAVITY) 
     keystate = pg.key.get_pressed() 
     if keystate[pg.K_LEFT]: 
      # Increment the counter. 
      self.counter = (self.counter + 1) % len(player_images) 
      # And finally change the image. 
      self.image = player_images[self.counter] 
+0

また、常に呼び出されるメソッドにイメージを読み込まないでください。それらを 'jack_right1'のようにグローバルにロードして、あなたのプログラムで再利用してください。 --- 'pg.key.get_pressed()'はメインループで呼び出されるはずです。次に、 'keystate'リストを必要とするすべてのスプライトに渡すことができます。 – skrx

+0

ありがとうございます。私は今働いている。しかし、イメージが切り替わる速度をどのように制御するのですか? –

関連する問題