Анимация спрайтов или тесты на пёсиках

Пришло время оживить спрайты, в нашем мини-движке (ссылка ниже для тех, кому интересны статичные котики)

Основу для работы анимации мы подготовили, и вот какая получилась логика:

При создании объекта (спрайта) задается целевая папка, в которой лежат картинки, а также флажок - анимированный спрайт или нет.

Возьмем в этот раз не статных котиков, а милых собачек из интернета и подготовим наши кадры (линия для выравнивания по носику):

Анимация спрайтов или тесты на пёсиках

Заливаем в папку в формате bmp и переименовываем в сухие порядковые номера. Создаем нашего первого анимированного актора:

sprite1 = SPRITE(folder_path = "PythonGame\Sprites\Doge", w = 100, h = 100, pos_x = 0, pos_y = 0, animate = True) #testing game sprite

И смотрим, какой результат у нас вышел (на самом деле повылезало куча багов в работе некоторых функций - успешно устранены):

Не слишком хорошо - всего 4 фрейма, которые сменяют друг друга со скоростью нашего FPS. Неплохо бы контролировать скорость смены кадров для спрайта, чтобы игра не вызывала приступы паники.

Скорость будем задавать в конструкторе класса, а управлять сменой кадров через функцию Tick, которая вызывается каждый фрейм:

class SPRITE(): # basic class for sprite | takes image, can be animated, resizable, movable def __init__(self, folder_path = "PythonGame\Sprites\Default", w = 300, h = 300, pos_x = 0, pos_y = 0, animate = False, ticks_for_frame = 1): #... def Tick(self): # will be called every frame | updates animations if (self.anim): self.__UpdateAnim() def __UpdateAnim(self): # updates animation | takes selected path to apply images from it if (self.tick_for_frame_current >= self.tick_for_frame_base): self.tick_for_frame_current = 1 if(self.anim): try: self.__ApplyImage(self.image_num + 1) except: self.image_num = 1 self.__ApplyImage(self.image_num) else: self.tick_for_frame_current += 1

Одна шиба - это хорошо, но веселее им в стайке, так что создадим сразу 5 собакенов, но, чтобы это было не впустую, протестируем на них частоту обновления кадров:

doge1 = SPRITE(folder_path = "PythonGame\Sprites\Doge", w = 100, h = 100, pos_x = 0, pos_y = 0, animate = True, ticks_for_frame = 1) #testing game sprite doge2 = SPRITE(folder_path = "PythonGame\Sprites\Doge", w = 100, h = 100, pos_x = 110, pos_y = 0, animate = True, ticks_for_frame = 2) #testing game sprite doge3 = SPRITE(folder_path = "PythonGame\Sprites\Doge", w = 100, h = 100, pos_x = 220, pos_y = 0, animate = True, ticks_for_frame = 4) #testing game sprite doge4 = SPRITE(folder_path = "PythonGame\Sprites\Doge", w = 100, h = 100, pos_x = 330, pos_y = 0, animate = True, ticks_for_frame = 8) #testing game sprite doge5 = SPRITE(folder_path = "PythonGame\Sprites\Doge", w = 100, h = 100, pos_x = 440, pos_y = 0, animate = True, ticks_for_frame = 16) #testing game sprite

Запускаем, получаем!

Вот и все на сегодня, далее перейдем к обработке событий и коллизии)

1.1K1.1K показов
161161 открытие
Начать дискуссию