Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

Sistema de Colisiones

Cómo Funciona

  • Cada objeto tiene un AABB (Caja de Colisión Alineada al Eje) basado en su tamaño de sprite
  • Los sprites pueden tener límites de colisión personalizados (configurados en el Editor de Sprites)
  • Se verifica la colisión cada fotograma para objetos dinámicos

Tipos de Colisión Explicados

  1. Ninguno - El objeto es completamente ignorado por el sistema de colisión
  2. Estático - Actúa como una pared inmovible (usar para terreno, plataformas)
  3. Dinámico - Se mueve y es empujado fuera de otros colisionadores (usar para jugador, enemigos)
  4. Trigger - Detecta superposiciones pero no bloquea el movimiento (usar para coleccionables, zonas)

Resolución de Colisiones

  • Los objetos dinámicos son automáticamente empujados fuera de objetos Estáticos y otros Dinámicos
  • Los Triggers nunca bloquean el movimiento; solo detectan superposiciones

La Callback onCollision

La función onCollision(objA, objB) es llamada cuando los objetos se superponen. Los patrones de callback son:

Tipo de objA Tipo de objB ¿Callback Generado? Notas
Dinámico Estático Dinámico empujado fuera del estático
Dinámico Dinámico Sí (en ambas direcciones) Ambos objetos obtienen callbacks
Dinámico Trigger Trigger detectado
Trigger Trigger Ambos triggers se detectan entre sí
Estático Estático No Los estáticos no generan callbacks
Estático Trigger No Ninguno genera callbacks

Reglas Clave:

  • objA es siempre Dinámico o Trigger
  • Cuando dos objetos Dinámicos colisionan, ambos obtienen un callback (cada uno como objA)
  • Cuando dos Triggers se superponen, se genera un callback (primer trigger como objA)
  • Los objetos Estáticos nunca aparecen como objA

Ejemplo: Detectando Diferentes Tipos de Colisión

func onCollision(objA, objB) {
    var typeA = getCollisionType(objA)
    var typeB = getCollisionType(objB)

    // El jugador (dinámico) tocando una moneda (trigger)
    if (getName(objA) == "player" && typeB == COLLISION_TRIGGER()) {
        print("¡Coleccionado!")
        removeObject(gameScene, objB)
    }

    // Dos triggers superponiéndose (por ejemplo, zonas de detección)
    if (typeA == COLLISION_TRIGGER() && typeB == COLLISION_TRIGGER()) {
        print(getName(objA) + " entró en la zona de " + getName(objB))
    }

    // Jugador golpeado por enemigo (ambos dinámicos)
    if (getName(objA) == "player" && getName(objB) == "enemy") {
        print("¡Jugador golpeado!")
    }
}

Sistema de Física

El Tiniest Engine tiene un sistema de física integrado que maneja la gravedad y la velocidad automáticamente para objetos dinámicos.

Cómo Funciona la Física

Cada fotograma, el motor automáticamente:

  1. Aplica la gravedad de la escena a la velocidad de cada objeto dinámico
  2. Aplica la velocidad a la posición de cada objeto dinámico
// Canalización de física (manejado automáticamente por el motor):
velocity += gravity * dt
position += velocity * dt

Configurando la Gravedad

Establece la gravedad en una escena para hacer que los objetos dinámicos caigan:

func start() {
    // Establecer gravedad hacia abajo (300 píxeles por segundo cuadrado)
    setGravityY(gameScene, 300)

    // Opcional: gravedad horizontal (efecto de viento)
    setGravityX(gameScene, 0)

    setScene(gameScene)
}

Usando Velocidad

Controla los objetos utilizando la velocidad en lugar de establecer directamente la posición:

var player = Object("player")
var jumpForce = -200  // Negativo = hacia arriba

func start() {
    setCollisionType(player, COLLISION_DYNAMIC())
    addObject(gameScene, player)
    setGravityY(gameScene, 300)
    setScene(gameScene)
}

func onUpdate(dt) {
    // Movimiento horizontal a través de la velocidad
    if (isKeyHeld(KEY_LEFT())) {
        setVelocityX(player, -100)
    } else if (isKeyHeld(KEY_RIGHT())) {
        setVelocityX(player, 100)
    } else {
        setVelocityX(player, 0)
    }

    // Saltar configurando la velocidad hacia arriba
    if (isKeyPressed(KEY_SPACE())) {
        setVelocityY(player, jumpForce)
    }
}

Funciones de Física

Función Descripción
getVelocityX(obj) Devuelve la velocidad X del objeto
setVelocityX(obj, vx) Establece la velocidad X del objeto
getVelocityY(obj) Devuelve la velocidad Y del objeto
setVelocityY(obj, vy) Establece la velocidad Y del objeto
getGravityX(scene) Devuelve el componente de gravedad X de la escena
setGravityX(scene, gx) Establece el componente de gravedad X de la escena
getGravityY(scene) Devuelve el componente de gravedad Y de la escena
setGravityY(scene, gy) Establece la gravedad Y de la escena (positivo = abajo)

Importante: Solo los objetos COLLISION_DYNAMIC() son afectados por la gravedad y tienen su velocidad aplicada automáticamente.