Khai báo và phát tín hiệu
Thuộc phần Lập trình hướng đối tượng trong hành trình GDScript của Coddy. Bài học 36 trên 65.
Khai báo tín hiệu bằng từ khóa signal và một tên ở đầu lớp, bên cạnh các biến. Tên tín hiệu mô tả một sự kiện đã xảy ra, theo định dạng snake_case: died, door_opened, leveled_up. Một lớp (class) khai báo số tín hiệu tùy theo nhu cầu:
# player.gd
class_name Player
extends RefCounted
signal leveled_up
signal max_level_reached
const MAX_LEVEL := 3
var level := 1
var xp := 0
func add_xp(amount: int) -> void:
xp += amount
while xp >= 100 and level < MAX_LEVEL:
xp -= 100
level += 1
leveled_up.emit()
if level == MAX_LEVEL:
max_level_reached.emit()Phát tín hiệu đúng lúc sự kiện xảy ra, và chỉ vào lúc đó. add_xp(50) trên người chơi mới không phát ra tín hiệu nào. add_xp(250) sau đó đưa xp lên 300: leveled_up được phát ra hai lần, mỗi lần ứng với một cấp độ tăng, còn max_level_reached được phát ra một lần, khi tăng cấp lên cấp 3.
Bộ thiết lập thuộc tính là nơi thích hợp để phát tín hiệu, vì tín hiệu sẽ kích hoạt bất cứ khi nào có đoạn code thay đổi giá trị:
signal died
var hp: int = 10:
set(value):
var was_alive := hp > 0
hp = maxi(value, 0)
if was_alive and hp == 0:
died.emit()was_alive ngăn died được phát ra lần nữa khi một anh hùng có 0 HP bị đánh thêm lần nữa.
Bạn cũng có thể truy cập một tín hiệu bằng tên dưới dạng văn bản: emit_signal("died") phát tín hiệu đó, hero.connect("died", _on_hero_died) kết nối với tín hiệu đó và hero.has_signal("died") trả về true. Nếu kết nối với tên mà đối tượng không khai báo, dòng đó sẽ gây lỗi khi chạy.
Thử thách
DễViết một Bomb đếm ngược và thông báo từng bước bằng các tín hiệu.
- Khai báo hai tín hiệu:
beepedvàexploded. tick()giảmfuseđi1. Nếu cầu chì vẫn lớn hơn0, hãy phátbeeped; nếu nó đã về0, hãy phátexploded.- Khi cầu chì đã về
0, bom đã phát nổ: các lần gọi tick tiếp theo không làm gì và không phát tín hiệu nào.
Code được cung cấp đọc giá trị cầu chì ban đầu và số lần gọi tick, kết nối với cả hai tín hiệu theo tên, in ra Beep và BOOM! từ các hàm được kết nối, rồi in ra cầu chì còn lại. Với cầu chì là 3 và 5 lần gọi tick, chương trình in ra:
Beep
Beep
BOOM!
Fuse: 0Viết code của bạn trong bomb.gd. main.gd chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.
Tự làm thử
extends Node
func _ready():
# Đoạn code đầu vào và đầu ra có sẵn: giữ nguyên
var bomb := Bomb.new(int(OS.read_string_from_stdin()))
# Gọi connect() với tên tín hiệu ở dạng chuỗi
bomb.connect("beeped", _on_beeped)
bomb.connect("exploded", _on_exploded)
var ticks := int(OS.read_string_from_stdin())
for i in ticks:
bomb.tick()
print("Fuse: ", bomb.fuse)
func _on_beeped() -> void:
print("Beep")
func _on_exploded() -> void:
print("BOOM!")
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Nền tảng về OOP
Tệp bên ngoàiGiới thiệu về OOPLớp và đối tượngTừ khóa selfPhương thứcThuộc tínhHàm khởi tạo (_init)Ôn tập: máy tính đơn giản4Tính đa hình
Xem lại cách ghi đè phương thứcĐịnh kiểu vịtLớp và phương thức trừu tượngThiết kế interfaceÔn tập: máy tính hình học7Tín hiệu
Tín hiệu là gì?Khai báo và phát tín hiệuKết nối với tín hiệuTín hiệu có đối sốÔn tập: hệ thống sức khỏe10Các mẫu thiết kế phần 2
Mẫu lệnhMẫu bộ chuyển đổiMẫu trang tríMẫu phương thức khuôn mẫuMẫu trạng tháiMẫu tổng hợp2Thuộc tính của lớp
Biến instance và biến staticHàm staticPhương thức thiết lập thuộc tínhPhương thức lấy thuộc tínhQuy ước về tính riêng tưÔn tập: trình quản lý tài khoản ngân hàng5Tính đóng gói
Thành viên công khai và riêng tưXác thực bằng phương thức setterẨn thông tinThuộc tính chỉ đọcÔn tập: hệ thống hồ sơ học sinh8Khái niệm OOP nâng cao
Kết hợp và kế thừaLớp bên trongNode dưới dạng thành phầnRefCounted và NodeEnum trong lớpTự luyện tập: Trình biên dịch GDScript online