Menu
CoddyTech

Enums em Classes

Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 44 de 65.

Um enum pode ser declarado dentro de uma classe, ao lado de suas variáveis. As opções então pertencem a essa classe:

# 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, o enum é Kind. Todos os outros arquivos escrevem primeiro o nome da classe, Weapon.Kind.BOW, em valores, anotações de tipo e padrões 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

As opções ainda são números: Weapon.new(Weapon.Kind.BOW).kind imprime 1. O próprio enum funciona como um dicionário de nomes para 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))

O loop imprime SWORD: 20, BOW: 15 e STAFF: 30. GDScript não verifica se um número corresponde a uma das opções: Weapon.new(7) cria uma arma cujo kind é 7. Passe as opções nomeadas para manter o código correto.

Um enum que descreve uma classe deve ficar dentro dessa classe, para que o leitor veja de onde vem Kind em Weapon.Kind.BOW.

challenge icon

Desafio

Fácil

Ordene poções com um enum que fica na classe Potion.

  • Em potion.gd, declare enum Kind { HEAL, MANA, POISON } e defina o tipo de kind como Kind.
  • Potion.from_text(text, strength) é uma função estática que transforma "MANA" em Kind.MANA e retorna uma nova poção.
  • describe() retorna HEAL potion: +20 HP, MANA potion: +15 MP ou POISON potion: -5 HP, usando o nome do tipo e a força.
  • Em belt.gd, summary() retorna uma linha por tipo, na ordem do enum: HEAL: 2 (35 total), com o número de poções daquele tipo e, entre parênteses, a soma de suas forças. Tipos sem poções também recebem uma linha.

O código fornecido lê quantas poções vêm a seguir (HEAL 20), adiciona cada uma ao cinto, imprime sua descrição e, em seguida, o resumo. Para HEAL 20, POISON 5, HEAL 15, ele 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)

Seu código deve ficar em potion.gd e belt.gd. main.gd contém o código de entrada/saída fornecido e não pode ser editado.

Experimente você mesmo

extends Node

func _ready():
	# Código de entrada/saída fornecido: mantenha-o 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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação orientada a objetos

Pratique por conta própria: Compilador de GDScript online