Menu
CoddyTech

Một đợt hạt

Thuộc phần Âm thanh và cảm giác chơi trong hành trình Pygame của Coddy. Bài học 9 trên 23.

Một hạt là một chấm. Một đợt bùng phát gồm nhiều hạt được tạo ra trong cùng một khung hình tại cùng một điểm, mỗi hạt bay theo một hướng riêng. Tạo chúng bằng vòng lặp for và gán cho mỗi hạt một vận tốc ngẫu nhiên:

for i in range(20):
    particles.append({
        "x": x,
        "y": y,
        "vx": random.uniform(-3, 3),
        "vy": random.uniform(-3, 3),
        "life": random.randint(20, 40),
    })

random.uniform(-3, 3) là một số thập phân ngẫu nhiên từ -3 đến 3, nên hạt có thể di chuyển theo bất kỳ hướng nào, chậm hoặc nhanh. randint chỉ cho số nguyên, khiến các hạt trong đợt bùng phát bay theo một vài đường thẳng.

Các lệnh gọi tạo số ngẫu nhiên phải nằm bên trong vòng lặp. Nếu gán vx một lần trước vòng lặp, cả 20 hạt sẽ có cùng vận tốc: chúng bay cùng nhau thành một chấm.

Thời gian sống ngẫu nhiên khiến đợt bùng phát mờ dần không đồng đều, trông tự nhiên hơn: những hạt chậm gần giữa và những hạt nhanh ở rìa biến mất vào các thời điểm khác nhau.

Lần nhấp chuột tạo ra sự kiện pygame.MOUSEBUTTONDOWN, còn event.pos là vị trí được nhấp.

challenge icon

Thử thách

Trung bình

Biến hạt đơn lẻ thành một chùm hạt bắn ra.

  1. Khi nhấp chuột, thêm 20 hạt vào điểm vừa nhấp.
  2. Gán cho mỗi hạt vx và vy giá trị từ random.uniform(-3, 3), cùng với giá trị life lấy từ random.randint(20, 40).

Nhấn Chơi rồi nhấp chuột: các tia sáng bắn ra mọi hướng. Sau đó nhấn Kiểm tra.

Tự làm thử

import random
import pygame

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

particles = []

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            x, y = event.pos
            particles.append({"x": x, "y": y, "vx": 0, "vy": -2, "life": 30})

    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, 160, 60), (p["x"], p["y"]), 3)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Tất cả bài học trong Âm thanh và cảm giác chơi

Tự luyện tập: Playground Pygame