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.
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ả:
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 dx và dy, biểu thị sự thay đổi trong tọa độ x và y. 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ả:
Đố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ả:
Đố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 và 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.