Les voy a mostrar una forma de aleatoriedad que podemos aplicar para las recompensas que el jugador recibe al abrir un cofre.

Puedes descargar el proyecto desde Aquí.


Creando los nodos

Para este tutorial necesitamos un cofre y las recompensas. Doy por hecho que ya tienen las recompensas, así que debemos hacer el cofre. Aquí el resumen:

  • Area2D (cofre): nodo principal, el área se encarga de representar un lugar donde puede ocurrir algo.
  • Sprite2D (spr): imagen de nuestro nodo principal.
  • CollisionShape2D (col): capa que recibe las colisiones de otros cuerpos o áreas.

Creando las señales

En la imagen de arriba, se puede ver que en la derecha del cofre hay un icono de señal. Para crear señales tenemos que hacer lo siguiente:

Primero nos dirigimos a la pestaña de «Nodo».

Ahí vamos a encontrar todas las señales que podemos emitir, vamos a centrarnos en dos especificas:

Para emitirlas tenemos que hacer doble clic en el nombre (body_entered, body_exited).

Cada vez que emitimos una señal, debemos buscar un script para conectarla. El que usaremos ahora es del cofre.


Programando en el script

Voy a explicar el código que hace funcionar la aleatoriedad en los cofres:

Primero definimos una variable para guardar el valor del jugador (se guardará después, primero tiene que ser null).

var jugador = null

Ahora tenemos que dirigirnos a la función _physics_process.

func _physics_process(delta):
	
	 # Cuando el jugador entre en el área, se quita el null
	if jugador != null:
		
		# Cuando se presione la tecla de Enter...
		if Input.is_action_just_pressed("abrir"):
			
			# Número aleatorio
			var num = int(rand_range(1,4))
			
			# Si da 1, el cofre se abre sin nada
			if num == 1:
				$spr.frame = 1
			else:
				# Se abre con oro
				$spr.frame = 2
				
				# Se crea la cantidad de monedas que la variable "num" indique.
				for i in range(num):
					var newCoin = preload("res://Moneda/moneda.tscn").instance()
					get_parent().add_child(newCoin)
					newCoin.global_position.x = global_position.x
					newCoin.global_position.y = global_position.y - (i+30)
			
			jugador = null

Para hacer que el cofre funcione, debemos comprobar que la variable del jugador ha dejado de ser «null» y ahora guarda el estado del jugador. Si eso se cumple, podemos pedir que al momento de presionar la tecla «Enter» (o la que quieran) se muestre el cofre.

Cada vez que se cumplen las condiciones, la variable «num» busca un nuevo valor aleatorio. Cuando usamos «rand_range(1,4)» estamos diciendo que se busque un número aleatorio dentro del 1 y el 4, ni más ni menos. Ese método nos devuelve un número con decimales, para que sea entero tenemos que poner el «int()» cubriendo el método.

En caso de que «num» sea 1, el cofre sólo cambia la imagen. Cuando «num» devuelve otro valor (2,3) el cofre se abre y se instancia la cantidad de monedas que «num» diga.

Recordemos que un bucle for se ejecuta la cantidad de veces que nosotros digamos, si el «num» devuelve un 2 entonces se ejecuta dos veces.

Después de abrir el cofre, el jugador vuelve a ser «null» para que no se quede sacando dinero eternamente.


Trabajando con las señales

En las últimas líneas de código del script, las funciones que usan las señales del cofre ya están creadas. Hay que usarlas para poner un valor en la variable «jugador».

La primera:

func _on_cofre_body_entered(body):
	if body.is_in_group("Jugadores"):
		jugador = body

El nombre de la función corresponde con la señal que elijamos. En el parámetro «body» se almacena el nodo que entre. Si comprobamos que el cuerpo se encuentra en el grupo de jugadores, podemos guardarlo en la variable «jugador» y el cofre puede abrirse mientras no se salga del área.

La segunda, última:

func _on_cofre_body_exited(body):	
	$spr.frame = 0
	if jugador != null:
		jugador = null

Esta es la señal para cuando el jugador salga. El cofre vuelve a su imagen cerrada y la variable «jugador» vuelve a ser null. Si no ponemos la variable en null desde aquí, vamos a poder sacar las monedas desde otro lugar aunque no estemos frente al cofre.


Ya hemos terminado. Si tienen una duda, pueden dejarla en los comentarios.

Los Sprites que he usado se pueden descargar en OpenGameArt.


César León

Nací en el mes de mayo. En 2014 empecé a estudiar sobre el desarrollo de vídeojuegos, un conflicto de mi vida fue descargar software privado sin pagar licencias. Godot formó un puente entre mi y el Software Libre, probé GNU/Linux y termine aceptando el sentimiento ético de la FSF. Feliz de desarrollar juegos Indie con Software Libre :').