Mendeklarasikan dan Memancarkan
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 36 dari 65.
Deklarasikan signal dengan kata kunci signal dan sebuah nama, di bagian atas class, bersebelahan dengan variabelnya. Nama signal menjelaskan peristiwa yang sudah terjadi, dalam snake_case: died, door_opened, leveled_up. Sebuah class mendeklarasikan signal sebanyak yang dibutuhkannya:
# player.gd
class_name Player
extends RefCounted
signal leveled_up
signal max_level_reached
const MAX_LEVEL := 3
var level := 1
var xp := 0
func add_xp(amount: int) -> void:
xp += amount
while xp >= 100 and level < MAX_LEVEL:
xp -= 100
level += 1
leveled_up.emit()
if level == MAX_LEVEL:
max_level_reached.emit()Emit sinyal tepat saat peristiwanya terjadi, dan hanya saat itu. add_xp(50) pada pemain baru tidak mengemit apa pun. add_xp(250) setelahnya membuat xp mencapai 300: leveled_up diemisi dua kali, sekali untuk setiap level yang diperoleh, dan max_level_reached sekali, saat naik level yang mencapai level 3.
Setter property adalah tempat yang baik untuk memancarkan sinyal, karena sinyal tersebut kemudian aktif setiap kali kode mengubah nilai:
signal died
var hp: int = 10:
set(value):
var was_alive := hp > 0
hp = maxi(value, 0)
if was_alive and hp == 0:
died.emit()was_alive mencegah died dikeluarkan lagi saat hero dengan HP 0 terkena serangan sekali lagi.
Sebuah sinyal juga dapat diakses melalui namanya sebagai teks: emit_signal("died") memancarkannya, hero.connect("died", _on_hero_died) menghubungkannya, dan hero.has_signal("died") mengembalikan true. Menghubungkan ke nama yang tidak dideklarasikan oleh object akan menyebabkan error saat baris itu dijalankan.
Tantangan
MudahBuat Bomb yang menghitung mundur dan mengumumkan setiap langkah dengan sinyal.
- Deklarasikan dua sinyal:
beepeddanexploded. tick()mengurangifusesebanyak1. Jika fuse masih lebih besar dari0, pancarkanbeeped; jika nilainya sudah mencapai0, pancarkanexploded.- Setelah fuse bernilai
0, bom telah meledak: tick berikutnya tidak melakukan apa pun dan tidak memancarkan apa pun.
Kode yang disediakan membaca fuse awal dan jumlah tick yang akan dijalankan, menghubungkan kedua sinyal berdasarkan nama, lalu mencetak Beep dan BOOM! dari fungsi yang terhubung, kemudian mencetak sisa fuse. Untuk fuse 3 dan 5 tick, kode mencetak:
Beep
Beep
BOOM!
Fuse: 0Tulis kodemu di bomb.gd. main.gd berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
extends Node
func _ready():
# Kode input/output yang disediakan: biarkan apa adanya
var bomb := Bomb.new(int(OS.read_string_from_stdin()))
# connect() dengan nama sinyal sebagai teks
bomb.connect("beeped", _on_beeped)
bomb.connect("exploded", _on_exploded)
var ticks := int(OS.read_string_from_stdin())
for i in ticks:
bomb.tick()
print("Fuse: ", bomb.fuse)
func _on_beeped() -> void:
print("Beep")
func _on_exploded() -> void:
print("BOOM!")
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