0

pygameを使用してPythonでウォークアニメーションを取得しようとしていますが、次のエラーが発生します。

Traceback (most recent call last):
  File "C:\Users\name\Desktop\game\game.py", line 37, in <module>
    player1 = player()
  File "C:\Users\name\Desktop\game\game.py", line 21, in __init__
    self.img = pygame.image.load(self.ani[1])
IndexError: list index out of range

これが私のコードです:

from pygame.locals import *

pygame.init()
clock = pygame.time.Clock()

height = 400
width = 800
screen = pygame.display.set_mode((width, height), 0, 32)

class player:
    def __init__(self):
        self.x = 200
        self.y = 300
        self.ani_speed_init = 10
        self.ani_speed = self.ani_speed_init
        self.ani = glob.glob("game\redplayer*.png")
        self.ani.sort()
        self.ani_pos = 0
        self.ani_max = len(self.ani) - 1
        self.img = pygame.image.load(self.ani[1])
        self.update(0)

    def update(self, pos):
        if pos != 0:
            self.ani_speed -= 1
            self.x += pos
            if self.ani_speed == 0:
                self.img = pygame.image.load(self.ani[self.ani_pos])
                self.ani_speed = self.ani_speed_init
                if self.ani_pos == self.ani_max:
                    self.ani_pos = 0
                else:
                    self.ani_pos += 1
        screen.blit(self.img,(self.x, self.y))

player1 = player()
pos = 0

私はファイル名をチェックしました、そして私はそれだとは思いませんが、それは可能性があります

4

2 に答える 2

1

「\r」はキャリッジリターンであり、ファイル名は「game <carriage return> edplayer*.png」になります。

代わりに「game\\redplayer*.png」またはr「game\redplayer*.png」を試してください。

于 2012-04-19T01:37:40.240 に答える
1

self.aniのインデックスで1つずつオフになっているようです。1つのフレームしかロードしていないため、リストの最初の項目はインデックス0です。

self.img = pygame.image.load(self.ani[0])

私はそれを機能させるために私のマシンであなたのコードをいじりました、ここにあります。:)各アニメーションフレームを事前にレンダリングされたサーフェスのリストにプリロードしてから、適切なフレームを画面にブリットします。また、FPSクロックを含む単純なゲームループ(Qを押して終了)を追加しました。

import pygame
from pygame.locals import *

pygame.init()
clock = pygame.time.Clock()
FPS = 30

width = 800
height = 600

screen = pygame.display.set_mode((width, height), 0, 32)

class player:
    def __init__(self, init_pos = (10,10), init_ani_speed = 10):
        self.x = init_pos[0]
        self.y = init_pos[1]

        self.ani_speed_init = init_ani_speed
        self.ani_speed = self.ani_speed_init

        self.ani = []
        # nux-style code here! :)
        # self.ani.append(glob.glob("game\\redplayer_01*.png"))
        # self.ani.append(glob.glob("game\\redplayer_02*.png"))

        self.ani.append("./ani/super_neko_01.png")
        self.ani.append("./ani/super_neko_02.png")

        self.ani_max = len(self.ani)-1
        self.ani_pos = 0

        self.img = []
        for item in self.ani:
            self.img.append(pygame.image.load(item))

        self.update(0)


    def update(self, pos = 0):
        # init: starts at 10, immediately blits self to screen at x,y
        if pos != 0:
            self.ani_speed -= 1 
            self.x += pos # move right by pos pixels
            if self.ani_speed == 0:
                self.ani_speed = self.ani_speed_init
                if self.ani_pos < self.ani_max:
                    self.ani_pos += 1
                else:
                    self.ani_pos = 0

        tempSurf = self.img[self.ani_pos]
        screen.blit(tempSurf,(self.x, self.y))

player1 = player()

# Main Game Loop
quit = False
while quit == False:
    for event in pygame.event.get():
        if (event.type == KEYUP): 
                    if (event.key == K_q):
                        quit = True

    if quit == False:
        player1.update(1)
        pygame.display.update()
    clock.tick(FPS)

pygame.quit()
于 2012-04-20T02:14:07.467 に答える