Godot GDScript'te Sinyal Sistemi: Event-Driven Oyun Mimarisi
Godot'da sinyaller, düğümler (node) arasında gevşek bağlı iletişim kurmanın en temiz yoludur. Oyun tasarımında bir düğümün başka bir düğümü doğrudan çağırmasını önler; bunun yerine 'bir şey oldu' mesajı yayınlarsınız ve ilgilenen herkes dinler.
Örnek: Bir karakter ölüyor. Sağlık sistemi, UI, ses efektleri ve parçacık efektleri aynı anda tepki vermelidir. Sinyaller olmasa hepsini kod içinde zincir halinde çağırmanız gerekir. Sinyallerle her sistem bağımsız dinler.
İlk olarak özel bir sinyal tanımlayın:
1extends Node23signal health_changed(new_health)4signal player_died56var health = 10078func take_damage(amount):9health -= amount10emit_signal("health_changed", health)11if health <= 0:12emit_signal("player_died")Başka bir düğüm bu sinyalleri dinler:
1extends CanvasLayer23func _ready():4var player = get_node("/root/Player")5player.connect("health_changed", self, "_on_health_changed")6player.connect("player_died", self, "_on_player_died")78func _on_health_changed(new_health):9$HealthLabel.text = "HP: " + str(new_health)1011func _on_player_died():12$DeadScreen.show()Eğer birden fazla dinleyici varsa, hepsi aynı anda tetiklenir:
1# Ses sistemi2func _on_player_died():3$AudioStreamPlayer.stream = load("res://sounds/death.ogg")4$AudioStreamPlayer.play()56# Parçacık efekti7func _on_player_died():8var particles = preload("res://effects/death_particles.tscn").instance()9get_parent().add_child(particles)10particles.global_position = global_positionBeklenen çıktı: Karakter sağlığı 0'a düştüğünde UI güncellenir, ses çalar ve efekt oynatılır, hepsi aynı sinyal tetiklemesinden.
Sık yapılan hata: Dinleyiciyi kaldırırken `disconnect()` kullanmayı unutmak. Düğüm silinirse bellek sızıntısı oluşur. Temiz kod için:
1func _exit_tree():2var player = get_node_or_null("/root/Player")3if player:4player.disconnect("player_died", self, "_on_player_died")Sinyaller oyun mimarisini modüler ve bakımı kolay hale getirir. Her sistem kendi işine bakar, başkasını bilmez.
0 yorum