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.
Tantangan
MudahSebuah kotak surat mengumumkan surat baru dengan sebuah sinyal. Mailbox sudah mendeklarasikan signal mail_arrived dan memiliki penghitung letters. Tulis deliver(kind):
- Jika
kindadalah"letter", tambahkan1kelettersdan pancarkanmail_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: 2Tulis 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!")
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