Cách triển khai chu kỳ ngày-đêm trong Godot

Chu kỳ ngày - đêm có thể tăng thêm tính hấp dẫn cho trò chơi, đa dạng hóa hình ảnh và tạo ra các cơ chế thú vị. Dưới đây là cách triển khai chu kỳ ngày-đêm trong Godot.

Lập trình Godot

Những game như Minecraft, Animal Crossing, và Don’t Starve đều dùng hiệu quả kỹ thuật tạo chu kỳ ngày-đêm. Nó là một trong số nhân tố bạn nên cân nhắc thêm vào trò chơi của mình, đặc biệt nên kết hợp với các phần tử diễn ra tại thời gian thực.

Thật may, Godot 4 giúp lập trình viên dễ dàng tạo chu kỳ ngày-đêm theo cách đơn giản chưa từng thấy.

Thiết lập game Godot

Trước khi đi sâu vào triển khai chu kỳ ngày-đêm, hãy thiết lập nền tảng cho game. Bắt đầu bằng cách tạo một dự án 2D mới trong Godot 4. Thiết lập dự án với các cài đặt cần thiết.

Giờ, tạo nhân vật người chơi. Trong trường hợp này, thêm CharacterBody2D. Bên trong nó, thêm CollisionShape2D với một hình chữ nhật và Sprite2D. Nó đại diện trực quan cho nhân vật.

Để cho phép người chơi di chuyển, bạn có thể dùng code GDScript sau. Gắn tập lệnh này vào node nhân vật:

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)

Code này sẽ 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. Bạn cũng có thể thêm một số kẻ thù cho người chơi né tránh. Dùng các node StaticBody2D cho những kẻ thù này và điều chỉnh hình dáng và vị trí tương ứng của chúng.

Thiết lập game Godot

Thêm đồng hồ hẹn giờ cho chu kỳ ngày và đêm

Để tạo chu kỳ ngày-đêm, bạn cần một đồng hồ bấm giờ chạy liên tục, luân phiên giữa các giai đoạn ngày & đêm. Đồng hồ bấm giờ này sẽ chịu trách nhiệm theo dõi thời gian trôi qua trong game của bạn.

Thêm một node Time cho cảnh trong game tạo bằng Godot. Bạn có thể làm việc này bằng cách click chuột phải trong bảng Scene, chọn Add Node, rồi tìm Timer trong thư viện node.

Đặt lại tên có ý nghĩa rõ ràng cho node Timer, chẳng hạn như DayNightTimer. Cấu hình các thuộc tính của node Timer trong bảng Inspector. Cụ thể, đặt thuộc tính Wait Time sang 0 (độ trễ ban đầu trước khi đồng hồ bấm giờ chạy) và kiểm tra thuộc tính One Shot để lặp lại bộ đếm giờ.

Giờ thêm code GDSCript quản lý chu kỳ ngày-đêm:

extends Node2D

var day_duration = 30 # Thời gian ban ngày tính theo giây
var night_duration = 30 # Thời gian ban đêm tính theo giây

var is_day = true

func _ready():
    # Bắt đầu bấm giờ khi tải cảnh
    $DayNightTimer.start()

func _on_DayNightTimer_timeout():
    if is_day:
        # Chuyển từ ngày sang đêm
        $DayNightTimer.start(day_duration)
        is_day = false

        # Thêm code chỉ hoạt động ban đêm hoặc thay đổi hình ảnh:
        # Chuyển từ đêm sang ngày
        $DayNightTimer.start(night_duration)
        is_day = true

        # Thêm code chỉ hoạt động ban ngày hoặc thay đổi hình ảnh

Trong hàm _ready, khởi động DayNightTimer khi tải cảnh để khởi động chu kỳ ngày-đêm. Hàm _on_DayNightTimer_timeout sẽ chạy mỗi lần đồng hồ bấm giờ chạm số 0 - đây là thời điểm chuyển tiếp giữa ngày và đêm.

Bằng cách làm theo những bước này, bạn sẽ có một đồng hồ bấm giờ ngày-đêm thực hiện chuyển đổi giữa các khoảng thời gian trong ngày, cho phép bạn thêm các nhân tố gameplay sinh động và thay đổi hình ảnh trực quan theo thời gian trong ngày.

Điều chỉnh nền theo chu kỳ ngày & đêm

