Crea Juegos 2D con Tiniest2D
Colisión y Física
Lesson 9 of 11 • 10 XP
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
- Ninguno - El objeto es completamente ignorado por el sistema de colisión
- Estático - Actúa como una pared inmovible (usar para terreno, plataformas)
- Dinámico - Se mueve y es empujado fuera de otros colisionadores (usar para jugador, enemigos)
- 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 | Sí | Dinámico empujado fuera del estático |
| Dinámico | Dinámico | Sí (en ambas direcciones) | Ambos objetos obtienen callbacks |
| Dinámico | Trigger | Sí | Trigger detectado |
| Trigger | Trigger | Sí | 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:
objAes 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:
- Aplica la gravedad de la escena a la velocidad de cada objeto dinámico
- 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.