Menu
CoddyTech

Métodos setter de propiedades

Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 11 de 65.

Una propiedad puede ejecutar código cada vez que se le asigna un valor. Pon dos puntos después de la declaración y añade un bloque set(value): con sangría: su setter:

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

value es lo que se está asignando. Dentro del setter, asignar health almacena el valor en la propiedad; no vuelve a ejecutar el setter. Este setter mantiene health entre 0 y 100, independientemente de lo que asigne el resto del programa:

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

El setter se ejecuta en cada asignación, también dentro de la clase: health -= 10 en un método de Player y health = start_health en _init() pasan por él. Solo el valor inicial después de = en la declaración se almacena sin llamarlo.

Un setter también puede rechazar un valor. Si no asigna la propiedad, el valor anterior se mantiene:

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

Omite el tipo de value: set(value: int): es un error. El tipo propio de la propiedad ya indica qué contiene.

challenge icon

Desafío

Fácil

Dale a la propiedad health de la clase Player en player.gd un setter que:

  • mantenga la salud almacenada entre 0 y max_health: un valor mayor se almacena como max_health y uno negativo como 0
  • imprima Player is down! cuando la nueva salud sea 0 y la salud anterior fuera mayor que 0

El código proporcionado lee cuántos comandos siguen y, después, uno por línea: damage N (player.health -= N), heal N (player.health += N) o set N (player.health = N). Después de cada comando, imprime la salud. Para damage 30, heal 50, damage 120 y heal 10, imprime:

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

Tu código va en player.gd. main.gd contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

extends Node

func _ready():
	# Código de entrada/salida proporcionado: mantenlo tal 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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de GDScript online