Menu
CoddyTech

Menghubungkan ke Sinyal

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

connect() menerima fungsi yang akan dijalankan, sebagai Callable. Sebutkan method tanpa tanda kurung, atau tulis lambda:

chest.opened.connect(_on_chest_opened)          # method dari skrip ini
chest.opened.connect(quest_log.add_entry)       # method dari object lain
chest.opened.connect(func(): print("Creak!"))   # sebuah lambda

Godot menamai method pendengar dengan _on_, lalu emitter, kemudian signal: _on_chest_opened. Sebuah signal dapat memiliki banyak fungsi yang terhubung, dan fungsi-fungsi tersebut dijalankan sesuai urutan saat terhubung.

object yang mendengarkan biasanya menghubungkan dirinya sendiri dalam sebuah method yang menerima emitter:

# quest_log.gd
class_name QuestLog
extends RefCounted

var chests_opened := 0

func track(chest: Chest) -> void:
	if not chest.opened.is_connected(_on_chest_opened):
		chest.opened.connect(_on_chest_opened)

func untrack(chest: Chest) -> void:
	if chest.opened.is_connected(_on_chest_opened):
		chest.opened.disconnect(_on_chest_opened)

func _on_chest_opened() -> void:
	chests_opened += 1

Menghubungkan fungsi yang sama ke sinyal yang sama dua kali akan menyebabkan error, begitu juga memutuskan koneksi fungsi yang tidak terhubung. Periksa terlebih dahulu dengan is_connected(). disconnect() menghentikan proses mendengarkan, dan pemanggilan emit berikutnya tidak lagi menjalankan fungsi tersebut.

Teruskan CONNECT_ONE_SHOT sebagai argumen kedua, lalu koneksi akan menghapus dirinya sendiri setelah pemanggilan pertama: chest.opened.connect(_on_first_open, CONNECT_ONE_SHOT).

Lambda menyimpan nilai yang dimiliki variabel lokal saat lambda dibuat. count += 1 di dalam lambda yang terhubung mengubah salinan itu, dan count di _ready() tetap 0. Simpan penghitung dalam variabel anggota sebuah object listener, seperti yang dilakukan QuestLog.

challenge icon

Tantangan

Mudah

Lapangan tembak memiliki target yang mengeluarkan sinyal hit saat ditembak. Tulis ScoreBoard yang mendengarkan target tersebut:

  • watch(target) menghubungkan sinyal hit dari target ke _on_target_hit. Mengawasi target yang sudah diawasi tidak mengubah apa pun.
  • ignore(target) memutus hubungannya. Mengabaikan target yang tidak sedang diawasi tidak mengubah apa pun.
  • _on_target_hit() menambahkan 10 ke points dan mencetak Hit! Score: N.

Mengawasi target dua kali atau mengabaikan target yang tidak diawasi tidak boleh menyebabkan error, karena error apa pun akan membuat tes gagal. target.gd sudah lengkap.

Kode yang disediakan membaca jumlah target, lalu perintah seperti watch 0, ignore 0, dan shoot 0, lalu mencetak skor akhir. Untuk dua target dan perintah watch 0, shoot 0, shoot 1, watch 1, watch 1, shoot 1, ignore 0, shoot 0, kode tersebut mencetak:

Shot target 0
Hit! Score: 10
Shot target 1
Shot target 1
Hit! Score: 20
Shot target 0
Final score: 20

Tulis kodemu di score_board.gd dan target.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 board := ScoreBoard.new()
	var targets: Array[Target] = []
	for i in int(OS.read_string_from_stdin()):
		targets.append(Target.new())
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		var target := targets[int(parts[1])]
		if parts[0] == "watch":
			board.watch(target)
		elif parts[0] == "ignore":
			board.ignore(target)
		else:
			print("Shot target ", parts[1])
			target.shoot()
	print("Final score: ", board.points)
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