1
resposta

Ajeitando colisões e adicionando movimentos para os lados

Analisando o jogo vi que se eu deixasse o ator um pouco acima do carro, esse ultimo passava por dentro da imagem do primeiro. Acho que a forma de solucionar seria pelo fato de que é uma colisão entre retângulos, tanto que colocamos a largura e altura na hora de inserirmos a imagem do ator.

Esta certo dessa forma?

//codigo do ator

//variaveis do ator
let xAtor = 300;
let yAtor = 367;
let larguraAtor = 30;
let alturaAtor = 30;
let velocidadeDoAtor = 3;

let colisao = false;

let meusPontos = 0;

function mostraAtor() {
  image (imagemDoAtor, xAtor, yAtor, larguraAtor, alturaAtor);
}

function movimentaAtor() {
  if (keyIsDown(UP_ARROW)) {
      yAtor -= velocidadeDoAtor;
  }
  if (keyIsDown(DOWN_ARROW) && podeSeMoverBaixo()) {
      yAtor += velocidadeDoAtor;
  }
  if (keyIsDown(LEFT_ARROW) && podeSeMoverEsquerda()) {
      xAtor -= velocidadeDoAtor;
  }
  if (keyIsDown(RIGHT_ARROW) && podeSeMoverDireita()) {
      xAtor += velocidadeDoAtor;
  }
}

function podeSeMoverBaixo () {
  return yAtor < 370 ;
}
function podeSeMoverEsquerda () {
  return xAtor > 0;
}

function podeSeMoverDireita () {
  return xAtor + larguraAtor < 600
}

function verificaColisao () {
  for (let i = 0; i < imagemCarros.length; i++) {
    colisao = collideRectRect(xCarros[i], yCarros[i], tamanhoXCarro,tamanhoYCarro, xAtor, yAtor, larguraAtor, alturaAtor);

    if (colisao) {
      colidiu();
      somColidiu.play();
    }
  }
}

function colidiu () {
  perdePonto();
  voltaAtorPosicaoInicial()
}

function perdePonto () {
  if (meusPontos > 0) {
    meusPontos -= 1;
  }
}

function marcaPonto () {
  if (yAtor < 0) {
    voltaAtorPosicaoInicial();
    meusPontos++;
    somPontos.play();
  }
}

function voltaAtorPosicaoInicial() {
  xAtor = 300;
  yAtor = 367;
}

Aproveitando, também adicionei movimentações para os lados e funções para conferir os limites de movimentos nesses sentidos.

1 resposta

Olá, Feldmann! Tudo bem contigo?

Ficou bacana, hein!

Obrigado por compartilhar seu código conosco!

Segue um outro exemplo:

//Código do Ator
let xAtor = 85;
let yAtor = 366;
let colisao = false;
let meusPontos = 0;

function mostraAtor() {
  image(imagemDoAtor, xAtor, yAtor, 30, 30);
}

function movimentaAtor() {
  if (keyIsDown(UP_ARROW)) {
    yAtor -= 3;
  }
   if (keyIsDown(DOWN_ARROW)) {
     if (podeSeMover()) {
        yAtor += 3;
     }
  }
}

function verificaColisao() { 
  for (let i = 0; i < imagemCarros.length; i++) {
    colisao = collideRectCircle(xCarros[i], yCarros[i], comprimentoCarro, alturaCarro, xAtor, yAtor, 15)
    if (colisao) {
      voltaAtorParaPosicaoInicial();
      somDaColisao.play();   
    if (pontosMaiorQueZero()) { 
        meusPontos -= 1;
      }
    }
  }
}

function voltaAtorParaPosicaoInicial() {
  yAtor = 366;
}

function incluiPontos() {
  textAlign(CENTER);
  textSize(25);
  fill(color(255, 240, 60))
  text(meusPontos, width / 5, 27);
}

function marcaPonto() {
  if (yAtor < 15) {
    meusPontos += 1;
    somDoPonto.play();
    voltaAtorParaPosicaoInicial();
  }
}

function pontosMaiorQueZero() {
  return meusPontos > 0
}

function podeSeMover() {
  return yAtor < 366;
}

Muito bom a sua opção de movimentação lateral também! Muito legal mesmo!

Continue assim!

Um abraço e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software