Menu
CoddyTech

Métodos Setters de Propriedade

Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 11 de 65.

Uma propriedade pode executar código sempre que recebe um valor. Coloque dois-pontos após a declaração e adicione um bloco set(value): indentado, seu setter:

# player.gd
var health: int = 100:
	set(value):
		health = clampi(value, 0, 100)

value é o valor que está sendo atribuído. Dentro do setter, atribuir health armazena o valor na propriedade; isso não executa o setter novamente. Esse setter mantém health entre 0 e 100, independentemente do que o restante do programa atribuir:

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

O setter é executado a cada atribuição, inclusive dentro da classe: health -= 10 em um método de Player e health = start_health em _init() passam por ele. Somente o valor inicial após = na declaração é armazenado sem chamá-lo.

Um setter também pode recusar um valor. Se ele não atribuir um valor à propriedade, o valor antigo permanece:

var level: int = 1:
	set(value):
		if value > level:
			level = value

Deixe o tipo de fora de value: set(value: int): é um erro. O tipo da própria propriedade já indica o que ela contém.

challenge icon

Desafio

Fácil

Dê à propriedade health da classe Player em player.gd um setter que:

  • mantenha a saúde armazenada entre 0 e max_health: um valor maior é armazenado como max_health e um valor negativo como 0
  • imprima Player is down! quando a nova saúde for 0 e a saúde antiga estiver acima de 0

O código fornecido lê quantos comandos vêm a seguir e, então, um por linha: damage N (player.health -= N), heal N (player.health += N) ou set N (player.health = N). Após cada comando, ele imprime a saúde. Para damage 30, heal 50, damage 120 e heal 10, ele imprime:

Health: 70
Health: 100
Player is down!
Health: 0
Health: 10

Seu código deve ficar em player.gd. main.gd contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

extends Node

func _ready():
	# Código de entrada/saída fornecido: mantenha-o como está
	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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação orientada a objetos

Pratique por conta própria: Compilador de GDScript online