Вспышка при попадании
Часть раздела Звук и игровые ощущения путешествия по 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. Во многих играх игрок при получении урона вспыхивает красным; для этого используется такой же счётчик.
Задание
ЛегкоНажатие пробела поражает красного врага и уменьшает его HP. Сделай так, чтобы при каждом попадании он мигал:
- Перед циклом задай
flash = 0. - При попадании задай
flash = 6. - Каждый кадр уменьшай
flashна 1, пока оно больше 0. - Рисуй врага белым цветом
(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()
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Звук и игровые ощущения
4Тряска экрана и вспышка при попадании
Тряска экранаВспышка при попаданииОстановка при попаданииСоблюдайте умеренность6Доведём «Звёздный патруль» до блеска
Звуки «Звёздного патруля»Искры при каждом попаданииПотренируйтесь самостоятельно: Песочница Pygame