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 lambdaGodot 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 += 1Menghubungkan 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.
Tantangan
MudahLapangan tembak memiliki target yang mengeluarkan sinyal hit saat ditembak. Tulis ScoreBoard yang mendengarkan target tersebut:
watch(target)menghubungkan sinyalhitdari 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()menambahkan10kepointsdan mencetakHit! 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: 20Tulis 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)
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPclass dan objectKata Kunci selfmethodpropertyKonstruktor (_init)Ringkasan: Kalkulator Sederhana4Polimorfisme
Method Overriding Sekali LagiDuck TypingKelas Abstrak dan MethodDesain InterfaceRingkasan: Kalkulator Bentuk7Sinyal
Apa itu Sinyal?Mendeklarasikan dan MemancarkanMenghubungkan ke SinyalSinyal dengan ArgumenRangkuman, Sistem Kesehatan10Pola Desain Bagian 2
Pola CommandPola AdapterPola DecoratorPola Template MethodPola StatePola Composite2Property class
Variabel instance vs. variabel statisFungsi statisSetter propertyGetter propertyPrivat berdasarkan konvensiRangkuman: Pengelola Rekening Bank5Enkapsulasi
Member Publik dan PrivatValidasi dengan SetterPenyembunyian InformasiProperty Hanya-BacaRingkasan: Sistem Catatan Siswa8Konsep OOP Lanjutan
Komposisi vs PewarisanInner ClassNode sebagai KomponenRefCounted vs NodeEnum dalam Class11Proyek: Manajemen Perpustakaan
Gambaran Umum Proyekclass Buku dan PenggunaLatihan sendiri: Compiler GDScript online