内部クラス
CoddyのGDScriptジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 41/65。
クラスは、キーワード class、名前、インデントされた本体を使って、その中に別のクラスを宣言できます。この内部クラスは、外側のクラスに属する補助的な型です:
# inventory.gd
class_name Inventory
extends RefCounted
const MAX_STACK := 5
class Slot:
var item_name: String
var count: int
func _init(new_name: String, new_count: int) -> void:
item_name = new_name
count = mini(new_count, MAX_STACK)
func _to_string() -> String:
return "%s x%d" % [item_name, count]
var slots: Array[Slot] = []
func add(item_name: String, count: int) -> Slot:
var slot := Slot.new(item_name, count)
slots.append(slot)
return slotinventory.gd 内では、内部クラスは Slot です。他のファイルからは、外側のクラスを通じてアクセスします:Inventory.Slot。
# main.gd
var bag := Inventory.new()
bag.add("Potion", 9)
var arrows: Inventory.Slot = bag.add("Arrow", 3)
print(bag.slots) # [Potion x5, Arrow x3]
var gem := Inventory.Slot.new("Gem", 1)extendsを持たない内部クラスはRefCountedを継承し、他のクラスと同様に変数、コンストラクター、メソッドを持つことができます。外側のクラスの定数や列挙型(上記のMAX_STACK)は使用できますが、メンバー変数は使用できません。Slotはslotsにアクセスできません。スロットは独立したオブジェクトだからです。必要な値はコンストラクターに渡してください。
インベントリのスロットやスコア表のエントリなど、外側のクラスと組み合わせて初めて意味を持つ小さな型には、内部クラスを使います。ゲームの他の部分で単独で使われる型には、独自のファイルとclass_nameを用意するのが適切です。
チャレンジ
簡単エントリーが内部クラスであるLeaderboardを作成します。
Leaderboard内に内部クラスEntryを宣言します。コンストラクターでplayer_nameとscoreを設定し、_to_string()はAda: 120を返します。entriesはEntryの型付き配列で、プレイヤーが最初に登場した順に並べます。submit(player, score)は、新しいプレイヤーのエントリーを追加します。すでにエントリーがあるプレイヤーの場合は、2つのスコアのうち高い方を保持します。best()は、スコアが最も高いエントリーを返します。同点の場合は、先に登場したエントリーが優先されます。
用意されたコードは、後に続くスコアの個数(Ada 120)を読み取り、それらを登録した後、すべてのエントリーと最高のエントリーを出力します(スコアは少なくとも1つ与えられます)。Ada 120、Bo 90、Ada 80、Bo 150、Cy 150の場合、次のように出力します。
Ada: 120
Bo: 150
Cy: 150
Best: Bo: 150コードはleaderboard.gdに記述します。main.gdには用意された入出力コードが含まれており、編集できません。
自分で試してみよう
extends Node
func _ready():
# 提供された入出力コード:そのままにしてください
var board := Leaderboard.new()
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
board.submit(parts[0], int(parts[1]))
for entry in board.entries:
print(entry)
print("Best: ", board.best())
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: GDScriptオンラインコンパイラ