Usando Area2D

Introducción

Godot ofrece una variedad de objetos de colisión para proveer detección y respuesta a colisiones. Tratar de decidir cuál usar para tu proyecto puede ser confuso. Puedes evitar problemas y simplificar el desarrollo si comprendes cómo funciona cada uno de ellos y cuáles son sus pros y contras. En este tutorial, veremos el nodo Area2D y mostraremos algunos ejemplos de cómo puede ser usado.

Nota

Este documento asume que los varios cuerpos físicos de Godot te son familiares. Por favor lee primero Introducción a la física.

¿Qué es un área?

Un Area2D determina una zona del espacio 2D. En este espacio puedes detectar otros nodos CollisionObject2D superpuestos, entrando, y saliendo. Las áreas además permiten sobrescribir localmente las propiedades físicas. Exploraremos cada una de esas funciones abajo.

Propiedades del área

Las áreas tienen muchas propiedades que puedes usar para personalizar su comportamiento.

../../_images/area2d_properties.png

Las primeras ocho propiedades se usan para configurar el comportamiento de la física del área. Veremos cómo usarlos en la sección de abajo.

Monitoring y Monitorable son usados para habilitar y deshabilitar el área.

La sección "Collision" es donde configurarás las capas y máscaras (layer y mask) de colisión del área.

La sección "Audio Bus" te permite reemplazar el audio en el área, por ejemplo para aplicar un efecto de audio cuando el jugador se mueve a través de esta.

Ten en cuenta que Area2D extiende de CollisionObject2D, por lo que además provee propiedades heredadas de esa clase, como input_pickable.

Detección de superposición

Quizás el uso más común de un nodo Area2D es para la detección de contactos y superposición. Cuando necesitas saber que dos objetos se han tocado, pero no necesitas una colisión física, puedes usar una área para que te notifique del contacto.

Por ejemplo, digamos que estamos haciendo una moneda para que el jugador la recoja. La moneda no es un objeto sólido - el jugador no puede pararse sobre ella o empujarla - nosotros solo queremos que esta desaparezca cuando el jugador la toque.

Aquí está la configuración del nodo para la moneda:

../../_images/area2d_coin_nodes.png

Para detectar la superposición, conectaremos la señal apropiada en el Area2D. Cuál señal usar dependerá del tipo de nodo del jugador. Si el jugador es otra área, usaremos area_entered. Sin embargo, asumamos que nuestro jugador es un KinematicBody2D (y por lo tanto es del tipo CollisionObject2D), entonces conectaremos la señal body_entered.

Nota

Si no estás familiarizado con el uso de señales, mira Señales para una introducción.

extends Area2D

func _on_Coin_body_entered(body):
    queue_free()
public class Coin : Area2D
{

    public void OnCoinBodyEntered(PhysicsBody2D body)
    {
        QueueFree();
    }
}

¡Ahora nuestro jugador puede recolectar las monedas!

Otros ejemplos de uso:

  • Las áreas son excelentes para las balas y otros proyectiles que golpean y causan daño, pero que no necesitan ninguna otra física como el rebote.
  • Usar un área circular grande alrededor de un enemigo para definir su radio de "detección". Cuando el jugador está fuera del área, el enemigo no lo puede "ver".
  • "Cámaras de seguridad" - En un nivel grande con múltiples cámaras, agregar áreas a cada cámara y activarlas cuando el jugador entre.

Consulta Tu primer juego para ver un ejemplo del uso de Area2D en un juego.

Influencia del área

El segundo mayor uso de los nodos área es para alterar las físicas. Por defecto, el área no lo hará, pero puedes habilitarlo con la propiedad Space Override. Cuando las áreas se superponen, son procesadas en orden de Priority (prioridad) (las áreas con prioridad mayor son procesadas primero). Hay cuatro opciones para sobrescribir:

  • Combine - El área añade sus valores a lo que se a calculado hasta el momento.
  • Replace - El área reemplaza las propiedades físicas, y las áreas con prioridad menor son ignoradas.
  • Combine-Replace - El área añade sus valores de gravedad/amortiguación a lo que se ha calculado hasta ahora (en orden de prioridad), ignorando cualquier área de menor prioridad.
  • Replace-Combine - El área reemplaza cualquier gravedad/amortiguación calculada hasta ahora, pero sigue calculando el resto de las áreas.

Usando estas propiedades, puedes crear comportamientos muy complejos con múltiples áreas superpuestas.

Las propiedades físicas que pueden ser sobrescritas son:

  • Gravity - La fuerza de gravedad dentro del área.
  • Gravity Vec - La dirección de la gravedad. Este vector no necesita ser normalizado.
  • Linear Damp - Que tan rápido los objetos dejan de moverse - la velocidad lineal perdida por segundo.
  • Angular Damp - Que tan rápido los objetos dejan de girar - velocidad angular perdida por segundo.

Punto de gravedad

La propiedad Gravity Point te permite crear un "atractor". La gravedad en el área será calculada hacia un punto, dado por la propiedad Gravity Vec. Los valores son relativos al Area2D, por ejemplo usando (0, 0) atraerá objetos hacia el centro del área.

Ejemplos

El proyecto de ejemplo adjunto abajo tiene tres áreas demostrando las físicas sobrescritas.

../../_images/area2d_override.gif

Puedes descargar este proyecto aquí: using_area_2d.zip