Menu
CoddyTech

Apa itu Sinyal?

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 35 dari 65.

Berbagai hal terjadi pada object saat game berjalan: sebuah koin dikumpulkan, sebuah pintu terbuka, hp hero turun menjadi 0. Bagian lain dari program bereaksi terhadap peristiwa ini: skor bertambah, suara diputar, layar game over muncul.

Sinyal adalah pesan yang dikirim object saat sesuatu terjadi padanya. Object mengirimkan sinyal tersebut, dan setiap fungsi yang terhubung ke sinyal itu akan dijalankan:

# coin.gd
class_name Coin
extends RefCounted

signal collected

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

signal collected mendeklarasikan sinyal dan collected.emit() mengirimkannya. Koin tidak tahu siapa yang mendengarkan. Kode yang membutuhkan koin menghubungkan salah satu fungsinya sendiri ke sinyal tersebut:

# 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")

Output-nya adalah Coin picked up, Score +1, Done. Pemancaran langsung menjalankan fungsi yang terhubung, sebelum baris setelah emit(). Sinyal tanpa fungsi yang terhubung tidak melakukan apa pun saat dipancarkan.

Tanpa signal, collect() harus memanggil kode skor itu sendiri, sehingga setiap koin perlu memiliki referensi ke papan skor. Dengan signal, koin hanya mengumumkan peristiwa tersebut, lalu berapa pun jumlah pendengar, atau tidak ada sama sekali, dapat meresponsnya.

Node bawaan Godot bekerja dengan cara yang sama: Button mengeluarkan pressed saat diklik, dan Timer mengeluarkan timeout saat waktunya habis.

challenge icon

Tantangan

Mudah

Sebuah kotak surat mengumumkan surat baru dengan sebuah sinyal. Mailbox sudah mendeklarasikan signal mail_arrived dan memiliki penghitung letters. Tulis deliver(kind):

  • Jika kind adalah "letter", tambahkan 1 ke letters dan pancarkan mail_arrived.
  • Jenis lainnya (iklan, selebaran) dibuang: tidak ada yang berubah dan tidak ada yang dipancarkan.

Kode yang disediakan menghubungkan sebuah fungsi yang mencetak You've got mail!, lalu membaca jumlah baris berikutnya dan mengirimkan setiap baris. Baris away memutuskan hubungan dengan fungsi tersebut dan home menghubungkannya kembali, jadi surat yang tiba saat kamu sedang pergi tetap dihitung tetapi tidak diumumkan. Untuk baris letter, ad, away, letter, program mencetak:

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

Tulis kodemu di mailbox.gd. main.gd berisi kode input/output yang disediakan dan tidak dapat diedit.

Coba sendiri

extends Node

func _ready():
	# Kode input/output yang disediakan: biarkan apa adanya
	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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler GDScript online