Cách thêm hiệu ứng đặc biệt cho game được phát triển bằng Pygame

Bạn có thể làm sinh động những game đơn giản nhất bằng các hiệu ứng particle động. Mô phỏng chuyển động, vụ nổ và nhiều hơn thế nữa bằng những kỹ thuật dưới đây.

Tạo hiệu ứng đặc biệt cho Pyame

Pygame là một thư viện phổ biến để phát triển game bằng Python. Trong khi xây dựng game, thêm hiệu ứng đặc biệt có thể nâng cao đáng kể sức hấp dẫn về mặt hình ảnh và trải nghiệm tổng thể cho người chơi.

Các hệ thống particle là một kỹ thuật mạnh mẽ cho việc tạo hiệu ứng thú vị trực quan và sinh động như đám mây bụi, vụ nổ, sương mù…

Tạo game đơn giản

Trước khi đi sâu vào những hệ thống particle và cải tiến hình ảnh, hãy bắt đầu bằng cách tạo một game đơn giản bằng Pygame. Tạo file mới tên simple-game.py, và bắt đầu bằng việc nhập các thư viện cần thiết, rồi khởi tạo Pygame. Thiết lập cửa sổ game với chiều rộng và cao được chỉ định.

Bên trong vòng lặp game chính, xử lý sự kiện người dùng và update vị trí của người chơi dựa trên thao tác nhấn phím. Vẽ một hình chữ nhật cho đối tượng người chơi bằng pygame.draw.rect().

Cuối cùng, update cửa sổ game bằng pygame.display.flip() và thoát game khi người chơi thoát vòng lặp. Game đơn giản này sẽ đóng vai trò là nền tảng để thêm hiệu ứng đặc biệt bằng các hệ thống particle.

Bạn sẽ thấy một hình vuông màu trắng đại diện cho người chơi mà bạn có thể di chuyển sang trái và phải:

Hình vuông màu trắng đại diện cho người chơi

Tạo các kiểu particle khác nhau

Giờ bạn đã có thiết lập game đơn giản, bạn có thể thêm các hệ thống particle khác nhau. Tạo class particle cho mỗi hiệu ứng và class hệ thống particle để quản lý & update particle.

Hiệu ứng particle khi người chơi đang di chuyển

Hiệu ứng particle đầu tiên sẽ là một vệt các hạt bụi bay ra từ đằng sau của người chơi khi họ bắt đầu di chuyển bằng cách dùng chuột hoặc bàn phím. Ngoài ra, hướng các hạt bụi sẽ thay đổi khi người chơi chuyển hướng.

Xác định một class Particle đại diện cho một phân tử riêng lẻ. Mỗi particle có vị trí ban đầu riêng (x & y), vận tốc ngẫu nhiên (dx & dy) và vòng đời xác định thời gian particle đó tồn tại.

Ngoài ra, xác định một class ParticleSystem quản lý bộ sưu tập particle. Bạn có thể thêm particle mới cho hệ thống này bằng phương thức add_particle(). Hàm update() cập nhật tất cả các particle trong hệ thống và loại bỏ particle đã tới cuối chu kỳ của chúng.

# Class Particle
class Particle:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.dx = random.uniform(-1, 1)
        self.dy = random.uniform(-1, 1)
        self.lifetime = 60 

    def update(self):
        self.x += self.dx
        self.y += self.dy
        self.lifetime -= 1

    def draw(self, window):
        color = (200, 200, 200)
        position = (int(self.x), int(self.y))
        pygame.draw.circle(window, color, position, 2)

# Class hệ thống Particle 
class ParticleSystem:
    def __init__(self):
        self.particles = []

    def add_particle(self, x, y):
        self.particles.append(Particle(x, y))

    def update(self):
        for particle in self.particles:
            particle.update()

            if particle.lifetime <= 0:
                self.particles.remove(particle)

    def draw(self, window):
        for particle in self.particles:
            particle.draw(window)

Để tích hợp hệ thống particle vào game, bạn cần tạo một số chỉnh sửa cho vòng lặp game chính. Tạo file mới tên movement-particles.py và thêm code với những update bên dưới:

# Tạo hệ thống particle 
particle_system = ParticleSystem()

# Vòng lặp game chính
running = True
clock = pygame.time.Clock()

while running:
    dt = clock.tick(60) / 1000.0

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

    particle_y = player_y + player_height // 2
    particle_x = player_x + player_width

    keys = pygame.key.get_pressed()
    boundary = player_x < window_width - player_width

    if keys[pygame.K_LEFT] and player_x > 0:
        player_x -= 5
        particle_system.add_particle(particle_x, particle_y)

    if keys[pygame.K_RIGHT] and boundary:
        player_x += 5
        particle_system.add_particle(player_x, particle_y)

    particle_system.update()

    window.fill(BLACK)
    player_pos = (player_x, player_y, player_width, player_height)
    pygame.draw.rect(window, WHITE, player_pos)
    particle_system.draw(window)

    pygame.display.flip()

# Thoát game
pygame.quit()

Giờ khi di chuyển đối tượng người chơi, bạn sẽ thấy các particle nhấn mạnh chuyển động:

Hiệu ứng cho Pygame

Hiệu ứng nổ

Hiệu ứng particle tiếp theo sẽ là hiệu ứng nổ xảy ra khi người chơi bắn đạn. Hiệu ứng nổ sẽ bao gồm các particle màu đỏ bắn ra từ vị trí của viên đạn.

Xác định class Particle tương tự hướng dẫn trước đó, nhưng lần này bao gồm một tham số color để đại diện cho màu sắc của particle.

Ngoài ra, update class ParticleSystem để xử lý kiểu particle mới. Phương thức add_particle() giờ nhận tham số color bổ sung và tạo các particle với màu sắc cụ thể.

