Cách thêm camera vào game arcade trong Python

Thư viện Arcade của Python là một framework mạnh mẽ và thân thiện người dùng, hỗ trợ tạo game 2D. Và bạn có thể nâng cấp trải nghiệm chơi game Arcade trong Python bằng cách bổ sung camera.

Thêm camera vao game Python

Thêm camera vào game cho phép thao tác xem linh động, giúp người chơi khám phá thế giới game rộng lớn hơn, tập trung vào các vùng cụ thể hoặc theo dõi đối tượng chuyển động.

Bằng việc di chuyển góc nhìn camera, bạn có thể tạo các hiệu ứng hấp dẫn, nâng cao cơ chế gameplay và cung cấp trải nghiệm chơi hấp dẫn hơn.

Tạo game đơn giản

Trước khi bắt đầu, cài đặt pip trên thiết bị và dùng lệnh bên dưới để cài mô đun arcade:

pip install arcade

Giờ bắt đầu tạo game cuộn cảnh màn hình (side-scrolling). Đây là nơi người chơi điều khiển nhân vật có thể di chuyển sang trái và phải bằng các phím mũi tên.

Ngoài ra, bạn có thể thêm vật cản cho người chơi để điều hướng xung quanh.

import arcade

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
MOVEMENT_SPEED = 5

class MyGame(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        self.player_x = width // 2
        self.player_y = height // 2

    def setup(self):
        arcade.set_background_color(arcade.color.SKY_BLUE)

    def on_draw(self):
        arcade.start_render()
        arcade.draw_circle_filled(self.player_x, self.player_y, 20, arcade.color.RED)
        arcade.draw_rectangle_filled(400, 200, 80, 40, arcade.color.GREEN)

    def update(self, delta_time):
        pass

    def on_key_press(self, key, modifiers):
        if key == arcade.key.LEFT:
            self.player_x -= MOVEMENT_SPEED
        elif key == arcade.key.RIGHT:
            self.player_x += MOVEMENT_SPEED

if __name__ == "__main__":
    game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT)
    game.setup()
    arcade.run()

Thiết lập camera

Để thêm camera vào game, tạo class Camera quản lý vị trí và di chuyển của máy quay. Class này sẽ có những thuộc tính như camera_xcamera_y để lưu trữ tọa độ của camera.

class Camera:
    def __init__(self):
        self.camera_x = 0
        self.camera_y = 0

Di chuyển camera bằng bàn phím

Tiếp theo, chỉnh sửa phương thức on_key_press để bao gồm chuyển động camera dựa trên input của người chơi. Khi người chơi di chuyển sang trái hoặc phải, bạn có thể update vị trí của máy ảnh cho phù hợp. Ngoài ra, điều chỉnh code vẽ để tính vị trí của máy ảnh khi hiện các đối tượng trong game.

class MyGame(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        self.camera = Camera()
        self.player_x = width // 2
        self.player_y = height // 2

    def on_key_press(self, key, modifiers):
        if key == arcade.key.LEFT:
            self.player_x -= MOVEMENT_SPEED
            self.camera.camera_x -= MOVEMENT_SPEED
        elif key == arcade.key.RIGHT:
            self.player_x += MOVEMENT_SPEED
            self.camera.camera_x += MOVEMENT_SPEED

    def on_draw(self):
        arcade.start_render()
        arcade.set_viewport(
            self.camera.camera_x,
            self.camera.camera_x + SCREEN_WIDTH,
            self.camera.camera_y,
            self.camera.camera_y + SCREEN_HEIGHT
        )
        arcade.draw_circle_filled(self.player_x, self.player_y, 20, arcade.color.RED)
        arcade.draw_rectangle_filled(400, 200, 80, 40, arcade.color.GREEN)

Điều khiển camera bằng chuột

Ngoài bàn phím, bạn cũng có thể kích hoạt chuyển động camera bằng chuột. Ví dụ, bạn có thể cho phép người chơi xoay camera bằng cách kéo màn hình. Để đạt được điều này, chỉnh sửa phương thức on_mouse_drag để update vị trí của camera dựa trên chuyển động của chuột.

class MyGame(arcade.Window):
    def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers):
        if buttons == arcade.MOUSE_BUTTON_LEFT:
            self.camera.camera_x -= dx
            self.camera.camera_y -= dy

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

Thêm camera vào game mở ra một thế giới nhiều khả năng cho các tính năng & hiệu ứng bổ sung. Dưới đây là một số ví dụ về cách bạn có thể nâng cao game bằng hệ thống camera.

