Menu
CoddyTech

Enums in Klassen

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

Ein Enum kann innerhalb einer Klasse neben ihren Variablen deklariert werden. Die Optionen gehören dann zu dieser Klasse:

# weapon.gd
class_name Weapon
extends RefCounted

enum Kind { SWORD, BOW, STAFF }

var kind: Kind

func _init(weapon_kind: Kind) -> void:
	kind = weapon_kind

func is_ranged() -> bool:
	return kind == Kind.BOW or kind == Kind.STAFF

In weapon.gd heißt das Enum Kind. In jeder anderen Datei steht zuerst der Klassenname, Weapon.Kind.BOW, in Werten, Typannotationen und match-Mustern:

# blacksmith.gd
class_name Blacksmith
extends RefCounted

static func repair_cost(kind: Weapon.Kind) -> int:
	match kind:
		Weapon.Kind.SWORD:
			return 20
		Weapon.Kind.BOW:
			return 15
	return 30

Die Optionen sind weiterhin Zahlen: Weapon.new(Weapon.Kind.BOW).kind gibt 1 aus. Das Enum selbst funktioniert wie ein Wörterbuch, das Namen Zahlen zuordnet:

print(Weapon.Kind.keys())       # ["SWORD", "BOW", "STAFF"]
print(Weapon.Kind.find_key(1))  # BOW
print(Weapon.Kind["STAFF"])     # 2
print(Weapon.Kind.size())       # 3
for kind in Weapon.Kind.values():
	print(Weapon.Kind.find_key(kind), ": ", Blacksmith.repair_cost(kind))

Die Schleife gibt SWORD: 20, BOW: 15 und STAFF: 30 aus. GDScript prüft nicht, ob eine Zahl eine der Optionen ist: Weapon.new(7) erzeugt eine Waffe, deren kind 7 ist. Übergib die benannten Optionen, dann bleibt der Code korrekt.

Ein Enum, das eine Klasse beschreibt, gehört in diese Klasse, damit Leser sehen, woher Kind in Weapon.Kind.BOW kommt.

challenge icon

Aufgabe

Einfach

Sortiere Tränke mit einer Aufzählung, die in der Klasse Potion enthalten ist.

  • Definiere in potion.gd enum Kind { HEAL, MANA, POISON } und gib kind den Typ Kind.
  • Potion.from_text(text, strength) ist eine statische Funktion, die "MANA" in Kind.MANA umwandelt und einen neuen Trank zurückgibt.
  • describe() gibt HEAL potion: +20 HP, MANA potion: +15 MP oder POISON potion: -5 HP zurück und verwendet dabei den Namen der Art und die Stärke.
  • In belt.gd gibt summary() eine Zeile pro Art in der Reihenfolge der Aufzählung zurück: HEAL: 2 (35 total), mit der Anzahl der Tränke dieser Art und in Klammern der Summe ihrer Stärke. Auch Arten ohne Tränke erhalten eine Zeile.

Der bereitgestellte Code liest ein, wie viele Tränke folgen (HEAL 20), fügt jeden dem Gürtel hinzu, gibt dessen Beschreibung aus und danach die Zusammenfassung. Für HEAL 20, POISON 5, HEAL 15 gibt er Folgendes aus:

Added HEAL potion: +20 HP
Added POISON potion: -5 HP
Added HEAL potion: +15 HP
HEAL: 2 (35 total)
MANA: 0 (0 total)
POISON: 1 (5 total)

Dein Code gehört in potion.gd und belt.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 belt := Belt.new()
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		var potion := Potion.from_text(parts[0], int(parts[1]))
		belt.add(potion)
		print("Added ", potion.describe())
	for line in belt.summary():
		print(line)
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