Nodes als Komponenten
Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 42 von 65.
Ein Node kann untergeordnete Nodes haben. Godot erstellt Spielobjekte auf diese Weise: Ein Heldenknoten erhält für jede Fähigkeit einen untergeordneten Knoten, etwa für Gesundheit oder Bewegung. Jedes untergeordnete Element ist eine Komponente: ein kleiner Knoten, der eine Aufgabe erfüllt.
# health.gd
class_name Health
extends Node
var hp := 10
func _ready() -> void:
print("Health ready")
# hero.gd
class_name Hero
extends Node
func _init() -> void:
var health := Health.new()
health.name = "Health"
add_child(health)
func _ready() -> void:
print("Hero ready, hp: ", $Health.hp)add_child() fügt einen Knoten als untergeordneten Knoten hinzu. Gib jeder Komponente einen name: get_node("Health") oder die Kurzform $Health findet das untergeordnete Element anhand dieses Namens. Ein Knoten ohne Namen oder mit einem Namen, der bereits von einem Geschwisterknoten verwendet wird, erhält automatisch einen Namen wie @Node@4.
Die Methode _ready() eines Knotens wird ausgeführt, wenn er in den Szenenbaum eintritt, den Baum der Knoten, in dem das Spiel läuft. main.gd befindet sich im Baum. Wenn du den Helden hinzufügst, werden daher beide _ready()-Methoden ausgeführt, zuerst die des Kindes:
# main.gd
var hero := Hero.new()
add_child(hero) # Health bereit, dann Hero bereit, hp: 10
print(hero.get_child_count()) # 1Ein übergeordnetes Element erreicht seine Komponenten mit get_children() (einem Array der untergeordneten Elemente in der Reihenfolge, in der sie hinzugefügt wurden), get_child_count() und has_node("Health"). Knoten im Baum werden zusammen mit dem Baum freigegeben, wenn das Spiel endet. Daher muss eine Komponente, die mit add_child() hinzugefügt wurde, nicht bereinigt werden.
Aufgabe
EinfachBaue einen Roboter aus Komponentenknoten.
ParterweitertNode. Sein Konstruktor erhält einen Teilenamen und einen Leistungswert: Er speichert die Leistung und setzt dennamedes Knotens auf den Teilenamen. Wenn ein Teil in den Szenenbaum eintritt, gibt sein_ready()Laser attachedaus.RoboterweitertNode.add_part(part_name, power)fügt ein neuesPartals untergeordneten Knoten hinzu. Wenn der Roboter bereits einen untergeordneten Knoten mit diesem Namen hat, gibt erLaser is already attachedaus und erstellt keinen.total_power()gibt die Summe der Leistung aller seiner Teile zurück.
Der bereitgestellte Code fügt den Roboter zum Szenenbaum hinzu, liest, wie viele Befehle folgen (add Laser 5, power), und gibt am Ende die Anzahl der Teile aus. Für add Laser 5, add Wheels 2, power, add Laser 9, add Arm 3, power gibt er Folgendes aus:
Laser attached
Wheels attached
Total power: 7
Laser is already attached
Arm attached
Total power: 10
Parts: 3Dein Code gehört in part.gd und robot.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 robot := Robot.new()
add_child(robot)
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
if parts[0] == "add":
robot.add_part(parts[1], int(parts[2]))
else:
print("Total power: ", robot.total_power())
print("Parts: ", robot.get_child_count())
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 – Formrechner2Klassenattribute
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