Menu
CoddyTech

Deklarowanie i emitowanie

Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 36 z 65.

Zadeklaruj sygnał za pomocą słowa kluczowego signal i nazwy, na górze klasy obok jej zmiennych. Nazwa sygnału opisuje zdarzenie, które już się wydarzyło, i jest zapisana w formacie snake_case: died, door_opened, leveled_up. Klasa deklaruje tyle sygnałów, ile potrzebuje:

# 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()

Wyemituj sygnał w chwili wystąpienia zdarzenia i tylko wtedy. add_xp(50) na nowym graczu nie emituje niczego. add_xp(250), po którym wartość xp wynosi 300: sygnał leveled_up jest emitowany dwukrotnie, raz na każdy zdobyty poziom, a max_level_reached raz, podczas awansu na poziom 3.

Setter właściwości to dobre miejsce na wyemitowanie sygnału, ponieważ wtedy sygnał jest emitowany niezależnie od tego, jaki kod zmienia wartość:

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 zapobiega ponownemu wyemitowaniu died, gdy bohater z 0 HP zostanie ponownie trafiony.

Do sygnału można też odwołać się za pomocą jego nazwy zapisanej jako tekst: emit_signal("died") emituje go, hero.connect("died", _on_hero_died) łączy z nim, a hero.has_signal("died") zwraca true. Połączenie z nazwą, której obiekt nie deklaruje, powoduje błąd w chwili wykonania tej linii.

challenge icon

Wyzwanie

Łatwy

Napisz Bomb, która odlicza i sygnalizuje każdy krok.

  • Zadeklaruj dwa sygnały: beeped i exploded.
  • tick() zmniejsza fuse o 1. Jeśli lont nadal ma wartość większą niż 0, wyemituj beeped; jeśli osiągnął 0, wyemituj exploded.
  • Gdy lont osiągnie wartość 0, bomba eksplodowała: kolejne tyknięcia nic nie robią i niczego nie emitują.

Dostarczony kod odczytuje początkową wartość lontu i liczbę tyknięć do wykonania, łączy się z oboma sygnałami według ich nazw i wypisuje Beep oraz BOOM! z połączonych funkcji, a następnie pozostałą wartość lontu. Dla lontu o wartości 3 i 5 tyknięć wypisuje:

Beep
Beep
BOOM!
Fuse: 0

Umieść swój kod w pliku bomb.gd. main.gd zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

extends Node

func _ready():
	# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
	var bomb := Bomb.new(int(OS.read_string_from_stdin()))
	# connect() z nazwą sygnału jako tekstem
	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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator GDScript online