Cách tạo power-up và bộ sưu tập trong Godot

Thêm power-up và bộ sưu tập vào game Godot có thể nâng cao đáng kể trải nghiệm người chơi, khiến game trở nên hấp dẫn và thú vị hơn. Dưới đây là cách làm việc đó trong Godot.

Lập trình game

Thiết lập game Godot

Để bắt đầu, tạo game 2D trong công cụ game Godot và thiết lập nhân vật người chơi. Tạo cảnh mới & thêm node CharacterBody2D. Bên trong CharacterBody2D, thêm CollisionShape2D với một hình chữ nhật đại diện cho khu vực va chạm của người chơi và một Sprite2D để hiện nhân vật của người chơi.

Giờ viết code GDScript để xử lý chuyển động và va chạm của người chơi với các ranh giới màn hình. Đây là code hoàn thiện cho chuyển động của người chơi:

extends CharacterBody2D

var speed = 200

func _physics_process(delta):
    var velocity = Vector2()

    if Input.is_action_pressed('ui_right'):
        velocity.x += 1

    if Input.is_action_pressed('ui_left'):
        velocity.x -= 1

    if Input.is_action_pressed('ui_down'):
        velocity.y += 1

    if Input.is_action_pressed('ui_up'):
        velocity.y -= 1

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

Code này cho phép người chơi di chuyển sang trái, phải, lên và xuống bằng các phím mũi tên. Nó cũng đảm bảo rằng người chơi không di chuyển quá nhanh bằng cách chuẩn hóa vector vận tốc và áp dụng nhân tố tốc độ.

Thêm vào đó, tạo các đối tượng kẻ thù ở khu vực va chạm và sprite của riêng chúng. Để xử lý chuyển động của kẻ thù, bạn có thể dùng hàm _physics_process tương tự như người chơi.

Tạo bộ sưu tập cho người chơi

Tạo bộ sưu tập

Bộ sưu tập rất cần thiết trong nhiều game. Một kiểu phổ biến nhất là coin - tiền xu. Tạo xu có thể thu thập tăng 20 điểm cho người chơi khi có được nó.

Đầu tiên, tạo một cảnh mới và thêm node Area2D làm xu có thể thu thập. Bên trong Area2D, thêm CollisionShape2D với một hình tròn để đại diện cho khu vực va chạm và Sprite2D để hiện xu.

Tiếp theo, thêm code GDScript sau vào tập lệnh người chơi:

extends CharacterBody2D

var score = 0

func _on_area_2d_body_entered(body):
    get_parent().get_node("Collectibles").queue_free()
    score += 20

Code này dùng tín hiệu _on_area_2d_body_entered để phát hiện khi nào nhân vật người chơi vào vùng va chạm của xu sưu tập được. Nếu nó phát hiện nhân vật người chơi thu thập xu, điểm số của họ sẽ được tăng 20 điểm.

Tạo điểm số khi người chơi thu thập được đồ

Tạo power-up

Power-up có thể thêm sự thú vị cho game bằng cách cho người chơi những ưu thế hay khả năng tạm thời. Tạo power-up kích hoạt đồng hồ bấm giờ 10 giây khi được thu thập. Nếu người chơi chạm vào kẻ thù trong thời gian đó, chúng sẽ phá hủy kẻ thù.

Để tạo power-up, tạo cảnh mới và thêm node Area2D. Bên trong Area2D, thêm CollisionShape2D với một hình chữ nhật và Sprite2D để hiện power-up.

Thêm code sau cho script người chơi:

extends CharacterBody2D

var timer_duration = 10
var power_up_active = false

func _on_powerups_body_entered(body):
    get_parent().get_node("Powerups").queue_free()
    power_up_active = true

    # Khởi động đồng hồ bấm giờ
    await get_tree().create_timer(10.0).timeout
    power_up_active = false

func _on_enemy_body_entered(body):
    if power_up_active:
        get_parent().get_node("Enemy").queue_free()
    else:
        queue_free()

Code này dùng tín hiệu _on_powerups_body_entered để phát hiện nhân vật người chơi thu thập power-up. Khi họ làm việc đó, game loại bỏ power-up khỏi cảnh, và đặt biến power_up_active sang true.

Hàm này cuối cùng bắt đầu một bộ hẹn giờ bằng await create_timer trong thời gian 10 giây. Trong suốt thời gian này, nếu nhân vật người chơi chạm vào một kẻ thù, kẻ thù đó sẽ bị tiêu diệt.

Hiện bộ sưu tập đã thu thập

Hiện số bộ sưu tập người chơi đã thu thập có thể thêm cảm giác về thành tựu và sự tiến bộ. Để làm việc này, bắt đầu bằng cách tạo một node Label và định vị nó ở góc trái phía trên cùng của màn hình.

Sau đó, thêm code GDScript để update nội dung nhãn bất cứ khi nào người chơi thu thập được một món đồ:

extends Label

func _ready():
    self.text = "Collectibles: 0"

Trên script Player.gd:

extends CharacterBody2D

var bar

func _ready():
    bar = get_parent().get_node("Label")

func _physics_process(delta):
    bar.text = "Collectibles: " + str(score / 20)

Code này update text của nhãn với số bộ sưu tập đã đạt được mà bạn có thể tính toán bằng cách chia điểm số của người chơi cho 20:

Bộ sưu tập

Trên đây là cách lập trình power-up và đồ sưu tập cho game trong Godot. Hi vọng bài viết hữu ích với các bạn.

Thứ Hai, 21/08/2023 14:37
51 👨 122
0 Bình luận
Sắp xếp theo