クラス内の列挙型
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.STAFFweapon.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 がどこから来たのか分かります。
チャレンジ
簡単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)
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: GDScriptオンラインコンパイラ