Menu
CoddyTech

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.

challenge icon

Görev

Kolay

Geri sayım yapan ve her adımı sinyallerle bildiren bir Bomb yaz.

  • İki sinyal tanımla: beeped ve exploded.
  • tick(), fuse değerini 1 azaltır. Sigorta hâlâ 0'dan büyükse beeped sinyalini gönder; 0'a ulaştıysa exploded sinyalini gönder.
  • Sigorta 0 olduğ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: 0

Kodunu 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!")
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