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.
Aufgabe
EinfachSchreibe eine Bomb, die herunterzählt und jeden Schritt mit Signalen ankündigt.
- Deklariere zwei Signale:
beepedundexploded. tick()verringertfuseum1. Wenn die Zündschnur noch über0liegt, gibbeepedaus; wenn sie0erreicht hat, gibexplodedaus.- Sobald die Zündschnur
0beträ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: 0Dein 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!")
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort selfMethodenEigenschaftenKonstruktor (_init)Wiederholung – Einfacher Taschenrechner4Polymorphie
Methodenüberschreibung erneut betrachtetDuck-TypisierungAbstrakte Klassen und MethodenSchnittstellendesignRückblick – Formrechner7Signale
Was ist ein Signal?Deklarieren und AuslösenMit Signalen verbindenSignale mit ArgumentenRückblick – Gesundheitssystem2Klassenattribute
Instanz- vs. statische VariablenStatische FunktionenProperty-SetterProperty-GetterPrivat nach KonventionWiederholung – Bankkontenverwaltung5Kapselung
Öffentliche und private MemberValidierung mit SetternInformationsverbergenSchreibgeschützte EigenschaftenRückblick – System zur Schülerverwaltung8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungInnere KlassenNodes als KomponentenRefCounted vs. NodeEnums in Klassen11Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungVererbungskettenTypprüfungen mit isWiederholung – Mitarbeiterhierarchie6Spezielle Methoden
Einführung in virtuelle MethodenDie _to_string-MethodeBenutzerdefinierte IteratorenRückblick – Benutzerdefinierte Liste9Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBeobachter-MusterStrategie-Muster12Abschließende Herausforderungen
E-Learning-PlattformBankensystemEntwicklung von SpielfigurenFahrzeugvermietungÜbe selbstständig: Online-GDScript-Compiler