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.
Görev
KolayBir 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"iselettersdeğerine1ekle vemail_arrivedsinyalini 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: 2Kodunuzu 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!")
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
1Nesne Yönelimli Programlamanın Temelleri
Harici DosyalarNesne Yönelimli Programlamaya GirişSınıflar ve Nesnelerself Anahtar KelimesiMetotlarÖzelliklerKurucu (_init)Tekrar - Basit Hesap Makinesi4Çok Biçimlilik
Metot Ezme Konusuna Yeniden BakışÖrdek TiplemesiSoyut Sınıflar ve MetotlarArayüz TasarımıÖzet - Şekil Hesaplayıcı7Sinyaller
Sinyal Nedir?Tanımlama ve Sinyal GöndermeSinyallere BağlanmaArgümanlı SinyallerTekrar - Sağlık Sistemi10Tasarım Kalıpları 2. Bölüm
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik Kalıp2Sınıf Özellikleri
Örnek ve Statik DeğişkenlerStatik FonksiyonlarÖzellik AyarlayıcılarıÖzellik AlıcılarıGeleneksel Olarak ÖzelTekrar - Banka Hesabı Yöneticisi5Kapsülleme
Public ve Private ÜyelerSetter'larla DoğrulamaBilgi GizlemeSalt Okunur ÖzelliklerTekrar - Öğrenci Kayıt SistemiKendi başına pratik yap: Online GDScript derleyicisi