Tạo hệ thống hội thoại trong Godot bằng GDScript

Thêm chút tính cách cá nhân và bối cảnh cho nhân vật bằng hệ thống đối thoại luôn làm game hấp dẫn hơn. Dưới đây là cách tạo hệ thống hội thoại trong Godot bằng GDScript.

Lập trình game

Trong lập trình game, gameplay hấp dẫn và cách kể chuyện lôi cuốn là chìa khóa tạo nên trải nghiệm đáng nhớ. Một công cụ mạnh mẽ có thể giúp bạn đạt được điều này là hệ thống hội thoại trong game.

Nếu triển khai hệ thống hội thoại tốt, nhân vật có thể giao tiếp, chia sẻ thông tin, và tương tác với người chơi, thêm chiều sâu và tính chân thực cho trò chơi.

Thiết lập game Godot

Bắt đầu bằng cách tạo nền tảng cho game. Ví dụ, thiết lập một môi trường 2D đơn giản với một nhân vật có thể điều khiển di chuyển xung quanh bằng các phím mũi tên.

Bắt đầu bằng cách tạo một cảnh mới cho nhân vật người chơi. Bên trong cảnh này, thêm các thành phần cần thiết. Tạo CharacterBody2D đại diện cho phần thân của người chơi. Gắn CollisionShape2D với một hình chữ nhật để xác định vùng va chạm của người chơi.

Giờ thêm chuyển động người chơi và tương tác với các nền tảng bằng GDScript. Thay thế tập lệnh mặc định của node CharacterBody2D bằng code sau:

extends CharacterBody2D

var speed = 300

func _physics_process(delta):
    var input_dir = Vector2.ZERO

    if Input.is_action_pressed("ui_left"):
        input_dir.x -= 1

    if Input.is_action_pressed("ui_right"):
        input_dir.x += 1

    if Input.is_action_pressed("ui_up"):
        input_dir.y -= 1

    if Input.is_action_pressed("ui_down"):
        input_dir.y += 1

    velocity = input_dir.normalized() * speed
    move_and_collide(velocity * delta)

Tập lệnh này cho phép nhân vật di chuyển sang trái, phải, lên và xuống dựa trên các input phím mũi tên. Hàm move_and_collide đảm bảo nhân vật tương tác với các nền tảng và phản hồi với va chạm.

Hoàn thành game demo

Thêm box hội thoại

Giờ bạn có thể bắt đầu tạo hệ thống hội thoại. Bước đầu tiên là thêm một hộp thoại hiện text khi nhân vật tương tác với các đối tượng hoặc NPC cụ thể.

Trong script CharacterBody2D, giới thiệu nhiều biến hơn để xử lý hộp thoại và nội dung của nó:

var dialogue_box: Label
var close_button: Button
var dialogue_lines: Array = ["Hello, adventurer!", "Welcome to our village."]

var current_line: int = 0
var line_timer: float = 0

dialogue_box sẽ chịu trách nhiệm cho việc hiện nội dung hội thoại, còn close_button sẽ cho phép người chơi đóng hộp thoại khi cần.

Ở hàm _ready, tạo và khởi tạo box hộp thoại:

func _ready():
    dialogue_box = Label.new()
    dialogue_box.visible = false
    add_child(dialogue_box)

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

Giờ bạn có thể tập trung vào hiện nội dung trong hội thoại. Bạn có thể viết nội dung nhiều hơn một dòng và cuộn nó để xem từng dòng văn bản.

Chỉnh sửa hàm _physics_process để xử lý hiển thị các dòng hội thoại:

if line_timer > 0:
    line_timer -= delta
elif current_line < dialogue_lines.size():
    show_next_dialogue_line()

Đoạn code này kiểm tra line_timer xem có lớn hơn 0 hay không. Nếu có, nó giảm thời gian theo giá trị delta. Nếu hẹn giờ không hoạt động, và không có nhiều dòng hội thoại để hiển thị, nó gọi hàm show_next_dialogue_line.

Triển khai hàm show_next_dialogue_line như sau:

func show_next_dialogue_line():
    dialogue_box.text = dialogue_lines[current_line]
    current_line += 1

   # Hiện mỗi dòng trong 3 giây
    line_timer = 3.0

Hàm này update text trong hộp thoại với dòng trò chuyện hiện tại và tăng chỉ số current_line. Line_timer đảm bảo từng dòng được hiện trong khoảng thời gian ngắn trước khi chuyển sang dòng tiếp theo.

Hiện nội dung trên màn hình

Thêm nút đóng

Giờ bạn có thể cho người chơi khả năng đóng hộp thoại và tiếp tục chơi game. Làm việc này bằng nút đóng khi họ nhấn vào nó, ẩn hộp thoại và cho phép người chơi tiếp tục hành trình.

Đầu tiên, chỉnh sửa hàm _ready để tạo nút đóng và đính kèm chức năng của nó.

func _ready():
    dialogue_box = Label.new()
    dialogue_box.visible = false
    add_child(dialogue_box)

    close_button = Button.new()
    close_button.text = "Close"
    close_button.position = Vector2(50, 30)
    close_button.visible = false
    close_button.pressed.connect(_on_close_button_pressed)
    add_child(close_button)

Code này tạo một phiên bản của class Button và tùy biến hình ảnh cũng như vị trí của nó. Nó cũng kết nối tín hiệu pressed (được nhấn) tới hàm _on_close_button_pressed.

Giờ triển khai hàm _on_close_button_pressed. Trong hàm này, thiết lập độ hiển thị cho cả hộp thoại và nút đóng sang false. Hành động này ẩn hiệu quả giao diện hội thoại từ người chơi.

Nhớ reset current_line sang 0 để đảm bảo hội thoại bắt đầu từ đầu ở lần trò chuyện tiếp theo của người chơi:

func _on_close_button_pressed():
    dialogue_box.visible = false
    close_button.visible = false
    current_line = 0

Với những thay đổi này, người chơi có thể tham gia trò chuyện, đóng hộp thoại khi họ đã sẵn sàng khám phá hay tương tác với thế giới game.

Text đóng game

Trên đây là cách tạo hội thoại trong game Godot bằng GDScript. Hi vọng bài viết hữu ích với các bạn.

Thứ Ba, 29/08/2023 16:32
51 👨 132
0 Bình luận
Sắp xếp theo