# Class Particle 
class Particle:
    def __init__(self, x, y, color):
        self.x = x
        self.y = y
        self.dx = random.uniform(-2, 2)
        self.dy = random.uniform(-2, 2)
        self.lifetime = 30
        self.color = color

    def update(self):
        self.x += self.dx
        self.y += self.dy
        self.lifetime -= 1

    def draw(self, window):
        position = (int(self.x), int(self.y))
        pygame.draw.circle(window, self.color, position, 3)

# Class hệ thống Particle 
class ParticleSystem:
    def __init__(self):
        self.particles = []

    def add_particle(self, x, y, color):
        self.particles.append(Particle(x, y,color)

    def update(self):
        for particle in self.particles:
            particle.update()

            if particle.lifetime <= 0:
                self.particles.remove(particle)

    def draw(self, window):
        for particle in self.particles:
            particle.draw(window)

Để tích hợp hiệu ứng blass vào game, bạn cần thực hiện một số chỉnh sửa cho vòng lăp game chính. Tạo file mới tên shoot-particle.py và thêm code cùng những update bên dưới:

# Tạo hệ thống particle
particle_system = ParticleSystem()

# Vòng lặp game chính
running = True
clock = pygame.time.Clock()

while running:
    dt = clock.tick(60) / 1000.0

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

    keys = pygame.key.get_pressed()
    boundary = player_x < window_width - player_width

    if keys[pygame.K_LEFT] and player_x > 0:
        player_x -= 5

    if keys[pygame.K_RIGHT] and boundary:
        player_x += 5

    if keys[pygame.K_SPACE]:
        bullet_x = player_x + player_width // 2
        bullet_y = player_y
        particle_system.add_particle(bullet_x, bullet_y, RED)

    particle_system.update()

    window.fill(BLACK)
    player_pos = (player_x, player_y, player_width, player_height)
    pygame.draw.rect(window, WHITE, player_pos)
    particle_system.draw(window)

    pygame.display.flip()

# Thoát game
pygame.quit()

Kết quả:

Tạo hiệu ứng phân tử cho game Pygame

Khi nhấn phím cách (pygame.K_SPACE), thêm particle vào hệ thống particle ở vị trí của viên đạn. Điều này tạo hiệu ứng nổ với những hạt màu đỏ.

Hiệu ứng bụi

Cải tiến hình ảnh cuối cùng mà bạn có thể thực hiện là hiệu ứng background bụi bặm. Hiệu ứng bụi sẽ bao gồm các phân tử màu xám nhỏ di chuyển theo hình tròn, tạo background động và bụi bặm.

Update class Particle để bao gồm angle (góc) & speed (tốc độ) cho mỗi particle. Angle xác định hướng chuyển động, speed kiểm soát tốc độ di chuyển của các particle theo hình tròn. Chỉnh sửa phương thức update() để cập nhật vị trí của mỗi particle dựa trên góc và tốc độ của nó.

Ngoài ra, update class ParticleSystem để xử lý hoạt động của particle mới. Các particle giờ di chuyển theo vòng tròn bên trong cửa sổ game.

# Class Particle 
class Particle:
    def __init__(self, x, y, radius):
        self.x = x
        self.y = y
        self.radius = radius
        self.angle = random.uniform(0, 2 * math.pi)
        self.speed = random.uniform(0.5, 1.5)

    def update(self):
        self.angle += 0.02
        self.x += math.cos(self.angle) * self.speed
        self.y += math.sin(self.angle) * self.speed

        if self.x < 0:
            self.x = window_width
        elif self.x > window_width:
            self.x = 0

        if self.y < 0:
            self.y = window_height
        elif self.y > window_height:
            self.y = 0

    def draw(self, window):
        color = (128, 128, 128)
        pos = (int(self.x), int(self.y))
        radius = int(self.radius)
        pygame.draw.circle(window, color, pos, radius)

# Class hệ thống Particle
class ParticleSystem:
    def __init__(self):
        self.particles = []

    def add_particle(self, x, y, radius):
        self.particles.append(Particle(x, y, radius))

    def update(self):
        for particle in self.particles:
            particle.update()

    def draw(self, window):
        for particle in self.particles:
            particle.draw(window)

Để tích hợp hiệu ứng bụi vào game, bạn cầm thực hiện một số chỉnh sửa cho vòng lặp game chính. Tạo file mới tên dust-particle.py và thêm code với những update bên dưới:

# Tạo hiệu ứng hạt bụi
particle_system = ParticleSystem()

# Vòng lặp game chính
running = True
clock = pygame.time.Clock()

while running:
    dt = clock.tick(60) / 1000.0

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

    particle_x = random.randint(0, window_width)
    particle_y = random.randint(0, window_height)

    particle_system.add_particle(particle_x, particle_y, 1)

    particle_system.update()

    window.fill((0, 0, 0))
    particle_system.draw(window)

    pygame.display.flip()

# Thoát game
pygame.quit()

Thêm ngẫu nhiên particle vào cửa sổ game bằng hàm random.randint(). Mỗi particle có bán kính ban đầu bằng 1. Update và vẽ hệ thống particle trên cửa sổ game, tạo hiệu ứng background hạt bụi sinh động.

Bạn sẽ thấy nhiều hạt phân tử trên màn hình, di chuyển ngẫu nhiên nhưng mượt mà:

Một ví dụ hiệu ứng hạt trong Pygame

Trên đây là cách thêm hiệu ứng particle vào game bằng thư viện Pygame. Hi vọng bài viết hữu ích với các bạn.

Thứ Năm, 13/07/2023 09:57
51 👨 385
0 Bình luận
Sắp xếp theo
    ❖ Python