Cách triển khai Parallax Scrolling trong Python Arcade

Thêm hiệu ứng hình ảnh vào game có thể nâng cao trải nghiệm đáng kể cho người chơi, khiến game hấp dẫn hơn. Một trong số kỹ thuật phổ biến để đạt được điều này là parallax scrolling.

Lập trình game

Parallax scrolling tạo ảo giác về chiều sâu bằng cách di chuyển nhiều lớp ảnh hoặc đối tượng ở tốc độ khác nhau, tạo cảm giác đắm chìm trong thế giới game. Triển khai hiệu ứng parallax scrolling trong game bằng thư viện Arcade không chỉ dễ mà còn thêm tính chuyên nghiệp cho dự án.

Tạo game đơn giản

Trước khi bắt đầu, đảm bảo bạn đã cài pip trên thiết bị. Dùng lệnh này để cài thư viện arcade:

pip install arcade

Sau đó, tạo một game đơn giản bằng thư viện Arcade. Trong game này, người chơi có thể di chuyển sang trái và phải. Game sẽ có các nền tảng cho người chơi tương tác.

Tập lệnh simple-game.py xác đinh class Player kế thừa từ class arcade.Sprite. Nó đặt vị trí ban đầu và các biến di chuyển cho người chơi. Code này cũng bao gồm một class Platform đại diện cho những nền tảng hình chữ nhật. Mỗi nền tảng có vị trí, kích thước và màu sắc cụ thể.

Class MyGame chịu trách nhiệm cho việc thiết lập game, bao gồm tạo người chơi và nền tảng, xử lý vẽ hình, update và các sự kiện đầu vào.

Đây là một game platform cơ bản ở thời điểm này:

Tạo game đơn giản bằng Python

Thiết lập Layer

Để đạt được hiệu ứng parallax scrolling, tạo các lớp di chuyển ở tốc độ khác nhau. Ví dụ, tạo 5 lớp. Mỗ lớp sẽ có tốc độ cuộn khác nhau để tạo cảm giác chiều sâu.

class Layer(arcade.SpriteList):
    def __init__(self, scroll_speed):
        super().__init__()
        self.scroll_speed = scroll_speed

