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 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_x và camera_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!