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

  1. Nenhum - Objeto é completamente ignorado pelo sistema de colisão
  2. Estático - Atua como uma parede imovível (use para terrenos, plataformas)
  3. Dinâmico - Move-se e é empurrado para fora de outros colisores (use para jogador, inimigos)
  4. 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:

  1. Aplica a gravidade da cena à velocidade de cada objeto dinâmico
  2. 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