Затухание и уменьшение
Часть раздела Звук и игровые ощущения путешествия по Pygame на Coddy. Урок 10 из 23.
Искра, которая не меняется, пока не исчезнет, выглядит как выключенная точка. Настоящие искры остывают: они уменьшаются и меняют цвет, когда гаснут. У тебя уже есть число для этого — life частицы. Вычисляй по нему размер и цвет при отрисовке.
Радиус может напрямую зависеть от времени жизни:
radius = p["life"] // 10 + 1Если осталось 40 кадров, радиус будет равен 5; если осталось 9 кадров или меньше — 1. + 1 не даёт радиусу стать меньше 1: окружность радиусом 0 ничего не рисует, и искра исчезла бы раньше времени.
Для цвета выбери один из нескольких оттенков — от горячего к холодному:
if p["life"] > 25:
color = (255, 220, 80)
elif p["life"] > 10:
color = (255, 140, 40)
else:
color = (180, 50, 40)Сначала проверяй самое большое значение. Если написать условия в обратном порядке, life > 10 сработает и для значения 30, и до жёлтой ветки дело никогда не дойдёт.
Задание
СреднеНажатие пробела создает кольцо из 8 искр, каждая из которых живет 40 кадров. Пусть они остывают по мере полета:
- Рисуй каждую искру с радиусом
life // 10 + 1. - Окрашивай ее в желтый
(255, 220, 80), пока время ее жизни больше 25, в оранжевый(255, 140, 40), пока оно больше 10, а затем — в темно-красный(180, 50, 40).
Попробуйте сами
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Ring of Sparks")
clock = pygame.time.Clock()
DIRECTIONS = [(3, 0), (2, 2), (0, 3), (-2, 2), (-3, 0), (-2, -2), (0, -3), (2, -2)]
particles = []
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:
for vx, vy in DIRECTIONS:
particles.append({"x": 240, "y": 180, "vx": vx, "vy": vy, "life": 40})
for p in particles:
p["x"] += p["vx"]
p["y"] += p["vy"]
p["life"] -= 1
screen.fill((20, 20, 36))
for p in particles:
if p["life"] > 0:
pygame.draw.circle(screen, (255, 220, 80), (p["x"], p["y"]), 4)
pygame.display.flip()
clock.tick(60)
pygame.quit()
Все уроки раздела Звук и игровые ощущения
4Тряска экрана и вспышка при попадании
Тряска экранаВспышка при попаданииОстановка при попаданииСоблюдайте умеренность6Доведём «Звёздный патруль» до блеска
Звуки «Звёздного патруля»Искры при каждом попаданииПотренируйтесь самостоятельно: Песочница Pygame