Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Buat Bomb yang menghitung mundur dan mengumumkan setiap langkah dengan sinyal.

  • Deklarasikan dua sinyal: beeped dan exploded.
  • tick() mengurangi fuse sebanyak 1. Jika fuse masih lebih besar dari 0, pancarkan beeped; jika nilainya sudah mencapai 0, pancarkan exploded.
  • 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: 0

Tulis 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!")
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