list index out of range ошибка,как исправить

При проигрывании анимации пишет ошибку list index out of range , сама анимация начинается после атаки игрока.

сама анимация принадлежит к ba = ... При атаке игрока на клавишу, начинается анимация enemy и при конечном спрайте выбивает ошибку.

class enemy(object):

walkRight = 

[pygame.image.load("gobling.png"),pygame.image.load("gobling.png"),pygame.image.load("gobling.png"),pygame.image.load("gobling.png")
                 ,pygame.image.load("gobling2.png"),pygame.image.load("gobling2.png"),pygame.image.load("gobling.png"),pygame.image.load("gobling.png")
                 ,pygame.image.load("gobling.png"),pygame.image.load("gobling.png"),pygame.image.load("gobling.png"),pygame.image.load("gobling.png")]

    ba = [pygame.image.load("ba1.png"),pygame.image.load("ba2.png"),pygame.image.load("ba3.png"),pygame.image.load("ba4.png"),pygame.image.load("ba5.png")]
    def __init__(self, x, y, width, height, end):
        self.x = x + 100
        self.y = y
        self.width = width
        self.height = height
        self.end = end
        self.path = [self.x, self.end]
        self.walkCount = 0
        self.attackCount = 0
        self.vel = 3
        self.hitbox = (self.x , self.y , 66, 64)
        self.health = 10
        self.visible = True
        self.attack = False
        self.standing = True
    def draw(self,win):
        if self.visible:
            if self.walkCount + 1 >= 30:
                self.walkCount = 0

            if self.standing :
                win.blit(self.walkRight[self.walkCount //5], (self.x, self.y))
                self.walkCount += 1
            if (self.attack):
                win.blit(self.ba[self.attackCount //4], (self.x,self.y))
                self.attackCount += 1
            pygame.draw.rect(win, (255,0,0), (self.hitbox[0], self.hitbox[1] - 20, 75, 15))
            pygame.draw.rect(win, (0,255,0), (self.hitbox[0], self.hitbox[1] - 20, 75 - (7.5 * (10 - self.health)), 15))
            self.hitbox = (self.x , self.y , 66, 40)

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

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

Вам нужно ограничить максимальное значение self.attackCount, также как у вас сделано ограничение для self.walkCount в этом куске кода:

        if self.walkCount + 1 >= 30:
            self.walkCount = 0

В принципе, такое можно делать проще, с помощью взятия остатка от деления в том месте, где вы это значение увеличиваете:

        self.walkCount = (self.walkCount + 1) % 30

Но максимальное число для attackCount будет другое.

Посчитать максимальное ограничение, насколько я понял ваш код, можно так: берём число элементов в соответствующем массиве, например ba и умножаем на число, на которое вы делите на цело вашу переменную при доступе к этому массиву self.ba[self.attackCount //4], в данном случае получается 5 элементов умножить на 4 -> ограничение 20. Для walkCount, кстати, должно быть судя по всему ограничение 60, а не 30.

Вообще лучше такие вещи занести в переменные-константы, например 4 занести в константу, а 20 высчитывать из этой константы и размера массива спрайтов. Потому что как только вы начнёте что-то менять в программе, добавите больше спрайтов, например, вам придётся сразу менять много переменных в коде, какие-то вы забудете поменять и это приведёт к глюкам или падениям программы.

→ Ссылка