Tanımlama ve Sinyal Gönderme
Coddy'nin GDScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 36 / 65.
Bir sinyali, signal anahtar sözcüğünü ve bir adı kullanarak, sınıfın en üstünde değişkenlerinin yanına tanımla. Sinyal adı, snake_case biçiminde, zaten gerçekleşmiş bir olayı tanımlar: died, door_opened, leveled_up. Bir sınıf, ihtiyaç duyduğu sayıda sinyal tanımlar:
# 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()Bir sinyali, olayı gerçekleştiği anda ve yalnızca o zaman yayınla. Yeni bir oyuncuda add_xp(50) hiçbir şey yayınlamaz. xp değerini 300'e çıkaran add_xp(250) çağrısından sonra leveled_up iki kez, kazanılan her seviye için bir kez; max_level_reached ise 3. seviyeye ulaşan seviye atlamada bir kez yayınlanır.
Bir özellik ayarlayıcısı, sinyal göndermek için iyi bir yerdir; çünkü sinyal, değeri değiştiren kod ne olursa olsun tetiklenir:
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, 0 HP'ye sahip bir kahramana tekrar vurulduğunda died olayının yeniden tetiklenmesini önler.
Bir sinyale metin olarak adı üzerinden de erişilebilir: emit_signal("died") sinyali gönderir, hero.connect("died", _on_hero_died) sinyale bağlanır ve hero.has_signal("died") true değerini döndürür. Nesnenin tanımlamadığı bir ada bağlanmak, bu satır çalıştığında hataya neden olur.
Görev
KolayGeri sayım yapan ve her adımı sinyallerle bildiren bir Bomb yaz.
- İki sinyal tanımla:
beepedveexploded. tick(),fusedeğerini1azaltır. Sigorta hâlâ0'dan büyüksebeepedsinyalini gönder;0'a ulaştıysaexplodedsinyalini gönder.- Sigorta
0olduğunda bomba patlamıştır: sonraki tikler hiçbir şey yapmaz ve hiçbir sinyal göndermez.
Sağlanan kod başlangıç sigorta değerini ve çalıştırılacak tik sayısını okur, her iki sinyale de adlarıyla bağlanır ve bağlı işlevlerden Beep ile BOOM! yazdırır; ardından kalan sigorta değerini yazdırır. Sigorta değeri 3 ve tik sayısı 5 olduğunda şu çıktıyı verir:
Beep
Beep
BOOM!
Fuse: 0Kodunu bomb.gd dosyasına yaz. main.gd sağlanan giriş/çıkış kodunu içerir ve düzenlenemez.
Kendin dene
extends Node
func _ready():
# Sağlanan giriş/çıkış kodu: olduğu gibi bırakın
var bomb := Bomb.new(int(OS.read_string_from_stdin()))
# connect() işlevini sinyalin adını metin olarak vererek kullanın
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!")
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