Анимация Линка

Сначала нужно добавить действие и кнопку. На атаку будет стоять кнопка "Пробел". Пропишем это в player.py:

if keys[pygame.K_SPACE] and not self.attacking:
    self.attacking = True

Непонятно, что такое self.attacking. В демоны файла я добавил три параметра: статус атаки (self.attacking = False), кулдаун после атаки (self.attack_cooldown = 400) и время атаки (self.attack_time = None).

Добавим время между атаками. После успешной атаки создадим конструкцию: self.attack_time = pygame.time.get_ticks() сразу после объявление атаки флагом True. Далее перейдём к настройке нового метода cooldowns. Сам метод:

def cooldowns(self):
    current_time = pygame.time.get_ticks()

    if self.attacking:
        if current_time - self.attack_time >= self.attack_cooldown:
            self.attacking = False

Конструкция очень проста. Если разница во времени после нажатия меньше кулдауна атаки (в моём случае 400 мс), запрещать атаку. Не забудьте закинуть функцию cooldowns в update-функцию.

Далее, пропишем метод import_player_assets:

def import_player_assets(self):
    character_path = '../graphic/Link/'
    self.animations = {'up': [], 'down': [], 'left': [], 'right': [],
    'right_idle': [], 'left_idle': [], 'up_idle': [], 'down_idle': [],
    'right_attack': [], 'left_attack': [], 'up_attack': [], 'down_attack': []}

В нём прописаны все возможности передвижения. Они лежат в папке "Link":

Не забудьте закинуть в базовых демонов Player-класса наши ассеты: self.import_player_assets(). Далее, "пробежимся" по нашим папкам благодаря методу import_folder в support.py:

Сейчас мы можем открыть все файлы, но есть дополнительная проблема — нужно прописать статусы и анимации при нажатии на кнопку. Статус по умолчанию укажем в демоне и по умолчанию Линк будет смотреть вниз (self.status = 'down'). Но этого мало. Нужно получать статус автоматически, а это значит новый метод:

Прописываем название файла "стояния" героя. Стояние — _idle, а статус будет меняться от нажатия кнопок. Закидываем get_status() в update-метод.

Пропишем статусы для наших методов хождения:

Тут всё достаточно прозрачно. Движение = статусу. Подправим функцию статуса:

Если мы отпускаем кнопку — статус равен idle, а если держим просто название направления.

Теперь окончательно проапгрейдим код для атак и комбинаций с "_idle":

Наконец, заанимируем Линка. Установим два новых демона self.frame_index = 0 — индекс первой картинки и скорость смены картинок — self.animation_speed = 0.15. Затем создадим метод animate():

Сейчас мы перебираем все наши картинки и главное — их зациклить, как в рилсах. Не забываем в update-функцию self.animate().

Тут у меня залогала анимация атаки, так как кнопка продолжала нажиматься. Исправим это в input-методе:

Итог:

Далее прорисуем оружие. Файлы этого этапа.

Last updated