Menu
CoddyTech

Enums en clases

Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 44 de 65.

Un enumerado puede declararse dentro de una clase, junto a sus variables. Las opciones pertenecen entonces a esa clase:

# 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

Dentro de weapon.gd, la enumeración es Kind. En todos los demás archivos, primero se escribe el nombre de la clase, Weapon.Kind.BOW, en los valores, en las anotaciones de tipo y en los patrones de match:

# 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

Las opciones siguen siendo números: Weapon.new(Weapon.Kind.BOW).kind imprime 1. El propio enum funciona como un diccionario que relaciona nombres con números:

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

El bucle imprime SWORD: 20, BOW: 15 y STAFF: 30. GDScript no comprueba que un número sea una de las opciones: Weapon.new(7) crea un arma cuyo kind es 7. Pasa las opciones con nombre y el código seguirá siendo correcto.

Una enumeración que describe una clase debe estar dentro de esa clase, para que el lector vea de dónde viene Kind en Weapon.Kind.BOW.

challenge icon

Desafío

Fácil

Ordena las pociones con un enum que se encuentra en la clase Potion.

  • En potion.gd, declara enum Kind { HEAL, MANA, POISON } y asigna a kind el tipo Kind.
  • Potion.from_text(text, strength) es una función estática que convierte "MANA" en Kind.MANA y devuelve una poción nueva.
  • describe() devuelve HEAL potion: +20 HP, MANA potion: +15 MP o POISON potion: -5 HP, usando el nombre del tipo y la fuerza.
  • En belt.gd, summary() devuelve una línea por cada tipo, en el orden del enum: HEAL: 2 (35 total), con el número de pociones de ese tipo y, entre paréntesis, la suma de sus fuerzas. Los tipos que no tengan pociones también reciben una línea.

El código proporcionado lee cuántas pociones vienen a continuación (HEAL 20), añade cada una al cinturón, imprime su descripción y después el resumen. Para HEAL 20, POISON 5, HEAL 15, imprime:

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)

Tu código va en potion.gd y belt.gd. main.gd contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

extends Node

func _ready():
	# Código de entrada/salida proporcionado: mantenlo tal como está
	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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de GDScript online