Cách thêm đối tượng di chuyển ngẫu nhiên bằng thư viện Arcade của Python

Làm game arcade của bạn trở nên thú vị hơn bằng cách thêm các đối tượng di chuyển ngẫu nhiên. Dưới đây là hướng dẫn chi tiết.

Tạo đối tượng di chuyển ngẫu nhiên trong game

Nhưng đối tượng di chuyển ngẫu nhiên có thể mang tới sự thú vị và khó đoán cho trò chơi. Nó khiến chúng hấp dẫn và thử thách hơn. Thư viện Arcade của Python cung cấp một cách đơn giản và hiệu quả để kết hợp những đối tượng di chuyển ngẫu nhiên trong game.

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 cửa sổ bằng class arcade.Window và đặt màu background sang trắng.

Đặt vị trí của người chơi ở giữa màn hình theo chiều ngang và thêm khoảng cách nhỏ ở phía trên. Bạn có thể kiểm soát chuyển động của người chơi bằng các phím mũi tên.

Đây là code game cơ bản ở ví dụ này:

import arcade

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
PLAYER_RADIUS = 15

class MyGame(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        arcade.set_background_color(arcade.color.WHITE)

        self.player_x = SCREEN_WIDTH // 2
        self.player_y = PLAYER_RADIUS + 10

    def on_draw(self):
        arcade.start_render()
        arcade.draw_circle_filled(self.player_x, self.player_y, PLAYER_RADIUS, arcade.color.BLUE)

    def update(self, delta_time):
        pass

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

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

Thêm nhiều đối tượng

Để thêm những đối tượng di chuyển ngẫu nhiên cho game, tạo danh sách chứa vị trí của đối tượng và update chúng trong mỗi khung hình. Bạn cũng có thể dùng sprite làm đối tượng.

Trong code game, thêm list tên objects chứa vị trí của những đối tượng di chuyển ngẫu nhiên. Sau đó, tạo số đối tượng (NUM_OBJECTS) với tọa độ x và y ngẫu nhiên trong các đường bao quanh màn hình. Đối tượng này được vẽ trong hình tròn màu đỏ bằng hàm arcade.draw_circle_filled.

import arcade
import random

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
PLAYER_RADIUS = 15
OBJECT_RADIUS = 10
NUM_OBJECTS = 10

class MyGame(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        arcade.set_background_color(arcade.color.WHITE)

        self.player_x = SCREEN_WIDTH // 2
        self.player_y = PLAYER_RADIUS + 10

        self.objects = []
        for _ in range(NUM_OBJECTS):
            x = random.randint(0, SCREEN_WIDTH)
            y = random.randint(0, SCREEN_HEIGHT)
            self.objects.append((x, y))

    def on_draw(self):
        arcade.start_render()
        arcade.draw_circle_filled(self.player_x, self.player_y, PLAYER_RADIUS, arcade.color.BLUE)

        for obj in self.objects:
            x, y = obj
            arcade.draw_circle_filled(x, y, OBJECT_RADIUS, arcade.color.RED)

    def update(self, delta_time):
        pass

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

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

Kết quả:

Đối tượng di chuyển ngẫu nhiên được tạo trong game

Triển khai thuật toán chuyển động ngẫu nhiên

Để làm đối tượng di chuyển ngẫu nhiên, update vị trí của chúng trong phương thức update bằng một thuật toán di chuyển ngẫu nhiên.

Lặp qua từng đối tượng và tạo giá trị ngẫu nhiên cho dxdy, biểu thị sự thay đổi trong tọa độ xy. Sau đó, update vị trí của đối tượng bằng cách thêm những giá trị này. Đây là code được chỉnh sửa:

def update(self, delta_time):
for i in range(NUM_OBJECTS):
x, y = self.objects[i]
dx = random.randint(-5, 5)
dy = random.randint(-5, 5)
x += dx
y += dy
self.objects[i] = (x, y)

Kết quả:

Lập trình đối tượng di chuyển ngẫu nhiên

Đối tượng di chuyển hướng về phía người chơi

Để thêm nhiều tương tác hơn, làm đối tượng di chuyển về hướng người chơi. Bạn có thể đạt được điều này bằng cách tính vector chỉ hướng giữa đối tượng và người chơi, đồng thời điều chỉnh vị trí của đối tượng cho phù hợp.

Để làm việc này, tính toán sự khác biệt ở tọa độ x & y giữa đối tượng và người chơi. Bằng cách chuẩn hóa những dữ liệu này, bạn có một vector chỉ hướng. Sau đó, nhân vector này với hệ số tốc độ (3 trong ví dụ) và thêm nó vào vị trí của đối tượng. Đây là phương thức update được cập nhật.

def update(self, delta_time):
    for i in range(NUM_OBJECTS):
        x, y = self.objects[i]
        dx = self.player_x - x
        dy = self.player_y - y
        distance = math.sqrt(dx ** 2 + dy ** 2)
        dx /= distance
        dy /= distance
        x += dx * 3
        y += dy * 3
        self.objects[i] = (x, y)

Kết quả:

Kết quả sau khi code

Đối tượng bắt đầu di chuyển khi người chơi bước vào khu vực xung quanh

Để thêm động lực, chỉnh sửa code sao cho đối tượng bắt đầu di chuyển chỉ khi người chơi bước vào khu vực xung quanh. Thêm code cho chuyển động của người chơi và xác định bán kính cho đối tượng hoạt động.

def update(self, delta_time):
    for i in range(NUM_OBJECTS):
        x, y = self.objects[i]
        dx = self.player_x - x
        dy = self.player_y - y
        distance = math.sqrt(dx ** 2 + dy ** 2)
        
        if distance < 100: # Adjust the radius as needed
            dx /= distance
            dy /= distance
            x += dx * 3
            y += dy * 3
            self.objects[i] = (x, y)

Phát hiện va chạm và tương tác

Giờ thêm phát hiện va chạm giữa người chơi và đối tượng, đồng thời, xác định hành vi khi xảy ra va chạm. Chỉnh sửa phương thức update để xử lý va chạm:

def update(self, delta_time):
    for i in range(NUM_OBJECTS):
        x, y = self.objects[i]
        dx = self.player_x - x
        dy = self.player_y - y
        distance = math.sqrt(dx ** 2 + dy ** 2)
        
        if distance < PLAYER_RADIUS + OBJECT_RADIUS:
            # if collision occurred, handle it here
            self.objects.pop(i)
            self.objects.append((random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT)))
            
        elif distance < 100:
            dx /= distance
            dy /= distance
            x += dx * 3
            y += dy * 3
            self.objects[i] = (x, y)

Cân bằng ngẫu nhiên

Để tạo trải nghiệm gameplay cân bằng, điều quan trọng là bạn cần tinh chỉnh chuyển động ngẫu nhiên và sự xuất hiện của các đối tượng. Dưới đây là một số ví dụ về cách bạn có thể điều chỉnh code để đạt được sự cân bằng tốt hơn trong game:

Hạn chế tốc độ tối đa

Để ngăn đối tượng di chuyển quá nhanh, bạn có thể đưa ra giới hạn tốc độ tối đa. Chỉnh sửa phương thức update để bao gồm những giới hạn tốc độ:

    for i in range(NUM_OBJECTS):
        x, y = self.objects[i]
        dx = self.player_x - x
        dy = self.player_y - y
        distance = math.sqrt(dx ** 2 + dy ** 2)

        if distance < PLAYER_RADIUS + OBJECT_RADIUS:
            self.objects.pop(i)
            self.objects.append((random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT)))
        elif distance < 100:
            dx /= distance
            dy /= distance

            speed = 3 # Adjust the speed value as needed
            dx = min(max(dx * speed, -MAX_SPEED), MAX_SPEED)
            dy = min(max(dy * speed, -MAX_SPEED), MAX_SPEED)

            x += dx
            y += dy
            self.objects[i] = (x, y)

