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 шт):
Вам нужно ограничить максимальное значение 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 высчитывать из этой константы и размера массива спрайтов. Потому что как только вы начнёте что-то менять в программе, добавите больше спрайтов, например, вам придётся сразу менять много переменных в коде, какие-то вы забудете поменять и это приведёт к глюкам или падениям программы.