Tính năng thu phóng

Để triển khai chức năng thu phóng, bạn cần giới thiệu biến zoom trong class Camera và chỉnh sửa phương thức on_mouse_scroll để update cấp độ zoom dựa trên chuyển động bánh xe chuột. Bạn cũng cần điều chỉnh các tham số set_viewport để xem xét mức độ thu phóng.

class Camera:
    def __init__(self):
        self.camera_x = 0
        self.camera_y = 0
        self.zoom = 1.0

class MyGame(arcade.Window):

    def on_mouse_scroll(self, x, y, scroll_x, scroll_y):
        self.camera.zoom += scroll_y * 0.1

    def on_draw(self):
        arcade.start_render()
        arcade.set_viewport(
            self.camera.camera_x * self.camera.zoom,
            (self.camera.camera_x + SCREEN_WIDTH) * self.camera.zoom,
            self.camera.camera_y * self.camera.zoom,
            (self.camera.camera_y + SCREEN_HEIGHT) * self.camera.zoom
        )
        arcade.draw_circle_filled(self.player_x, self.player_y, 20, arcade.color.RED)
        arcade.draw_rectangle_filled(400, 200, 80, 40, arcade.color.GREEN)

Chuyển động camera mượt mà

Để đạt được chuyển động camera mượt mà, bạn có thể giới thiệu kỹ thuật nội suy, mang tên nội suy tuyến tính (lerp). Chỉnh sửa phương thức update để di chuyển camera dần dần hướng về vị trí mục tiêu bằng lerp. Điều này tạo một hiệu ứng chuyển tiếp mượt mà.

class Camera:
    def __init__(self):
        self.camera_x = 0
        self.camera_y = 0
        self.target_x = 0
        self.target_y = 0
        self.lerp_speed = 0.1

    def update(self):
        self.camera_x = arcade.lerp(self.camera_x, self.target_x, self.lerp_speed)
        self.camera_y = arcade.lerp(self.camera_y, self.target_y, self.lerp_speed)

class MyGame(arcade.Window):

    def update(self, delta_time):
        self.camera.target_x = self.player_x - SCREEN_WIDTH // 2
        self.camera.target_y = self.player_y - SCREEN_HEIGHT // 2
        self.camera.update()

    def on_draw(self):
        arcade.start_render()
        arcade.set_viewport(
            self.camera.camera_x,
            self.camera.camera_x + SCREEN_WIDTH,
            self.camera.camera_y,
            self.camera.camera_y + SCREEN_HEIGHT
        )
        arcade.draw_circle_filled(self.player_x, self.player_y, 20, arcade.color.RED)
        arcade.draw_rectangle_filled(400, 200, 80, 40, arcade.color.GREEN)

Giới hạn camera

Để ngăn camera di chuyển vượt quá ranh giới nhất định, bạn có thể đưa ra các giới hạn. Ví dụ, xác định vị trí camera tối thiểu và tối đa, đồng thời đảm bảo camera vẫn nằm trong giới hạn quy định.

class Camera:
    def __init__(self):
        self.camera_x = 0
        self.camera_y = 0
        self.min_x = 0
        self.max_x = 800
        self.min_y = 0
        self.max_y = 600

    def update(self):
        self.camera_x = max(self.min_x, min(self.camera_x, self.max_x))
        self.camera_y = max(self.min_y, min(self.camera_y, self.max_y))

class MyGame(arcade.Window):

    def update(self, delta_time):
        self.camera.camera_x = self.player_x - SCREEN_WIDTH // 2
        self.camera.camera_y = self.player_y - SCREEN_HEIGHT // 2
        self.camera.update()

    def on_draw(self):
        arcade.start_render()
        arcade.set_viewport(
            self.camera.camera_x,
            self.camera.camera_x + SCREEN_WIDTH,
            self.camera.camera_y,
            self.camera.camera_y + SCREEN_HEIGHT
        )
        arcade.draw_circle_filled(self.player_x, self.player_y, 20, arcade.color.RED)
        arcade.draw_rectangle_filled(400, 200, 80, 40, arcade.color.GREEN)

Trên đây chỉ là một số ví dụ về cách bạn có thể nâng cấp hệ thống camera để bao gồm các tính năng bổ sung và hiệu ứng cho game Python Arcade.

Hi vọng bài viết hữu ích với các bạn!

Thứ Sáu, 16/06/2023 16:31
32 👨 199
0 Bình luận
Sắp xếp theo
    ❖ Python