Pular para o conteúdo
Baixar

Jogo de plataforma

Você quer um personagem que cai, pousa no chão, pula e não atravessa paredes.

  1. No objeto do chão e das paredes, marque Sólido no Inspetor. Ou pinte o chão com tiles sólidos: veja Cenário com tiles.
  2. No objeto do jogador, na seção Física, ponha Gravidade em 0.25 e Queda máxima em 4.5.

A gravidade puxa o jogador para baixo a cada passo, e a queda máxima impede que ele caia cada vez mais rápido.

void Player::onUpdate() {
hspeed = axis("esquerda", "direita") * 1.5f;
if (pressed("pular") && onGround()) vspeed = -4.5f;
moveAndStop();
}
  • axis("esquerda", "direita") dá a direção: -1, 0 ou 1. Veja ações.
  • onGround() é verdadeiro quando há um sólido 1 pixel abaixo do jogador. Sem essa checagem, ele pularia no ar.
  • vspeed = -4.5f joga o jogador para cima (o y cresce para baixo). A gravidade cuida de trazê-lo de volta.
  • moveAndStop() aplica a gravidade e anda por hspeed e vspeed, parando quando encosta num sólido. Chame uma vez por passo.

Virar para o lado em que anda. flipX espelha o desenho e a caixa de colisão, sem mexer na escala:

if (hspeed != 0) flipX = hspeed < 0;

Um inimigo que vai e volta. Depois do moveAndStop(), hitWall() diz se ele bateu numa parede:

void Enemy::onUpdate() {
hspeed = flipX ? -0.5f : 0.5f;
moveAndStop();
if (hitWall()) flipX = !flipX;
}

Fazer algo ao pousar. hitFloor() vale no passo em que o jogador bateu no chão; hitCeiling(), quando bateu a cabeça no teto:

moveAndStop();
if (hitFloor()) Audio::play("pouso");

A caixa de colisão não mudar com a animação. Se o sprite de correr é mais largo que o parado, o jogador pode ficar preso numa parede ao trocar de animação. No Inspetor do objeto, escolha um sprite em Máscara: a colisão passa a usar sempre a caixa dele.

Pulo mais baixo ao soltar o botão.

if (released("pular") && vspeed < 0) vspeed *= 0.5f;