¿Qué son los setters/getters en GDScript?

por May 4, 2020Aprende, Godot Engine3 Comentarios

En varios tutoriales donde hago uso de la palabra reservada «setget», dejo el enlace con la explicación de la documentación oficial sobre esa función. Sea porque en una que otra ocasión me haya olvidado de enlazar al manual, o todavía no se entienda bien, llegan comentarios como: «¿Qué es eso de setget?».

Así que este domingo repasaré rápidamente con ustedes, los setters y getters en GDScript.

Planteamiento del problema

En nuestro juego de Godot hay diferentes escenas con sus nodos, esas escenas son elementos de una clase específica (Jugador, Inventario, Enemigo, Manzana). Generalmente estas escenas tienen un script principal desde el cual se administran los nodos hijos que la conforman.

Para eso podemos emplear una cantidad determinada de variables…

¿No han necesitado en algún momento ejecutar algo específico cuando una variable importante cambia su valor?

Exactamente para eso Godot tiene la herramienta de los setters. También se puede dar el caso de que queramos hacer algo si otra escena busca información sobre esa variable, ahí hablaríamos de los getters.

¿Cómo se usan los setters/getters?

Es básicamente como hacerle un seguimiento a las variables. Vayan al script donde tengan una variable que al ser llamada para asignarle o pedirle su valor, tenga que hacer algo extra.

Un ejemplo claro sería la variable «vidas», en el script del jugador. Para añadirle un setter y getter, tienen que colocar la palabra «setget» al lado de la variable, justo después de asignarle un valor.

export var lifes: int = 3 setget set_life

Al principio es una variable normal con valor 3. Si a la derecha está la palabra reservada «setget», tendremos que añadirle una función.

Lo que hace el setget es llamar a la función que indiquemos como «set», cuando se intente cambiar la variable. Esa función obligatoriamente tiene que estar dentro del mismo script y contar con un parámetro. Ese parámetro representa al nuevo valor que se está intentado dar a la variable.

La función que tengo es esta:

func set_life(new_life) -> void:
	lifes = new_life
	
	if lifes <= 0:
		state_machine.change_state("Dead")

Al principio haré que la variable «lifes» sea igual al nuevo valor que le quieren pasar. En caso de que ese valor sea menor o igual que cero, entonces moriré. Ustedes pueden hacer lo que quieran dentro de esta función.

Un caso donde puede llamarse a la variable «vidas»:

...
# El "body" es la escena del jugador, acaba de entrar en la zona de una #bala.
if body.get_name() == "Jugador":
    body.lifes -= 1

Dentro de la variable «body» está nuestro jugador. La clase Jugador. En este caso funcionaría nuestro «setget» y cuando hacemos «-= 1», se tomará el valor que tenía antes y se le restará uno nuevo. Algo así:

# new_life = lifes - 1
func set_life(lifes - 1) -> void:
	lifes = new_life
	
	if lifes <= 0:
		state_machine.change_state("Dead")

La única forma de que no funcione un setget, es porque cambiamos el valor de la variable dentro del script donde se creó, de la siguiente manera:

lifes -= 1

Si van a cambiar el valor de una variable que tiene activado el «setget», hay que acceder a esa variable como si te estuvieses refiriendo a la clase del script. Así:

self.lifes -= 1

La palabra reservada «self» indica que nos estamos refiriendo a la variable «lifes» del objeto que somos nosotros mismos.

Seguro notaron que no uso la función «getter». Si la quieren activar junto a un setter sólo hay que separarla con una coma. Así:

export var lifes: int = 3 setget set_life, get_life

Y crean una función con el mismo nombre «get_life»:

func get_life():
    return lifes

Eso de arriba es un uso básico de un getter. Si sólo van a hacer eso entonces mejor que no active esa función.

En caso de que no quieran usar el setter, pero sí el getter, dejas vacío el primer espacio y pones una coma:

export var lifes: int = 3 setget ,get_life

Y bueno… no queda mucho más para decir. Si todavía hay dudas puedes dejar un comentario y te atenderé lo antes posible.

¡Comenta! 👇️

3 Comentarios

  1. Juan Diego

    Tio, no lo he leido, pero ya estoy adorando esta entrada. Gracias por responder la duda que tenia XD. Lo aprecio un montón 🙂

    Responder
  2. Juan Diego

    Por cierto, en esta entrada no me deja poner comentarios. Quería agradecerte por la canlidad de la información, pero no pude comentar. No sé si es cosa de mi navegador, pero como podrás comprobar, en este si pude comentar XD.

    https://indielibre.com/2018/04/04/como-instanciar-escenas-en-godot/

    Te recomendaria que lo vieses. Me recorcomería no poder agradecerte o resaltar alguna duda que tuviese en una entrada.

    Responder
    • César León

      Es curioso jaja. Creo que el problema es que la entrada es muy vieja… o algo raro con el WordPress porque la verdad debería funcionar xD. Gracias por comentar amigo 🙂

      Responder

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Avances y actualizaciones – DevLog 4

Avances y actualizaciones – DevLog 4

Hoy presentaré dos actualizaciones importantes: la primera son avances del jueguito de naves que mencioné hace unos días, la segunda es una mejora para el asset de máquina de estados que tengo en itch (esto involucra una actualización para el demo de Kings and Pigs)....