Menu
CoddyTech

Частица

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

Искры, пыль, дым и конфетти состоят из частиц: множества крошечных объектов, которые разлетаются, недолго существуют и исчезают. Для одной частицы нужно всего несколько чисел: где она находится, насколько перемещается за каждый кадр и сколько кадров ей осталось жить. Их можно хранить в словаре:

{"x": 240, "y": 180, "vx": 2, "vy": -3, "life": 30}

vx и vy — это её скорость: 2 пикселя вправо и 3 вверх за каждый кадр. Храни все частицы в одном списке, и каждый кадр перемещай их все и отнимай по одному кадру от времени их жизни:

for p in particles:
    p["x"] += p["vx"]
    p["y"] += p["vy"]
    p["life"] -= 1

Пока время жизни каждой частицы больше 0, рисуй её в виде маленького круга:

for p in particles:
    if p["life"] > 0:
        pygame.draw.circle(screen, (255, 160, 60), (p["x"], p["y"]), 3)

У частицы нет изображения и нет класса. Она требует мало ресурсов, поэтому в игре одновременно могут находиться сотни частиц.

challenge icon

Задание

Легко

Заставь серый излучатель посередине выстрелить искрой:

  1. При нажатии Space добавь {"x": 240, "y": 180, "vx": 2, "vy": -3, "life": 30} в particles.
  2. В каждом кадре перемещай каждую частицу на значение её vx и vy, а её life уменьшай на 1.
  3. Отрисовывай каждую частицу, время жизни которой больше 0, оранжевым кругом (255, 160, 60) радиусом 3.

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

import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Sparks")
clock = pygame.time.Clock()

particles = []

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    screen.fill((30, 30, 46))
    pygame.draw.circle(screen, (120, 120, 140), (240, 180), 8)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

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

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