Cách thêm hệ thống hội thoại trong game Python bằng thư viện Arcade

arcade python game 7 size 300x0 znd

Các nhân vật thực tế tương tác thường bằng cách trò chuyện với nhau. Đảm bảo bạn trình bày hội thoại của nhân vật theo cách dễ tiếp cận nhất khi phát triển game.

Lập trình game

Nếu game của bạn bao gồm nhiều nhân vật, có thể bạn sẽ muốn chúng trò chuyện với nhau. Một hệ thống hội thoại cung cấp các cuộc trò chuyện tương tác, tiến trình câu chuyện và phát triển nhân vật. Thư viện Python Arcade giúp bạn dễ dàng tích hợp một hệ thống hội thoại vào codebase hiện tại.

Với một hệ thống hội thoại, bạn có thể tạo cuộc trò chuyện giữa người chơi và nhân vật có sẵn (NPC). Người chơi có thể chọn phản hồi hoặc đưa ra quyết định ảnh hưởng tới câu chuyện hay kết quả của game.

Hệ thống này cho phép bạn tạo ra những câu chuyện hấp dẫn và tương tác chân thực, cung cấp trải nghiệm gameplay hấp dẫn hơn.

Tạo một game đơn giản

Để bắt đầu, tạo một game đơn giản bằng thư viện Arcade. Điều này sẽ hoạt động giống như nền tảng để hoàn thiện hệ thống hội thoại.

Tạo file mới tên simple-game.py và định nghĩa một class Game kế thừa arcade.Window. Đặt kích thước màn hình, tạo vị trí người chơi và nền tảng, triển khai các chức năng vẽ cơ bản. Người chơi có thể di chuyển sang trái và phải bằng các phím mũi tên.

Kết quả:

Tạo game đơn giản bằng thư viện Python Arcade

Thêm box hội thoại

Giờ bạn đã có một cấu trúc game cơ bản, thêm box hội thoại hiện ra khi người chơi va chạm với kẻ thù. Bạn có thể tạo một box hội thoại bằng những hình dáng đơn giản và hiện nó trên màn hình.

Thêm flag dialogue_active vào class Game, cho biết hội thoại có hiện hay không. Trong phương thức on_update, kiểm tra va chạm của kẻ thù. Nếu được phát hiện, đặt dialogue_active sang True.

Trong phương thức on_draw, gọi draw_dialogue_box nếu hộp thoại hoạt động. Draw_dialogue_box vẽ một hình chữ nhật làm background của box hội thoại và hiện một tin nhắn văn bản.

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

# Bên trong class Game
class Game(arcade.Window):
    def __init__(self):
        # ...
        self.dialogue_active = False
    def on_update(self, delta_time):
        if self.check_enemy_collision():
            self.dialogue_active = True
    def on_draw(self):
        # ...
        if self.dialogue_active:
            self.draw_dialogue_box()
    def check_enemy_collision(self):
        player_radius = 25
        distance_x = abs(self.player_x - self.platform_x)
        distance_y = abs(self.player_y - self.platform_y)
        combined_radius = player_radius + 25
        if distance_x < combined_radius and distance_y < combined_radius:
            return True
        else:
            return False
    def draw_dialogue_box(self):
        text = "Hello, player! How are you?"        
        arcade.draw_rectangle_filled(SCREEN_WIDTH // 2, 
        SCREEN_HEIGHT // 2, 500, 200, white)        
        arcade.draw_text(text, SCREEN_WIDTH // 2, 
        SCREEN_HEIGHT // 2 + 20, black, font_size=16, 
        anchor_x="center", anchor_y="center")

Kết quả:

Hội thoại trong game

Hiện nội dung hội thoại

Giờ bạn có thể nâng cao hệ thống hội thoại bằng cách hiện các tin nhắn văn bản động. Tạo một danh sách các chuỗi hội thoại và lặp lại chúng để mô phỏng một cuộc trò chuyện. Mỗi lần hộp thoại xuất hiện, nó sẽ hiện tin nhắn mới.

# Bên trong class Game 
class Game(arcade.Window):
    def __init__(self):
        # ...
        self.dialogue_active = False
        self.dialogue_messages = [
            "Hello, player! How are you?",
            "Nice weather today, isn't it?",
            "Beware of the enemies lurking ahead!"
        ]
        self.dialogue_index = 0
    def draw_dialogue_box(self):        
        arcade.draw_rectangle_filled(SCREEN_WIDTH // 2, 
        SCREEN_HEIGHT // 2, 500, 200, white)        
        arcade.draw_text(self.dialogue_messages[self.dialogue_index], 
        SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 + 20, black, font_size=16, 
        anchor_x="center", anchor_y="center")

Giới thiệu 3 biến mới: dialogue_messages, dialogue_index, và dialogue_active. Danh sách dialogue_messages chứa các tin nhắn văn bản mà hộp thoại sẽ hiện. Dialogue_index theo dõi tin nhắn hiện tại để hiện. Mỗi lần hộp thoại xuất hiện, bạn có thể tăng dialogue_index để hiện tin nhắn tiếp theo.

Thêm nút bấm

Để tạo hệ thống hội thoại tương tác hơn, thêm nút bấm để thay đổi nội dung hội thoại khi người chơi nhấn phím. Tạo file mới tên multi-text.py và thêm code với các update bên dưới:

# Bên trong class Game
class Game(arcade.Window):
    def __init__(self):
        # ...
        self.dialogue_active = False
        self.dialogue_messages = [
            "Hello, player! How are you?",
            "Nice weather today, isn't it?",
            "Beware of the enemies lurking ahead!"
        ]
        self.dialogue_index = 0
    def on_mouse_press(self, x, y, button, modifiers):
        index = (self.dialogue_index + 1) % len(self.dialogue_messages)
        if self.dialogue_active:
            if button == arcade.MOUSE_BUTTON_LEFT:
                self.dialogue_index = index
    def draw_dialogue_box(self):
        # ...
        arcade.draw_text("Next", SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 - 50, 
          black, font_size=16, anchor_x="center", anchor_y="center")

Thêm phương thức on_mouse_press vào class Game. Khi hội thoại hoạt động và bạn nhấn nút chuột trái, phương thức này tăng dialogue_index để hiện tin nhắn tiếp theo trong danh sách dialogue_messages. % len(self.dialogue_messages) đảm bảo index này bao quanh phần đầu danh sách khi đạt tới điểm cuối cùng.

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

Để nâng cao hệ thống hội thoại, bạn có thể cân nhắc thêm những tính năng sau:

  • Đa lựa chọn cho phép người chơi tác động tới kết quả cuộc trò chuyện hoặc đưa ra quyết định ảnh hưởng tới tiến trình của game.
  • Kết hợp với chân dung nhân vật giúp người chơi xác định người nói và thêm chiều sâu cho câu chuyện.
  • Hiệu ứng văn bản khiến cuộc trò chuyện hấp dẫn hơn.
  • Hiệu ứng âm thanh cho trải nghiệm game thêm sinh động.

Leave a Reply

Your email address will not be published. Required fields are marked *