Để bổ sung cho chu kỳ ngày-đêm, bạn cần một cách để trình bày trực quan quá trình chuyển tiếp giữa ngày và đêm. Bạn có thể dùng node ColorRect để tạo nền phù hợp cho cả ngày & đêm. Phương pháp này đảm bảo chuyển tiếp mượt mà hơn và quyền kiểm soát tốt hơn về mặt hình ảnh.

Trong cảnh Godot, thêm node ColorRect. Node này sẽ hoạt động như background thay đổi màu đại diện cho ngày và đêm. Đặt lại tên có ý nghĩa cho node ColorRect, ví dụ như BackgroundRect. Đặt nó làm layerbackground, đảm bảo nó bao phủ toàn bộ khung hình.

Trong bảng Inspector, đặt thuộc tính Color sang màu nền ban đầu, sẽ đại diện cho thời gian ban ngày. Ví dụ, bạn có thể dùng Color(0.5, 0.5, 0.8) cho bầu trời ban ngày màu xanh nhạt.

Giờ update code GDScript để hoạt động với node ColorRect:

func _on_day_night_timer_timeout():
    if is_day:
        # Chuyển từ ngày sang đêm
        $DayNightTimer.start(day_duration)
        is_day = false

        # Thêm code cho các hoạt động ban đêm hoặc thay đổi hình ảnh

        # Update màu nền cho ban ngày
        $BackgroundRect.color = Color(0.5, 0.5, 0.8) # Màu xanh nhạt cho ban ngày:
        # Chuyển tiếp từ ngày sang đêm
        $DayNightTimer.start(night_duration)
        is_day = true

        # Thêm code chỉ hoạt động ban ngày hoặc thay đổi hình ảnh

        # Update màu nền chỉ ban đêm
        $BackgroundRect.color = Color(0, 0, 0) # Màu đen cho ban đêm

Update màu sắc của node BackgroundRect để thể hiện thời gian trong ngày. Ví dụ, đặt nó sang màu đen khi chuyển tiếp sang ban đêm, tạo background màu tối. Khi chuyển sang ban ngày, đặt nó là màu xanh nhạt.

Điều chỉnh màu nền theo ngày và đêm

Hiệu ứng âm thanh cho ngày-đêm

Hiệu ứng âm thanh có thể đóng vai trò quan trọng trong việc nâng cao tính chân thực và hấp dẫn của chu kỳ ngày-đêm trong Godot. Chúng cung cấp tín hiệu thính giác cho người chơi, khiến quá trình chuyển tiếp giữa ngày và đêm hấp dẫn hơn. Bạn có thể dễ dàng thêm hiệu ứng âm thanh cho game Godot.

Trước khi bắt đầu, đảm bảo bạn có các tài nguyên audio đại diện cho âm thanh ngày & đêm. Ví dụ, bạn có tiếng chim hót cho ban ngày, dế mèn kêu hoặc cú kêu vào ban đêm.

Trong cảnh game Godot, thêm hai node AudioStreamPlayer2d và đặt tên phù hợp cho chúng. Bạn có thể đặt tên chúng như $DaytimeSounds$NighttimeSounds.

Giờ update code GDScript để quản lý chuyển tiếp âm thanh giữa ngày và đêm:

func _on_day_night_timer_timeout():
    if is_day:
        # Chuyển tiếp từ ngày sang đêm
        $DayNightTimer.start(day_duration)
        is_day = false
     
        # Phát âm thanh ban ngày
        $NighttimeSounds.stop() # Stop nighttime sounds
        $DaytimeSounds.play() # Start daytime sounds
         
    else:
        # Chuyển tiếp từ đêm sang ngày
        $DayNightTimer.start(night_duration)
        is_day = true

        # Phát âm thanh ban đêm
        $DaytimeSounds.stop() # Stop daytime sounds
        $NighttimeSounds.play() # Start nighttime sounds

Khi đồng hồ bấm giờ ngày-đêm hết thời gian, code trên kiểm tra xem giai đoạn nào sẽ chuyển tiếp và phát âm thanh phù hợp.

Bạn thoải mái dùng hiệu ứng âm thanh không bản quyền ở đây.

Trên đây là cách tạo chu kỳ ngày và game cho game được lập trình bằng Godot. Hi vọng bài viết hữu ích với các bạn.

Thứ Tư, 11/10/2023 17:11
2,33 👨 143
0 Bình luận
Sắp xếp theo