Kiểm soát tỷ lệ spawn

Bạn cũng có thể kiểm soát tỷ lệ xuất hiện những đối tượng mới trong game. Điều chỉnh code để bao gồm trì hoãn giữa việc sinh những đối tượng mới:

import time

class MyGame(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        arcade.set_background_color(arcade.color.WHITE)

        self.player_x = SCREEN_WIDTH // 2
        self.player_y = PLAYER_RADIUS + 10

        self.objects = []
        self.last_spawn_time = time.time()

    def update(self, delta_time):
       # control the spawning rate here
        if time.time() - self.last_spawn_time > SPAWN_DELAY:
            if len(self.objects) < MAX_OBJECTS:
                self.objects.append((random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT)))
                self.last_spawn_time = time.time()

        for i in range(len(self.objects)):
            x, y = self.objects[i]
            dx = self.player_x - x
            dy = self.player_y - y
            distance = math.sqrt(dx ** 2 + dy ** 2)

            if distance < PLAYER_RADIUS + OBJECT_RADIUS:
                self.objects.pop(i)
                self.objects.append((random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT)))
            elif distance < 100:
                dx /= distance
                dy /= distance

                x += dx * 3
                y += dy * 3
                self.objects[i] = (x, y)

Điều chỉnh giá trị SPAWN_DELAY MAX_OBJECTS để tìm sự cân bằng phù hợp cho game. Độ trì hoãn dài hay số lượng đối tượng tối đa nhỏ hơn sẽ khiến game bớt đông đúc hơn. Ngược lại, độ trễ ngắn hơn hoặc số lượng đối tượng tối đa lớn hơn sẽ tăng độ khó cho game.

Trên đây là cách thêm đối tượng di chuyển ngẫu nhiên vào game được tạo bằng Python. Hi vọng bài viết hữu ích với các bạn.

Thứ Ba, 20/06/2023 16:33
51 👨 107
0 Bình luận
Sắp xếp theo
    ❖ Python