プロパティのセッター
CoddyのGDScriptジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 11/65。
プロパティは、値が代入されるたびにコードを実行できます。宣言の後にコロンを付け、インデントした set(value): ブロック(setter)を追加します。
# player.gd
var health: int = 100:
set(value):
health = clampi(value, 0, 100)valueは代入される値です。セッター内でhealthに代入すると、その値はプロパティに格納されます。セッターが再び実行されることはありません。このセッターは、プログラムのほかの部分から何が代入されても、healthを0から100の範囲内に保ちます。
var p := Player.new()
p.health -= 30
print(p.health) # 70
p.health = 250
print(p.health) # 100
p.health -= 500
print(p.health) # 0セッターは、クラス内でも、代入のたびに実行されます。Playerのメソッド内にあるhealth -= 10も、_init()内にあるhealth = start_healthも、セッターを通ります。セッターを呼び出さずに保存されるのは、宣言で=の後に指定された初期値だけです。
セッターは値を拒否することもできます。プロパティに値を代入しなければ、古い値がそのまま残ります。
var level: int = 1:
set(value):
if value > level:
level = valuevalueの型は省略します。set(value: int):はエラーです。プロパティ自体の型で、何を保持するかはすでに示されています。
チャレンジ
簡単player.gd 内のクラス Player のプロパティ health に、次の動作をする setter を設定してください。
- 保存される health を
0からmax_healthの範囲内に保つ。より大きな値はmax_healthとして、負の値は0として保存する - 新しい health が
0で、古い health が0より大きかった場合にPlayer is down!を出力する
提供されたコードは、後続するコマンドの数を読み取ったあと、1 行につき 1 つずつ次のコマンドを読み取ります。damage N(player.health -= N)、heal N(player.health += N)、または set N(player.health = N)です。各コマンドのあと、health を出力します。damage 30、heal 50、damage 120、heal 10 に対して、次のように出力します。
Health: 70
Health: 100
Player is down!
Health: 0
Health: 10コードは player.gd に記述してください。main.gd には提供された入出力コードがあり、編集できません。
自分で試してみよう
extends Node
func _ready():
# 提供された入出力コード:そのままにしてください
var player := Player.new()
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
var amount := int(parts[1])
if parts[0] == "damage":
player.health -= amount
elif parts[0] == "heal":
player.health += amount
elif parts[0] == "set":
player.health = amount
print("Health: %d" % player.health)
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: GDScriptオンラインコンパイラ