Chia nhỏ các tảng đá
Thuộc phần Dự án trong hành trình Godot của Coddy. Bài học 18 trên 36.
Một tảng đá trúng đạn sẽ tách làm đôi. Tảng đá báo rằng nó đã vỡ bằng signal broken(rock) và broken.emit(self). self là tảng đá, nên bộ lắng nghe biết nó ở đâu và di chuyển như thế nào.
spawn_rock kết nối mỗi tảng đá mới với rock.broken.connect(_on_rock_broken), và hàm đó tạo ra hai tảng đá bay theo hai hướng khác nhau:
func _on_rock_broken(rock):
spawn_rock.call_deferred(rock.position, rock.velocity.rotated(0.8) * 1.5)
spawn_rock.call_deferred(rock.position, rock.velocity.rotated(-0.8) * 1.5)Tín hiệu được gửi đến khi Godot đang kiểm tra những vùng nào chạm nhau. Thêm một vùng vào lúc đó sẽ khiến trò chơi dừng lại với thông báo Can't change this state while flushing queries. call_deferred gọi hàm vào cuối khung hình, khi việc đó an toàn.
Hiện tại, mọi tảng đá đều tách đôi nên chúng không bao giờ cạn. Tiếp theo là kích thước.
Thử thách
KhóKhi bắn trúng, hãy làm đá tách thành hai mảnh.
- Trong
rock.gd, thêmsignal broken(rock)và gọibroken.emit(self)khi một viên đạn va trúng, trướcqueue_free(). - Trong
main.gd, kết nối tín hiệubrokencủa từng tảng đá với_on_rock_brokentrongspawn_rock. - Trong
_on_rock_broken(rock), tạo hai tảng đá như minh họa bằngcall_deferred.
Nhấn Chơi rồi bắn một tảng đá: hai tảng đá bay tách ra. Sau đó, nhấn Kiểm tra.
Tự làm thử
extends Node2D
const ROCK = preload("res://rock.tscn")
func _ready():
for i in 4:
spawn_rock(Vector2(randf_range(0, 640), 0), Vector2(randf_range(-90, 90), randf_range(40, 90)))
func spawn_rock(where, velocity):
var rock = ROCK.instantiate()
rock.position = where
rock.velocity = velocity
add_child(rock)
Tất cả bài học trong Dự án
1Dự án: Breakout
Thanh đỡ trong BreakoutGiữ thanh đỡ trong màn hình4Dự án: trò chơi khám phá hầm ngục
Khám phá hầm ngụcNhặt chìa khóa2Dự án: Trò chơi bắn thiên thạch
Xoay con tàuKhởi động động cơTự luyện tập: Playground Godot