Sinyal dengan Argumen
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 38 dari 65.
Sebuah sinyal dapat membawa nilai. Cantumkan nilainya dalam deklarasi, seperti parameter pada sebuah fungsi:
signal damaged(amount: int, hp_left: int)
signal diedBerikan nilai ke emit() dalam urutan yang sama:
func take_damage(amount: int) -> void:
hp = maxi(hp - amount, 0)
damaged.emit(amount, hp)
if hp == 0:
died.emit()Fungsi yang terhubung menerima nilai sebagai parameternya, jadi fungsi tersebut memerlukan satu parameter untuk setiap nilai:
hero.damaged.connect(_on_hero_damaged)
func _on_hero_damaged(amount: int, hp_left: int) -> void:
print("-%d HP, %d left" % [amount, hp_left])Tipe dalam deklarasi mendokumentasikan nilai: GDScript tidak memeriksanya saat kamu memancarkan sinyal. Ketidakcocokan akan terlihat di fungsi penerima. Fungsi dengan jumlah parameter yang salah, atau parameter bertipe yang tidak dapat menampung nilai tersebut, menyebabkan error pada baris emit(), dan fungsi itu tidak dijalankan.
bind() menambahkan nilai milikmu sendiri setelah nilai yang dipancarkan. Satu method kemudian dapat mendengarkan beberapa hero dan tetap mengetahui hero mana yang terkena:
ada.damaged.connect(_on_damaged.bind("Ada"))
bo.damaged.connect(_on_damaged.bind("Bo"))
func _on_damaged(amount: int, hp_left: int, who: String) -> void:
print(who, " lost ", amount, " HP")Argumen memberikan data yang dibutuhkan listener, sehingga listener tidak perlu membacanya dari emitter. Jangan pernah menghubungkan lambda yang menggunakan object pemancar itu sendiri, seperti hero.died.connect(func(): print(hero.hp)): lambda membuat hero tetap hidup, hero mempertahankan lambda, keduanya tidak pernah dibebaskan, dan Godot melaporkan instance yang bocor saat program berakhir.
Tantangan
MudahSebuah dompet melaporkan setiap perubahan melalui sinyal yang membawa angka. Di Wallet, tambahkan parameter ke kedua sinyal dan tulis dua method berikut:
balance_changed(old_balance: int, new_balance: int)danpurchase_failed(price: int, missing: int)add(amount)menambahkan koin dan mengeluarkanbalance_changeddengan saldo sebelum dan sesudah perubahan.buy(price): jika saldo mencukupi, kurangi saldo sebesar harga dan keluarkanbalance_changed. Jika tidak, jangan ubah apa pun dan keluarkanpurchase_faileddengan harga dan jumlah koin yang kurang.
Kode yang disediakan menghubungkan satu fungsi ke setiap sinyal, membaca jumlah perintah berikutnya, menjalankan setiap perintah (add 20, buy 15) dan mencetak sisa koin di akhir. Untuk add 20, buy 15, buy 10, add 5, buy 10, kode ini mencetak:
Balance: 0 -> 20
Balance: 20 -> 5
Cannot buy for 10: 5 coins missing
Balance: 5 -> 10
Balance: 10 -> 0
Coins left: 0Tulis kodemu di wallet.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 wallet := Wallet.new()
wallet.balance_changed.connect(_on_balance_changed)
wallet.purchase_failed.connect(_on_purchase_failed)
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
if parts[0] == "add":
wallet.add(int(parts[1]))
else:
wallet.buy(int(parts[1]))
print("Coins left: ", wallet.balance)
func _on_balance_changed(old_balance: int, new_balance: int) -> void:
print("Balance: %d -> %d" % [old_balance, new_balance])
func _on_purchase_failed(price: int, missing: int) -> void:
print("Cannot buy for %d: %d coins missing" % [price, missing])
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