Python/Pygame Ошибка: list index out of range

Ошибка:

Traceback (most recent call last):
  File "c:\Users\Tigran\Desktop\PY\Игра\игранастоящая.py", line 148, in <module>
    player.update()
  File "c:\Users\Tigran\Desktop\PY\Игра\игранастоящая.py", line 70, in update
    self.image = pygame.transform.flip(self.images[self.frame//ani], True, False)
                                       ~~~~~~~~~~~^^^^^^^^^^^^^^^^^
IndexError: list index out of range

Код:

import pygame , os , sys

# Переменные
worldx = 800
worldy= 600
fps = 40 #частота кадров
ani = 4 #циклы анимации
world = pygame.display.set_mode([worldx,worldy])
BLUE = (25,25,200)
BLACK = (23,23,23)
WHITE = (254,254,254)
ALPHA = (0,255,0)

main = True

# Объекты
class Player(pygame.sprite.Sprite):
    #персонаж сам
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)  # тут тоже надо 2 подчеркивания
        self.movex = 0 # перемещение по х
        self.movey = 0 # перемещение по у
        self.frame = 0 #подсчет кадров
        self.images = []
        img = pygame.image.load("sto.png").convert_alpha()
        for i in range(1,4):
         img = pygame.image.load(os.path.join("sto" + str(i) + ".png")).convert_alpha()
         img.convert_alpha()
         img.set_colorkey(ALPHA)

        self.images.append(img)
        self.image = self.images[0]
        self.rect = self.image.get_rect()
            

    def control(self,x,y):
        # Управление перемещением главного персонажа

        self.movex += x
        self.movey += y

    def update(self):
        #новая позиция спрайта

        self.rect.x = self.rect.x + self.movex
        self.rect.y = self.rect.y + self.movey

        # ВЛЕВО
        if self.movex < 0:
            self.frame += 1
            if self.frame > 3 *ani:
                self.frame = 0
            self.image = pygame.transform.flip(self.images[self.frame//ani], True, False)

        # Вправо
        if self.movex > 0:
            self.frame += 1
            if self.frame > 3 *ani:
                self.frame = 0
            self.image = self.images[self.frame//ani]     

        # img = pygame.image.load(os.path.join('sto.png'))
        # self.images.append(img)
        # self.image = self.images[0]
        # self.rect = self.image.get_rect()

# Настройка

pygame.display.set_caption("Best Parkour Master | Tigran Gevorkyan")
pygame.display.set_icon(pygame.image.load("ико.png"))
clock = pygame.time.Clock()
pygame.init()
world = pygame.display.set_mode([worldx, worldy])
player = Player() #создать спрайт
player.rect.x = 0 #x
player.rect.y = 0 #y
player_list = pygame.sprite.Group()
player_list.add(player)
steps = 10 # пиксели для перемещения

# Скорость перемещения персонажа
speed = 5

# Цвет фона (если необходимо)
BACKGROUND_COLOR = (255, 255, 255)

# Загрузка изображений
background_image = pygame.image.load('фон1.png')



# Позиция спрайта
sprite_x = -10
sprite_y = 360


# Основной игровой цикл
while main:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            try:
                sys.exit
            finally:
                main = False

        
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT or event.key == ord("a"):
                player.control(-steps, 0)
            if event.key == pygame.K_RIGHT or event.key == ord("d"):
                player.control(steps, 0)
            if event.key == pygame.K_UP or event.key == ord("w"):
                print("jump")
                
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == ord("a"):
                player.control(steps, 0)
            if event.key == pygame.K_RIGHT or event.key == ord("d"):
                player.control(-steps, 0)
               
            if event.key == ord("q"):
                pygame.quit()
                sys.exit()
                main = False

    # Рисуем фон
    world.blit(background_image, (0, 0))

    # Рисуем спрайт
    player.update()
    player_list.draw(world)

        # Обновляем экран
    pygame.display.flip()

    # Ограничиваем количество кадров в секунду
    pygame.time.Clock().tick(60)

Момент с ошибкой:

def control(self,x,y):
    # Управление перемещением главного персонажа

    self.movex += x
    self.movey += y

def update(self):
    #новая позиция спрайта

    self.rect.x = self.rect.x + self.movex
    self.rect.y = self.rect.y + self.movey

    # ВЛЕВО
    if self.movex < 0:
        self.frame += 1
        if self.frame > 3 *ani:
            self.frame = 0
        self.image = pygame.transform.flip(self.images[self.frame//ani], True, False)

    # Вправо
    if self.movex > 0:
        self.frame += 1
        if self.frame > 3 *ani:
            self.frame = 0
        self.image = self.images[self.frame//ani]

     

Ответы (1 шт):

Автор решения: Lyth

Дополнительные спрайты анимации не были положены в список — только загружены (обратите внимание на величину отступа в цикле):

        self.images = []
        img = pygame.image.load("sto.png").convert_alpha()
        for i in range(1,4):
         img = pygame.image.load(os.path.join("sto" + str(i) + ".png")).convert_alpha()
         img.convert_alpha()
         img.set_colorkey(ALPHA)

        self.images.append(img)
→ Ссылка