Pular para o conteúdo
Baixar

Colisões

Você quer saber quando um objeto encosta em outro: o tiro no inimigo, o jogador na moeda, o jogador na parede.

A forma mais simples é registrar, no onSpawn, o que fazer quando encostar:

#include <brasa/brasa.hpp>
using namespace brasa;
class Coin : public Entity {
public:
void onSpawn() override {
onCollide<Player>([this](Player& player) {
destroy(); // o jogador pegou a moeda
});
}
};
BRASA_ENTITY(Coin);
  • Cada sprite tem uma caixa de colisão, que você ajusta no editor de sprite. Dois objetos colidem quando as caixas se sobrepõem.
  • onCollide<Player>(...) registra uma lambda que a Brasa chama a cada passo em que este objeto estiver encostado num Player. O Player que encostou chega como parâmetro.
  • Objetos sem sprite não têm caixa, então não colidem.

Perguntar antes de andar. collidesAt<T>(x, y) diz se o objeto encostaria num T se estivesse em outra posição:

if (!collidesAt<Wall>(x + 2, y)) x += 2; // só anda se não houver parede

Pegar quem está ali. findAt<T>(x, y) devolve a instância encontrada, ou nullptr:

if (Enemy* enemy = findAt<Enemy>(x, y + 1)) enemy->destroy(); // pisou no inimigo

Paredes sólidas. Marque Sólido no Inspetor do objeto da parede. Depois, placeFree(x, y) diz se a posição está livre de sólidos, e moveAndStop(dx, dy) anda até encostar:

moveAndStop(); // anda por hspeed/vspeed e para na parede