Menu
CoddyTech

クラス内の列挙型

CoddyのGDScriptジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 44/65。

列挙型はクラス内で、その変数の隣に宣言できます。すると、選択肢はそのクラスに属します。

# 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

weapon.gd 内では、列挙型は Kind です。他のすべてのファイルでは、値、型注釈、match パターンの中で、クラス名を先に書いて Weapon.Kind.BOW とします。

# 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

選択肢は引き続き数値です。Weapon.new(Weapon.Kind.BOW).kind は 1 を出力します。列挙型自体は、名前から数値への辞書のように機能します。

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

ループはSWORD: 20、BOW: 15、STAFF: 30を出力します。GDScriptは数値が選択肢のいずれかであるかをチェックしません。Weapon.new(7)は、kindが7である武器を作成します。名前付きの選択肢を渡せば、コードは正しく動作します。

あるクラスを表す enum はそのクラスの中に置くと、読者は Weapon.Kind.BOW の Kind がどこから来たのか分かります。

challenge icon

チャレンジ

簡単

Potionクラス内にあるenumを使ってポーションを分類します。

  • potion.gdでenum Kind { HEAL, MANA, POISON }を宣言し、kindの型をKindにします。
  • Potion.from_text(text, strength)は、"MANA"をKind.MANAに変換して新しいポーションを返す静的関数です。
  • describe()は、種類の名前と強さを使って、HEAL potion: +20 HP、MANA potion: +15 MP、またはPOISON potion: -5 HPを返します。
  • belt.gdで、summary()はenumの順序で種類ごとに1行を返します: HEAL: 2 (35 total)。各行にはその種類のポーションの数と、括弧内に強さの合計が含まれます。ポーションがない種類も行に含めます。

提供されたコードは、続くポーションの数(HEAL 20)を読み取り、それぞれをベルトに追加して、説明を出力した後に要約を出力します。HEAL 20、POISON 5、HEAL 15の場合、次のように出力されます:

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)

コードはpotion.gdとbelt.gdに記述します。main.gdには提供された入出力コードがあり、編集できません。

自分で試してみよう

extends Node

func _ready():
	# 提供された入出力コード:そのままにしてください
	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 icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: GDScriptオンラインコンパイラ