Уже не один день бьюсь над проблемой, вроде как всё в программе игра работает но вот анимация ни как. Вот есть класс buh().
#Класс отвечает за взрывы сломанных ведроидов и не только
class buh(pygame.sprite.Sprite):
def __init__(self, center, size):
pygame.sprite.Sprite.__init__(self)
self.size = size
self.image = buh_droid_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(buh_droid_anim[self.size]):
self.kill()
else:
center = self.rect.center
self.image = buh_droid_anim[self.size][self.frame]
self.rect = self.image.get_rect()
self.rect.center = center
вот есть сами картинки анимации.
#Анимация взырвов ведройдов
droid_bah = []
droid_list = ['droid_bah_0.png','droid_bah_1.png','droid_bah_2.png','droid_bah_3.png','droid_bah_4.png',
'droid_bah_5.png','droid_bah_6.png','droid_bah_7.png','droid_bah_8.png','droid_bah_9.png',
'droid_bah_10.png','droid_bah_11.png','droid_bah_12.png','droid_bah_13.png']
for img in droid_list:
droid_bah.append(pygame.image.load(path.join(img_dir, img)).convert())
buh_droid_anim = {}
buh_droid_anim['lg'] = []
for i in range(14):
filename = 'droid_bah_{}.png'.format(i)
img = pygame.image.load(path.join(img_dir, filename)).convert()
img.set_colorkey(BLACK)
img_lg = pygame.transform.scale(img, (80, 120))
buh_droid_anim['lg'].append(img_lg)
Вот само событие которое и формирует эту анимация
hits = pygame.sprite.groupcollide(mobs, bullets, True, True)
if hits:
score = score + 1
if basta == 1: #Число поподанив моба
trus = True
#Событие вызывающие спрайт взрвыва
expl = buh(hit.rect.center, 'lg')
all_sprites.add(expl)
GeneratorMob()
else:
trus = False
В общем событие само по себе как понимаю работает так как “ведроиды” исчезают после того как спрайты пуль в них попадают. Но вот после того как спрайт ведроида исчез спрайт анимации взрыва на включается по чему уже затерялся в догадках на столько что понять не могу как так получается.
Вот сама игра полностью что бы было картина целиком понятна.
WIDTH = 1400 # Длина сцены
HEIGHT = 750 #Ширина сцены
FPS = 60
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
from os import path
#папки с медия файлами
img_dir = path.join(path.dirname(__file__), 'img')
snd_dir = path.join(path.dirname(__file__), 'snd')
pygame.init()
#pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Игра!")
clock = pygame.time.Clock()
font_name = pygame.font.match_font('arial')
#Функция отрисовки
#Функция отрисовки
def draw_text(surf, text, size, x, y):
font = pygame.font.Font(font_name, size)
text_surface = font.render(text, True, WHITE)
text_rect = text_surface.get_rect()
text_rect.midtop = (x, y)
surf.blit(text_surface, text_rect)
#Функция отрисовки здоровья
def draw_shield_bar(surf, x, y, pct):
if pct < 0:
pct = 0
BAR_LENGTH = 100
BAR_HEIGHT = 10
fill = (pct / 100) * BAR_LENGTH
outline_rect = pygame.Rect(x, y, BAR_LENGTH, BAR_HEIGHT)
fill_rect = pygame.Rect(x, y, fill, BAR_HEIGHT)
pygame.draw.rect(surf, GREEN, fill_rect)
pygame.draw.rect(surf, WHITE, outline_rect, 2)
def GeneratorMob():
m = clasiki.Mob()
all_sprites.add(m)
mobs.add(m)
#Спрайт отвечате за взрыывы сломаных ведройдов и не только
class buh(pygame.sprite.Sprite):
def __init__(self, center, size):
pygame.sprite.Sprite.__init__(self)
self.size = size
self.image = buh_droid_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(buh_droid_anim[self.size]):
self.kill()
else:
center = self.rect.center
self.image = buh_droid_anim[self.size][self.frame]
self.rect = self.image.get_rect()
self.rect.center = center
class Player(pygame.sprite.Sprite):
def __init__(self):
#Здоровье перса
self.speedx = 0
self.shield = hp
pygame.sprite.Sprite.__init__(self)
self.image = pygame.transform.scale(plai_dron_img, (80, 120))
self.image.set_colorkey(BLACK)
self.rect = self.image.get_rect()
self.rect.centerx = WIDTH / 2
self.rect.bottom = HEIGHT - 200
self.speedx = 0
def update(self):
#Перемещение в пространсве перса
self.speedx = 0
keystate = pygame.key.get_pressed()
if keystate[pygame.K_LEFT]:
self.speedx = -8
if keystate[pygame.K_RIGHT]:
self.speedx = 8
self.rect.x += self.speedx
if keystate[pygame.K_DOWN]:
self.speedy = +8
self.rect.y += self.speedy # +
if keystate[pygame.K_UP]:
self.speedy = -8
self.rect.y += self.speedy # +
#Границы которые не может перс преодолеть
#Левая правая старона
if self.rect.right > WIDTH:
self.rect.right = WIDTH
if self.rect.left < 0:
self.rect.left = 0
#Верх низ
if self.rect.top > HEIGHT:
self.rect.top = HEIGHT
if self.rect.bottom > HEIGHT :
self.rect.bottom = HEIGHT
#------------------------------------------------------
#Функция выстрелов
# Стрельба в верх
def shoot(self):
bullet = clasiki.Bullet(self.rect.centerx, self.rect.top)
all_sprites.add(bullet)
bullets.add(bullet)
#--------------------------------------------------------
#Важные переменные
#-----------------------------------------------------------
score = 0 #Начальный счёт игры
basta = 0 #Попадания в боса
trus = False # Права жизни босса
gol = 0
hp = 100
lastMove = 'right'
#----------------------------------------------------------
#Медяга
plai_dron_img = pygame.image.load(path.join(img_dir, "plai_dron.png")).convert()
clasiki.bot_dron_img = pygame.image.load(path.join(img_dir, "bot_dron.png")).convert()#####
background = pygame.image.load(path.join(img_dir, 'otsek.png')).convert() #Изображенилакации
#Анимация взырвов ведройдов
droid_bah = []
droid_list = ['droid_bah_0.png','droid_bah_1.png','droid_bah_2.png','droid_bah_3.png','droid_bah_4.png',
'droid_bah_5.png','droid_bah_6.png','droid_bah_7.png','droid_bah_8.png','droid_bah_9.png',
'droid_bah_10.png','droid_bah_11.png','droid_bah_12.png','droid_bah_13.png']
for img in droid_list:
droid_bah.append(pygame.image.load(path.join(img_dir, img)).convert())
buh_droid_anim = {}
buh_droid_anim['lg'] = []
for i in range(14):
filename = 'droid_bah_{}.png'.format(i)
img = pygame.image.load(path.join(img_dir, filename)).convert()
img.set_colorkey(BLACK)
img_lg = pygame.transform.scale(img, (80, 120))
buh_droid_anim['lg'].append(img_lg)
#-----------------------------------------------------------------------------
#Perehod_A
background_rect = background.get_rect()
all_sprites = pygame.sprite.Group()
##
mobs = pygame.sprite.Group()
creepyK = pygame.sprite.Group() #
bullets = pygame.sprite.Group()
Perehod_B_K = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
#bullet = clasiki.bullet()
#---------------------------------------
"""
bullet = clasiki.Bullet(self.rect.centerx, self.rect.top)
all_sprites.add(bullet)
bullets.add(bullet) """
#-----------------------------------------
for i in range(8): #колличество астеройдов
GeneratorMob()
for i in range(1): #Вызов стены жути ( 1 штука)
creepy = clasiki.creepy()
all_sprites.add(creepy)
creepyK.add(creepy)
for i in range(1): #Вызов портала ( 1 штука)
K = clasiki.Perehod_B()
all_sprites.add(K)
Perehod_B_K.add(K)
# Цикл игры
running = True
while running:
# Держим цикл на правильной скорости
clock.tick(FPS)
# Ввод процесса (события)
for event in pygame.event.get():
# проверка для закрытия окна
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
player.shoot()
#Приблизительно
# Обновление
all_sprites.update()
""" Образец
# проверьте, не попала ли пуля в моб
hits = pygame.sprite.groupcollide(mobs, bullets, True, True)
for hit in hits:
score += 50 - hit.radius
random.choice(expl_sounds).play()
expl = Explosion(hit.rect.center, 'lg')
all_sprites.add(expl)
newmob()
"""
hits = pygame.sprite.groupcollide(mobs, bullets, True, True)
if hits:
score = score + 1
if basta == 1: #Число поподанив моба
trus = True
#Событие вызывающие спрайт взрвыва
expl = buh(hit.rect.center, 'lg')
all_sprites.add(expl)
GeneratorMob()
else:
trus = False
# Проверка, не ударил ли враг игрока
hits = pygame.sprite.spritecollide(player, mobs, False)
if hits:
#После удара отнимается житуха перса
player.shield -= 1
#GeneratorMob()
if player.shield <= 0:
running = False
# Проверка, не ударил ли перс жуть игрока
hits = pygame.sprite.spritecollide(player, creepyK, False)
if hits:
running = False
# Проверка, не ударил ли перс портал игрока
hits = pygame.sprite.spritecollide(player, Perehod_B_K, False)
if hits:
game_2() #Перекидывается на 2 сцену
# Рендеринг
screen.fill(BLACK)
screen.blit(background, background_rect)
all_sprites.draw(screen)
#screen.blit(background, background_rect)
all_sprites.draw(screen)
#Отрисовка всякого
draw_text(screen, str(score), 18, WIDTH / 1.1, 70)
draw_shield_bar(screen, 5, 70., player.shield)
draw_text(screen, str("1"), 20, WIDTH / 10, 95)
draw_text(screen, str("Уровень"), 18, WIDTH / 10, 80)
draw_text(screen, str("Жизнь"), 18, WIDTH / 10, 45)
draw_text(screen, str("Очки уровня"), 18, WIDTH / 1.1, 45)
# После отрисовки всего, переворачиваем экран
pygame.display.flip()
# Новый урвень по достежению первго уровня