learnGodot

A cookbook for Godot games :robot:

This project is maintained by Beelzenef

Colisiones

Una colisión se produce cuando dos nodos entran en contacto, en concreto el área definida por sus CollisionShapes (círculos, rectácgulos…).

Las colisiones se pueden producir constantemente, pero podemos detectar algunas de forma concreta con algunos nodos. El nodo Area2D provee funcionalidades para detectar colisiones, y vamos a utilizarlo para el ejemplo.

Pero primero vamos a necesitar identificar de forma concreta el nodo o nodos que va a colisionar, como por ejemplo, el nodo que será nuestro personaje a controlar. Imaginemos un juego en el que hay que coleccionar una serie de objetos de cualquier tipo, y nuestro personaje recorre el escenario para hacerse con ellos.

Seleccionando el nodo principal de nuestro personaje, acudimos a su Inspector, clicando en la pestaña de Node.

Generando colisiones

Allí verás un botón llamado “Group”. Una vez seleccionado, encontrarás una caja de texto en la que puedes añadir Grupos. Añadiendo un grupo al nodo, como por ejemplo “Player”, estamos listos para continuar.

Añadiremos ahora otro nodo a la escena que será nuestro objeto coleccionable. Su tipo será Area2D. Cuando tenga su CollisionShape y su sprite asociado, será hora de pasar a la acción con un script adjunto.

Con el nodo de Area2D, vuelve a su Inspector, a la pestaña Node. Vamos a utilizar las Señales o Signals, que son los eventos predefinidos en la engine para personalizar su comportamiento. En las Señales, buscaremos la llamada “body_entered”. ¿Sobre qué script vamos a escribir su contenido? Pues nada menos que el que acabamos de crear para este nodo, y veremos código generado automáticamente una vez confirmemos esa ruta.

El código en esa nueva función, probablemente llamada “on_Area2D_body_entered” si no hemos renombrado el nodo, escribiremos el código.

func on_Area2D_body_entered (body):
    if body.is_in_group("Player"):
        print "¡Colisión con nodo jugador!"
    pass

El parámetro body no es más que el objeto con el que se produce la colisión. Podría ser cualquier cosa, y es por eso que comprobamos que este pertenece al grupo “Player”.

Destrucción de objetos

Cuando se produce una colisión, es lógico que el collecionable desaparezca de la escena, ¿verdad? Es el momento de destruir objetos gracias a colisiones.

Llamamos al método “queue_free()” que destruye un objeto, en este caso, el propio coleccionable.

func on_Area2D_body_entered (body):
    if body.is_in_group("Player"):
        print "¡Colisión con nodo jugador!"
        queue_free()
    pass

Si queremos destruir el objeto jugador, que colisiona con el coleccionable, es tan fácil como agregar:

func on_Area2D_body_entered (body):
    if body.is_in_group("Player"):
        print "¡Colisión con nodo jugador!"
        body.queue_free()

Es un código válido para acabar con el personaje jugador si impacta con un enemigo o un proyectil que le hiere.

Por supuesto, body nos permite acceder al nodo del jugador, a todos sus métodos y variables… así pues ¡que comience la diversión!


Volver a inicio

Página anterior, inputs

Siguiente página, importando nodos