Задать вопрос
@Artin24
Начинающий

При проигрывании анимации выдает ошибку «list index out of range». Как ее исправить?

Создавая школьный проект для оценки в аттестат (новая разработка министерства образования) наткнулся на такую проблему:
Первая часть проблемного кода
class Explosion(pygame.sprite.Sprite):
	def __init__(self, center, size):
		pygame.sprite.Sprite.__init__(self)
		self.size = size 
		self.image = explosion_anim[self.size][0]
		self.rect = self.image.get_rect()
		self.rect.center = center 
		self.frame = 0
		self.last_update = pygame.time.get_ticks()
		self.frame_rate = 50
	def update(self):
		now = pygame.time.get_ticks()
		if now - self.last_update > self.frame_rate:
			self.last_update = now
			self.frame += 1
			if self.frame == len(explosion_anim[self.size]):
				self.kill
			else:
				center = self.rect.center
				self.image = explosion_anim[self.size][self.frame]
				self.rect = self.image.get_rect()
				self.rect.center = center

Вторая часть проблемного кода
explosion_anim = {}
explosion_anim['lg'] = []
explosion_anim['sm'] = []
for i in range(9):
	filename = 'regularExplosion0{}.png'.format(i)
	img = pygame.image.load(path.join(expl_dir, filename)).convert()
	img.set_colorkey(BLACK)
	img_lg = pygame.transform.scale(img, (75, 75))
	explosion_anim['lg'].append(img_lg)
	img_sm = pygame.transform.scale(img, (32, 32))
	explosion_anim['sm'].append(img_sm)

Третья часть проблемного кода
hitsMob = pygame.sprite.groupcollide(mobs, bullets, True, True)
	for hit in hitsMob:
		score += 50 - hit.radius
		random.choice(expl_sounds).play()
		expl = Explosion(hit.rect.center, 'lg')
		all_sprites.add(expl)
		newmob()
	hits = pygame.sprite.spritecollide(player, mobs, True, pygame.sprite.collide_circle)
	for hit in hits:
		player.shield -= hit.radius * 2
		expl = Explosion(hit.rect.center, 'sm')
		all_sprites.add(expl)
		newmob()
		if player.shield < 0:
			if score > maxScore:
				saveMaxScore(score)
			running = False

По строкам интерпретатора ошибка в строке self.image = explosion_anim[self.size][self.frame].
Тип ошибки: IndexError.
Причина: list index out of range (не силен в английском, но вроде написано что индекс вне диапазона).
  • Вопрос задан
  • 86 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
GavriKos
@GavriKos
Причина: list index out of range(не силен в английском, но вроде написано что индекс вне диапазона)
Помогите пожалуйста, третий день не могу исправить.


Ну так да, вы выходите за пределы диапазона. В питоне же с нуля индексация - мб в этом причина.
А вообще выведите в консоль (или дебагом пройдитесь) и посмотрите размеры explosion_anim и size с frame.

Еще как быстрое предположение - непонятно что там в kill (это метод? Там точно не нужны скобки? Пока выглядит не как вызов метода), но возможно update продолжает крутится после него? А проверка то уже на выход за пределы не выполнится - там строгое равно
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы