2017-06-21 36 views
3

私はゲームを作ろうとしていましたが、アニメーションを動かすことができません。ゲームを起動すると、すべての画像がその上にロードされ、アニメーション化されません。 は、ここに私のコードです:PythonでPythonでアニメーションを作成する

import pygame 
import os 

pygame.init() 

width = 800 
height = 600 

ship_width = 56 
ship_height = 64 

disp = pygame.display.set_mode((width,height)) 

pygame.display.set_caption("space_game") 

clock = pygame.time.Clock() 

background = pygame.image.load(os.path.join("Backgrounds", "Space.png")) 

img_names = ["sprite_00.png", "sprite_01.png", "sprite_02.png", "sprite_03.png", "sprite_04.png", "sprite_05.png", "sprite_06.png", "sprite_07.png", "sprite_08.png", "sprite_09.png"] #i load all the images here 

all_imgs = {} 
for img in img_names: 
    all_imgs[img] = pygame.image.load(img) 

def gameLoop(): 
    x = (width * 0.45) 
    y = (height * 0.8) 

    x_ch = 0 
    y_ch = 0 

    x_bg = 0 

    gameExit = False 

    while not gameExit: 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       gameExit = True 

      if event.type == pygame.KEYDOWN: 
       if event.key == ord("a"): 
        x_ch = -5 

       elif event.key == ord("d"): 
        x_ch = 5 

       elif event.key == ord("w"): 
        y_ch = -5 

       elif event.key == ord("s"): 
        y_ch = 5 

      if event.type == pygame.KEYUP: 
       if event.key == ord("a") or event.key == ord("d"): 
        x_ch = 0 

       if event.key == ord("w") or event.key == ord("s"): 
        y_ch = 0 

     x += x_ch 
     y += y_ch 

     if x > width - ship_width or x < 0: 
      x_ch = 0 

     if y > height - ship_height or y < 0: 
      y_ch = 0 

     x_loop = x_bg % background.get_rect().height 
     disp.blit(background, (0, x_loop - background.get_rect().height)) 

     if x_loop < height: 
      disp.blit(background, (0, x_loop)) 

     x_bg += 5 

     for img in img_names: 
      disp.blit(all_imgs[img], (x, y)) #but this part doesnt work it blits 

              #all the images on top of eachother 
     pygame.display.update() 

     clock.tick(60) 

gameLoop() 
pygame.quit() 
quit() 

何らかの理由で、それはそれだけでお互いの上のすべての画像は、私を助けてくださいロードアニメーションdoes notの。ありがとう。

答えて

3

はい、あなたのfor img in img_names:ループはすべての画像をブリットします。私の推奨は、images/pygame.Surfacesをリストに格納し、現在のイメージを追跡する変数indexを使用することです。

だから、大まか:この例では、フレームレートが結合しており、私が代わりにいくつかの時間間隔の後indexをインクリメントすることをお勧めしたいであること

images = [image1, image2, etc.] 
index = 0 

while True: 
    index += 1 
    # Modulo to keep the index in the correct range. 
    index %= len(images) 
    current_image = images[index] 
    disp.blit(current_image, position) 

注意。

補遺:アニメーションを遅くするには、例えば、フレームをカウントしframe_countが3

images = [image1, image2, etc.] 
index = 0 
frame_count = 0 

while True: 
    frame_count += 1 
    if frame_count > 3: 
     frame_count = 0 
     index += 1 
     index %= len(images) 
     current_image = images[index] 

    disp.blit(current_image, position) 

よりも大きくなるしかし、それはまだバインドされたフレームレートになる場合にのみ、インデックスをインクリメントすることができます。

それを行うための正しい方法は、timer変数を使用すると、それにそのclock.tick戻り時間を追加することで、タイマーは、いくつかの任意の閾値を超えている場合は、インデックスをインクリメントして画像を変更します。

images = [image1, image2, etc.] 
index = 0 
current_image = images[index] 
timer = 0 
dt = 0 

while True: 
    timer += dt 
    # If 1 second has passed. 
    if timer > 1: 
     timer = 0 
     index += 1 
     index %= len(images) 
     current_image = images[index] 

    screen.blit(current_image, position) 

    # dt is the time that has passed since the last clock.tick call. 
    # Divide by 1000 to convert milliseconds to seconds. 
    dt = clock.tick(FPS)/1000 
+0

必要に応じて、フレームレートの独立したバージョンも表示できます。 – skrx

+0

私はこのエラーが発生します:UnboundLocalError:割り当て前にローカル変数 'index'が参照されています –

+0

これは、関数内で変数 'index'を定義していないことを意味します。 – skrx

関連する問題