Menu
CoddyTech

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.

challenge icon

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: beeped và exploded.
  • tick() giảm fuse đi 1. Nếu cầu chì vẫn lớn hơn 0, hãy phát beeped; nếu nó đã về 0, hãy phát exploded.
  • 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: 0

Viế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!")
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch GDScript online