Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Carros só colidem com a borda de cima do Ator

Os carros conseguem atravessar o ator da borda de baixo até o meio do Ator.


//variáreis do ator
let xAtor = 75
let yAtor = 550
let atorInicial = 550
let comprimentoAtor = 40
let diametroAtor = 40
let raioAtor = 20
let colisao = false
let marcaPonto = 0


function mostraAtor(){
  image(imagemDoAtor, xAtor, yAtor, comprimentoAtor, diametroAtor);

}

function movimentoAtor(){
    if(keyIsDown(UP_ARROW)){
      yAtor -= 4
  }


   if(atorPodeSeMover()){
    if(keyIsDown(DOWN_ARROW)){
      yAtor += 4
    }
  }    
}

//collideRectCircle(x1, y1, width1, height1, cx, cy, diameter)
function verificaColisao(){
  for(let i = 0; i < imagemCarros.length; i ++ ){
     colisao = collideRectCircle(xCarros[i], yCarros[i], comprimentoCarro, larguraCarro, xAtor, yAtor, raioAtor)

       if(colisao){
         voltaAtorInicio(); 
         if(pontoMaiorQueZero ()){
           marcaPonto --
         }          
     }
  }
}  

function voltaAtorInicio(){
  yAtor = atorInicial
}

function exibirPonto (){
  fill(color(255,240,60));
  textAlign(CENTER);
  textSize(40);
  text(marcaPonto, width/5, 40);
}

function pontos(){
  if(yAtor < 6){
    marcaPonto ++
    voltaAtorInicio()
  }
}

function exibirPontoErro (){
  fill(color(255,240,60));
  textAlign(CENTER);
  textSize(40);
  text(perdePonto, width/1.2, 40);
}

function pontoMaiorQueZero(){
  return marcaPonto > 0
}

function atorPodeSeMover (){
  return  yAtor < 550
}
//código de carros
let xCarros = [800, 800, 800, 800, 800, 800]
let yCarros = [63, 150, 230, 320, 400, 482]
let velocidadeCarros = [5, 6, 7, 10, 3, 2]


//dimensões
let comprimentoCarro = 70
let larguraCarro = 55
let xCarroInicial = 800


function mostraCarro(){
  for(let i = 0; i < imagemCarros.length; i ++ ){
  image(imagemCarros[i], xCarros[i], yCarros[i], comprimentoCarro, larguraCarro)

  }
}

function movimentaCarro(){
  for(let i = 0; i < imagemCarros.length; i ++ ){
  xCarros[i] -= velocidadeCarros[i]
  }
}

function voltaPosicaoinicialDoCarro(){
  for(let i = 0; i < imagemCarros.length; i ++ ){  
    if(passouTodaTela(xCarros[i])){
      xCarros[i] = xCarroInicial
    }

  }  
}

function passouTodaTela(xCarros){
  return xCarros < -70;
}

function setup() {
  createCanvas(800, 600);
}

function draw() {
  background(imagemDaEstrada);
  mostraAtor();
  mostraCarro();    
  movimentaCarro();
  movimentoAtor();
  voltaPosicaoinicialDoCarro();
  verificaColisao()
  exibirPonto()
  pontos();
}




6 respostas

Olá Caio, tudo bem?

Poste o link do seu projeto aqui.

Opa, segue.

https://editor.p5js.org/CaioCosta/sketches/hwZ0ic_Tx

=)

Caio, na função verificaColisao() você está usando raioAtor aqui:

colisao = collideRectCircle(xCarros[i], yCarros[i], comprimentoCarro, larguraCarro, xAtor, yAtor, raioAtor)

Deveria ser diametroAtor. Testa aí e nos diga o resultado.

Eu justamente troquei para raio tentando ver se fazia alguma diferença.

Tentei novamente com diâmetro e tive o mesmo problema. Você pode testar esse problema subindo com o Ator até outro lá da pista e deixando o carro passar por cima até quase sua metade do corpo da parte de baixo. Para a parte de cima do corpo isso funciona corretamente. Aqui não consigo enviar uma imagem para ficar mais claro.

solução!

Tenta assim (achei que ficou melhor, mas você terá que mudar a posicao inicial e a final)

function mostraAtor(){
  image(imagemDoAtor, xAtor - raioAtor, yAtor - raioAtor, diametroAtor, diametroAtor);
}

Ótimo Luiz, obrigado pela ajuda =)

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