Menu
CoddyTech

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 died

Berikan 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.

challenge icon

Tantangan

Mudah

Sebuah 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) dan purchase_failed(price: int, missing: int)
  • add(amount) menambahkan koin dan mengeluarkan balance_changed dengan saldo sebelum dan sesudah perubahan.
  • buy(price): jika saldo mencukupi, kurangi saldo sebesar harga dan keluarkan balance_changed. Jika tidak, jangan ubah apa pun dan keluarkan purchase_failed dengan 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: 0

Tulis 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])
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