0Pricing
Lua Academy · Aula

Movimento e colisões

Crie uma cena jogável.

Movimento e colisões é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Lua Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Lua Academy inclui 4 aulas no total.

Posição e Velocidade

Movimentar-se no LÖVE significa alterar a posição de um objeto ao longo do tempo. Armazene x e y e depois adicione a velocidade em love.update, ajustada por dt.

Manter a velocidade como dx e dy por segundo torna a movimentação diagonal e a física organizadas e independentes da taxa de quadros.

function love.update(dt)
  player.x = player.x + player.dx * dt
  player.y = player.y + player.dy * dt
end

Movimento Orientado pela Entrada

Combine a consulta com a velocidade para conduzir um objeto. Leia as teclas de direção em love.update e aplique a velocidade multiplicada por dt.

Como love.keyboard.isDown é verificado a cada quadro, o jogador se move suavemente enquanto a tecla estiver pressionada.

function love.update(dt)
  if love.keyboard.isDown('left') then player.x = player.x - player.speed*dt end
  if love.keyboard.isDown('right') then player.x = player.x + player.speed*dt end
end

Normalizando a Velocidade Diagonal

Pressionar duas teclas de direção ao mesmo tempo torna a movimentação diagonal mais rápida, pois os dois eixos adicionam a velocidade total. Para corrigir isso, normalize o vetor de movimento.

Divida a direção pelo seu comprimento para que seu módulo seja 1 e depois multiplique pela velocidade. Agora, o deslocamento diagonal corresponde ao deslocamento em linha reta.

local dx, dy = ix, iy
local len = math.sqrt(dx*dx + dy*dy)
if len > 0 then
  player.x = player.x + (dx/len) * player.speed * dt
end

Mantendo-se Dentro da Tela

Limite a posição para manter os objetos na tela. Leia o tamanho da janela com love.graphics.getWidth e getHeight e depois limite as coordenadas.

math.max e math.min juntas limitam um valor entre um mínimo e um máximo de forma simples.

local w = love.graphics.getWidth()
player.x = math.max(0, math.min(player.x, w - player.size))

Caixas Delimitadoras Alinhadas aos Eixos

A colisão mais simples usa retângulos, chamados AABB, sigla em inglês para caixas delimitadoras alinhadas aos eixos. Cada objeto tem x, y, largura e altura.

Duas caixas se sobrepõem quando se intersectam simultaneamente nos eixos horizontal e vertical. Essa verificação é rápida e suficiente para a maioria dos jogos 2D.

-- box: { x, y, w, h }

O Teste de Sobreposição de AABB

Dois retângulos se sobrepõem quando a borda esquerda de cada um está antes da borda direita do outro em ambos os eixos. O teste clássico combina quatro comparações.

Se as quatro forem verdadeiras, as caixas se intersectam. Essa única condição é o principal recurso da detecção de colisões 2D.

function overlaps(a, b)
  return a.x < b.x + b.w and
         b.x < a.x + a.w and
         a.y < b.y + b.h and
         b.y < a.y + a.h
end

Reagindo a uma Colisão

Quando overlaps retorna verdadeiro, decida o que acontece: pegue uma moeda, sofra dano ou interrompa o movimento. Verifique as colisões em love.update depois de mover os objetos.

Para itens coletáveis, basta removê-los ou incrementar uma pontuação. Para paredes sólidas, retire o jogador da área de sobreposição.

function love.update(dt)
  movePlayer(dt)
  if overlaps(player, coin) then
    score = score + 1
    coin.dead = true
  end
end

Colisões entre Círculos

Para objetos redondos, a colisão baseada em distância é mais precisa. Dois círculos colidem quando a distância entre seus centros é menor que a soma dos raios.

Comparar as distâncias ao quadrado evita a raiz quadrada custosa, uma otimização comum ao verificar muitos objetos.

function circlesHit(a, b)
  local dx, dy = a.x - b.x, a.y - b.y
  local rsum = a.r + b.r
  return dx*dx + dy*dy < rsum*rsum
end

Resolvendo Colisões com Paredes

Para parar um jogador diante de uma parede, uma abordagem simples é mover-se em cada eixo separadamente e desfazer o passo que causa a sobreposição.

Mova x e verifique; se houver colisão, reverta x. Repita o processo para y. Essa resolução separada por eixo evita que o jogador fique preso nos cantos.

player.x = player.x + vx * dt
if overlaps(player, wall) then player.x = player.x - vx * dt end
player.y = player.y + vy * dt
if overlaps(player, wall) then player.y = player.y - vy * dt end

Aplicando Gravidade

Jogos de plataforma adicionam uma aceleração constante para baixo. Aumente a velocidade vertical pela gravidade multiplicada por dt a cada quadro e depois aplique a velocidade à posição.

Quando o jogador pousar no chão, zere a velocidade vertical para que ele pare de cair. Pular define uma velocidade vertical negativa.

function love.update(dt)
  player.dy = player.dy + GRAVITY * dt
  player.y = player.y + player.dy * dt
end

Removendo Objetos Destruídos

Depois das colisões, é comum remover objetos. Percorra uma lista de trás para frente e chame table.remove para que os índices permaneçam válidos durante a exclusão.

Percorrer de trás para frente é a forma idiomática segura de Lua para remover itens no meio do laço, evitando entradas ignoradas, o que ocorreria em uma iteração para frente.

for i = #coins, 1, -1 do
  if coins[i].dead then
    table.remove(coins, i)
  end
end

Verificação Rápida

Teste sua compreensão sobre movimentação e colisões no LÖVE.

Recapitulação

A movimentação combina posição, velocidade e dt, com normalização para manter as diagonais equilibradas e limitação para manter os objetos na tela. As colisões começam com testes de sobreposição de AABB, usando verificações de distância entre círculos para objetos redondos.

Resolva as colisões com paredes revertendo os movimentos por eixo, adicione gravidade aos jogos de plataforma e remova objetos destruídos percorrendo a lista de trás para frente com table.remove.

Perguntas Frequentes

A aula “Movimento e colisões” é grátis?

Sim — o texto completo de “Movimento e colisões” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Lua Academy, atualize para CoddyKit PRO. O curso de Lua Academy inclui 4 aulas no total.

O que vou aprender em “Movimento e colisões”?

Crie uma cena jogável. Você pratica Lua Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Lua Academy?

Nenhuma experiência prévia é necessária. Lua Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Movimento e colisões”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Lua Academy?

Sim. Cada aula de Lua Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. O laço de jogo do LOVE
  2. Desenhando formas e imagens
  3. Lidando com entradas
  4. Movimento e colisões
← Voltar para Lua Academy