Menu
CoddyTech

Вспышка при попадании

Часть раздела Звук и игровые ощущения путешествия по Pygame на Coddy. Урок 13 из 23.

Когда ты попадаешь по врагу, игра должна сразу это показать, ещё до изменения полоски здоровья. Обычно для этого используют вспышку при попадании: в течение нескольких кадров враг рисуется полностью белым.

Для этого нужен один счётчик — количество кадров, в течение которых длится вспышка. Попадание задаёт его значение, а на каждом кадре оно уменьшается:

flash = 0
...
# попадание
hp -= 1
flash = 6
...
# каждый кадр
if flash > 0:
    flash -= 1

При отрисовке счётчик определяет цвет:

if flash > 0:
    pygame.draw.rect(screen, (255, 255, 255), enemy)
else:
    pygame.draw.rect(screen, (220, 80, 80), enemy)

Шесть кадров — это десятая доля секунды: достаточно долго, чтобы заметить вспышку, и достаточно коротко, чтобы при следующем попадании она могла вспыхнуть снова. Игрок сразу видит, что атака попала в цель.

Спрайт с изображением может вспыхивать так же: храни белую копию изображения или заливай белым его копию, а пока счётчик отсчитывает кадры, выводи её с помощью blit. Во многих играх игрок при получении урона вспыхивает красным; для этого используется такой же счётчик.

challenge icon

Задание

Легко

Нажатие пробела поражает красного врага и уменьшает его HP. Сделай так, чтобы при каждом попадании он мигал:

  1. Перед циклом задай flash = 0.
  2. При попадании задай flash = 6.
  3. Каждый кадр уменьшай flash на 1, пока оно больше 0.
  4. Рисуй врага белым цветом (255, 255, 255), пока flash больше 0, и красным в противном случае.

Попробуйте сами

import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Training Dummy")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

hit_sound = pygame.mixer.Sound("assets/sounds/hit.ogg")
player = pygame.Rect(120, 150, 60, 60)
enemy = pygame.Rect(300, 150, 60, 60)
hp = 5

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE and hp > 0:
            hp -= 1
            hit_sound.play()

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (80, 160, 255), player)
    if hp > 0:
        pygame.draw.rect(screen, (220, 80, 80), enemy)
    label = font.render(f"Enemy HP: {hp}", True, (240, 240, 240))
    screen.blit(label, (300, 110))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Звук и игровые ощущения

Потренируйтесь самостоятельно: Песочница Pygame