class MyGame(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        arcade.set_background_color(arcade.color.WHITE)
        self.player = None
        self.platforms = None
        self.layers = []

    def setup(self):
        self.player = Player()
        self.platforms = arcade.SpriteList()
        gray = arcade.color.GRAY
        red = arcade.color.RED
        brown = arcade.color.BROWN
        yellow = arcade.color.YELLOW

        w = SCREEN_WIDTH // 2
        h = SCREEN_HEIGHT // 2

        self.platforms.append(Platform(w, h - 100, 200, 20, yellow))
        self.platforms.append(Platform(w, h + 100, 200, 20, yellow))

        layers_data = [
            (Layer(0.2), Platform(w, h, 800, 600, gray)),
            (Layer(0.5), Platform(w, h - 200, 400, 20, red)),
            (Layer(0.5), Platform(w, h + 200, 400, 20, red)),
            (Layer(1.0), Platform(w, h - 300, 200, 20, brown)),
            (Layer(1.0), Platform(w, h + 300, 200, 20, brown))
        ]

        for layer, platform in layers_data:
            layer.append(platform)
            self.layers.append(layer)

    # Phần còn lại của code vẫn giữ nguyên

Triển khai Parallax Scrolling

Để triển khai parallax scrolling, cập nhật vị trí của từng layer dựa trên tốc độ cuộn và di chuyển của người chơi. Tạo file mới tên parallax-scrolling.py và thêm code cùng những update bên dưới:

class MyGame(arcade.Window):
    # ...

    def on_draw(self):
        arcade.start_render()

        for layer in self.layers:
            layer.draw()

        self.platforms.draw()
        self.player.draw()

    def update(self, delta_time):
        self.player.update()

        for layer in self.layers:
            for sprite in layer:
                change = self.player.change_x * layer.scroll_speed
                sprite.center_x -= change

    # ...

Kết quả:

Triển khai Parallax Scrolling

Trong phương thức on_draw, vẽ từng lớp bằng công cụ tương ứng của arcade trước khi vẽ các nền tảng và người chơi. Điều này đảm bảo layer đó hiện đằng sau người chơi và nền tảng.

Trong phương thức update, lặp qua từng layer và update vị trí của mỗi sprite trong layer dựa trên chuyển động theo chiều ngang của người chơi (self.player.change_x) và tốc độ cuộn của layer (layer.scroll_speed). Bằng cách nhân chuyển động của người chơi với tốc độ cuộn, bạn có thể đạt được hiệu ứng parallax scrolling.

Điều chỉnh tốc độ cuộn

Để tạo hiệu ứng parallax scrolling hấp dẫn, bạn có thể điều chỉnh tốc độ cuộn cho các lớp khác nhau. Thử nghiệm với các tốc độ khác nhau có thể thêm chiều sâu và khiến thế giới game trở nên hấp dẫn hơn.

class MyGame(arcade.Window):
    # ...

    def setup(self):

       # ...

        layers_data = [
            (Layer(1.2), Platform(w, h, 800, 600, gray)),
            (Layer(2.5), Platform(w, h - 200, 400, 20, red)),
            (Layer(3.0), Platform(w, h + 200, 400, 20, red)),
            (Layer(4.0), Platform(w, h - 300, 200, 20, brown)),
            (Layer(5.0), Platform(w, h + 300, 200, 20, brown))
        ]

        # ...

    # ...

Thoải mái thử nghiệm với những tốc độ cuộn khác nhau để có được hiệu ứng parallax scrolling mong muốn cho game.

Bao gồm các tính năng bổ sung

Parallax scrolling mở ra “thế giới khả năng” nâng cao trò chơi. Bằng cách kết hợp nó với các tính năng khác, bạn có thể tạo trải nghiệm chân thực và hấp dẫn. Dưới đây là một số tính năng mà bạn có thể kết hợp vào game khi muốn bổ sung cho hiệu ứng parallax scrolling:

Hiệu ứng background động

Bạn có thể tận dụng các layer parallax scrolling để thêm hiệu ứng hình nền động. Ví dụ, bạn có thể mô phỏng điều kiện thời tiết như mưa, tuyết hay lá rơi. Mỗi layer đều có bộ hiệu ứng phân tử riêng, phản ứng với chuyển động của người chơi, tạo môi trường sống động và hấp dẫn.

Tạo file mới tên background-effects.py và thêm code với những update bên dưới:

class Raindrop(arcade.Sprite):
    def __init__(self, x, y):
        super().__init__()

        self.texture = arcade.make_soft_square_texture(
            3, blue, outer_alpha=100)

        self.center_x = x
        self.center_y = y

class BackgroundLayer(arcade.SpriteList):
    def __init__(self, scroll_speed):
        super().__init__()
        self.scroll_speed = scroll_speed
        self.raindrops = arcade.SpriteList()

    def update(self):
        for raindrop in self.raindrops:
            raindrop.center_y -= self.scroll_speed * 5 

            if raindrop.center_y < -10:
                raindrop.remove_from_sprite_lists()

    def draw(self):
        super().draw()
        self.raindrops.draw()

class MyGame(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        arcade.set_background_color(arcade.color.WHITE)
        self.background_layer = BackgroundLayer(0.2)
        # ...

    def setup(self):
        # ...
        self.background_layer.raindrops.append(
            Raindrop(SCREEN_WIDTH // 2, SCREEN_HEIGHT + 10))

    def update(self, delta_time):
        self.player.update()
        self.background_layer.update()

    def on_draw(self):
        arcade.start_render()
        self.background_layer.draw()
        self.platforms.draw()
        self.player.draw()

Kết quả:

Kết quả của hiệu ứng background động

Với hiệu ứng parallax scrolling, bạn có thể biến một game đơn giản thành chuyến phiêu lưu tuyệt vời. Dù nó là game platfomer, bắn súng hay chạy vô tận, prallax scrolling đều thêm lớp “đánh bóng” game khiến người chơi muốn quay lại nhiều hơn.

Thứ Ba, 11/07/2023 16:52
51 👨 96
0 Bình luận
Sắp xếp theo
    ❖ Python