Menu
CoddyTech

Sinyal Nedir?

Coddy'nin GDScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 35 / 65.

Oyun çalışırken nesnelerin başına bazı şeyler gelir: bir altın para toplanır, bir kapı açılır, kahramanın hp değeri 0'a düşer. Programın diğer bölümleri bu olaylara tepki verir: skor artar, bir ses çalar, oyun bitti ekranı görünür.

Bir sinyal, bir nesnenin başına bir şey geldiğinde gönderdiği mesajdır. Nesne sinyali yayar ve bu sinyale bağlı her işlev çalışır:

# coin.gd
class_name Coin
extends RefCounted

signal collected

func collect() -> void:
	print("Coin picked up")
	collected.emit()

signal collected sinyali bildirir ve collected.emit() sinyali gönderir. Madeni para, kimin dinlediğini bilmez. Madeni paralarla ilgilenen kod, kendi işlevlerinden birini sinyale bağlar:

# main.gd
func _ready():
	var coin := Coin.new()
	coin.collected.connect(_on_coin_collected)
	coin.collect()
	print("Done")

func _on_coin_collected() -> void:
	print("Score +1")

Çıktı Coin picked up, Score +1, Done şeklindedir. Sinyal göndermek, emit() satırından sonraki satıra geçmeden önce bağlı işlevleri hemen çalıştırır. Bağlı işlevi olmayan bir sinyal gönderildiğinde hiçbir şey olmaz.

Bir sinyal olmadan collect() puan kodunu kendisi çağırmak zorunda kalırdı; bu nedenle her madeni paranın puan tablosuna bir başvurusu olması gerekirdi. Bir sinyalle madeni para yalnızca olayı duyurur ve istediği sayıda dinleyici, hatta hiçbiri, bu olaya tepki verebilir.

Godot'un kendi düğümleri de aynı şekilde çalışır: Bir Button, tıklandığında pressed sinyalini yayar ve bir Timer, süresi dolduğunda timeout sinyalini yayar.

challenge icon

Görev

Kolay

Bir posta kutusu, yeni postayı bir sinyalle bildirir. Mailbox zaten signal mail_arrived bildirir ve bir letters sayacı vardır. deliver(kind) fonksiyonunu yaz:

  • kind, "letter" ise letters değerine 1 ekle ve mail_arrived sinyalini gönder.
  • Diğer türlerde (bir reklam, bir broşür) posta atılır: hiçbir şey değişmez ve hiçbir sinyal gönderilmez.

Sağlanan kod, You've got mail! yazdıran bir fonksiyona bağlanır, ardından gelen satırların sayısını okur ve her birini teslim eder. away satırı bu fonksiyonun bağlantısını keser, home ise yeniden bağlar; bu nedenle siz uzaktayken gelen bir mektup sayılır ama bildirilmez. letter, ad, away, letter satırları için şunu yazdırır:

Delivering: letter
You've got mail!
Delivering: ad
Delivering: letter
Letters: 2

Kodunuzu mailbox.gd dosyasına yazın. main.gd, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

extends Node

func _ready():
	# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
	var mailbox := Mailbox.new()
	mailbox.mail_arrived.connect(_on_mail_arrived)
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var line := OS.read_string_from_stdin()
		if line == "away":
			mailbox.mail_arrived.disconnect(_on_mail_arrived)
		elif line == "home":
			mailbox.mail_arrived.connect(_on_mail_arrived)
		else:
			print("Delivering: ", line)
			mailbox.deliver(line)
	print("Letters: ", mailbox.letters)

func _on_mail_arrived() -> void:
	print("You've got mail!")
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online GDScript derleyicisi