Crie Jogos 2D com Tiniest2D
Colisão e 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 Colisão
Como Funciona
- Cada objeto possui uma AABB (Axis-Aligned Bounding Box) baseada no tamanho do seu sprite
- Sprites podem ter limites de colisor personalizados (definidos no Editor de Sprites)
- A colisão é verificada a cada quadro para objetos dinâmicos
Tipos de Colisão Explicados
- Nenhum - Objeto é completamente ignorado pelo sistema de colisão
- Estático - Atua como uma parede imovível (use para terrenos, plataformas)
- Dinâmico - Move-se e é empurrado para fora de outros colisores (use para jogador, inimigos)
- Gatilho - Detecta sobreposição, mas não bloqueia movimento (use para colecionáveis, zonas)
Resolução de Colisão
- Objetos dinâmicos são automaticamente empurrados para fora de objetos Estáticos e outros Dinâmicos
- Gatilhos nunca bloqueiam movimento - eles apenas detectam sobreposições
O Callback onCollision
A função onCollision(objA, objB) é chamada quando os objetos se sobrepõem. Os padrões de callback são:
| Tipo objA | Tipo objB | Callback Gerado? | Notas |
|---|---|---|---|
| Dinâmico | Estático | Sim | Dinâmico empurrado para fora do estático |
| Dinâmico | Dinâmico | Sim (em ambas as direções) | Ambos os objetos recebem callbacks |
| Dinâmico | Gatilho | Sim | Gatilho detectado |
| Gatilho | Gatilho | Sim | Ambos os gatilhos se detectam |
| Estático | Estático | Não | Estáticos não geram callbacks |
| Estático | Gatilho | Não | Nenhum gera callbacks |
Regras principais:
objAé sempre Dinâmico ou Gatilho- Quando dois objetos Dinâmicos colidem, ambos recebem um callback (cada um como objA)
- Quando dois Gatilhos se sobrepõem, um callback é gerado (primeiro gatilho como objA)
- Objetos Estáticos nunca aparecem como objA
Exemplo: Detectando Diferentes Tipos de Colisão
func onCollision(objA, objB) {
var typeA = getCollisionType(objA)
var typeB = getCollisionType(objB)
// Jogador (dinâmico) tocando uma moeda (gatilho)
if (getName(objA) == "player" && typeB == COLLISION_TRIGGER()) {
print("Coletado!")
removeObject(gameScene, objB)
}
// Dois gatilhos se sobrepondo (ex: zonas de detecção)
if (typeA == COLLISION_TRIGGER() && typeB == COLLISION_TRIGGER()) {
print(getName(objA) + " entrou na zona de " + getName(objB))
}
// Jogador atingido por inimigo (ambos dinâmicos)
if (getName(objA) == "player" && getName(objB) == "enemy") {
print("Jogador atingido!")
}
}
Sistema de Física
O Tiniest Engine possui um sistema de física embutido que lida com gravidade e velocidade automaticamente para objetos dinâmicos.
Como a Física Funciona
A cada quadro, o motor automaticamente:
- Aplica a gravidade da cena à velocidade de cada objeto dinâmico
- Aplica a velocidade à posição de cada objeto dinâmico
// Pipeline de física (gerenciado automaticamente pelo motor):
velocity += gravity * dt
position += velocity * dt
Configurando a Gravidade
Defina a gravidade em uma cena para fazer objetos dinâmicos caírem:
func start() {
// Define gravidade para baixo (300 pixels por segundo ao quadrado)
setGravityY(gameScene, 300)
// Opcional: gravidade horizontal (efeito de vento)
setGravityX(gameScene, 0)
setScene(gameScene)
}
Usando Velocidade
Controle objetos usando velocidade em vez de definir diretamente a posição:
var player = Object("player")
var jumpForce = -200 // Negativo = para cima
func start() {
setCollisionType(player, COLLISION_DYNAMIC())
addObject(gameScene, player)
setGravityY(gameScene, 300)
setScene(gameScene)
}
func onUpdate(dt) {
// Movimento horizontal via velocidade
if (isKeyHeld(KEY_LEFT())) {
setVelocityX(player, -100)
} else if (isKeyHeld(KEY_RIGHT())) {
setVelocityX(player, 100)
} else {
setVelocityX(player, 0)
}
// Pular definindo velocidade para cima
if (isKeyPressed(KEY_SPACE())) {
setVelocityY(player, jumpForce)
}
}
Funções de Física
| Função | Descrição |
|---|---|
getVelocityX(obj) |
Retorna a velocidade X do objeto |
setVelocityX(obj, vx) |
Define a velocidade X do objeto |
getVelocityY(obj) |
Retorna a velocidade Y do objeto |
setVelocityY(obj, vy) |
Define a velocidade Y do objeto |
getGravityX(scene) |
Retorna o componente de gravidade X da cena |
setGravityX(scene, gx) |
Define o componente de gravidade X da cena |
getGravityY(scene) |
Retorna o componente de gravidade Y da cena |
setGravityY(scene, gy) |
Define a gravidade Y da cena (positivo = para baixo) |
Importante: Apenas objetos COLLISION_DYNAMIC() são afetados pela gravidade e têm sua velocidade aplicada automaticamente