Menu
CoddyTech

プロパティのセッター

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 = value

valueの型は省略します。set(value: int):はエラーです。プロパティ自体の型で、何を保持するかはすでに示されています。

challenge icon

チャレンジ

簡単

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)
quiz icon腕試し

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

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

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