Menu
CoddyTech

Deklarieren und Auslösen

Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 36 von 65.

Definiere ein Signal mit dem Schlüsselwort signal und einem Namen oben in der Klasse neben ihren Variablen. Ein Signalname beschreibt ein Ereignis, das bereits stattgefunden hat, in snake_case: died, door_opened, leveled_up. Eine Klasse definiert so viele Signale, wie sie benötigt:

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

Ein Signal wird genau in dem Moment ausgelöst, in dem sein Ereignis eintritt, und nur dann. add_xp(50) löst bei einem neuen Spieler nichts aus. add_xp(250) bringt xp auf 300: leveled_up wird zweimal ausgelöst, einmal pro erreichtem Level, und max_level_reached einmal, beim Levelaufstieg auf Level 3.

Ein Property-Setter eignet sich gut zum Auslösen, da das Signal dann ausgelöst wird, wenn der Wert durch Code geändert wird:

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 verhindert, dass died erneut ausgegeben wird, wenn ein Held mit 0 HP noch einmal getroffen wird.

Ein Signal kann auch über seinen Namen als Text angesprochen werden: emit_signal("died") löst es aus, hero.connect("died", _on_hero_died) verbindet sich damit, und hero.has_signal("died") gibt true zurück. Eine Verbindung zu einem Namen, den das Objekt nicht deklariert, ist ein Fehler, wenn diese Zeile ausgeführt wird.

challenge icon

Aufgabe

Einfach

Schreibe eine Bomb, die herunterzählt und jeden Schritt mit Signalen ankündigt.

  • Deklariere zwei Signale: beeped und exploded.
  • tick() verringert fuse um 1. Wenn die Zündschnur noch über 0 liegt, gib beeped aus; wenn sie 0 erreicht hat, gib exploded aus.
  • Sobald die Zündschnur 0 beträgt, ist die Bombe explodiert: Weitere Ticks bewirken nichts und geben nichts aus.

Der bereitgestellte Code liest die anfängliche Zündschnur und die Anzahl der auszuführenden Ticks ein, verbindet sich anhand des Namens mit beiden Signalen und gibt in den verbundenen Funktionen Beep und BOOM! aus, gefolgt von der verbleibenden Zündschnur. Bei einer Zündschnur von 3 und 5 Ticks gibt er Folgendes aus:

Beep
Beep
BOOM!
Fuse: 0

Dein Code gehört in bomb.gd. main.gd enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

extends Node

func _ready():
	# Vorgegebener Ein-/Ausgabecode: unverändert lassen
	var bomb := Bomb.new(int(OS.read_string_from_stdin()))
	# connect() mit dem Namen des Signals als Text
	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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-GDScript-Compiler