Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] teve uma função que não precisou colocar no 'function draw'

recriando o jogo "freeway", fiquei me perguntando o por que tem uma função que não precisa estar na 'fucntion draw' o jogo esta rodando normalmente, porem fiquei com essa duvida na cabeça.


function draw() {
  background(imagemDaEstrada);
  mostraAtor();
  mostraCarro();  
  movimentaCarro();
  movimentaAtor();
  voltaPosicaoDoCarro();
  verificaColisao();
  incluiPontos();
  marcaPonto(); 

}

e este proximo texto é onde roda uma função, sem estar no "function draw " irei colocar a função em negrito para ficar mais facil de localizar.

//ATOR 
let yAtor = 366;
let xAtor = 90;

// colisao 
let coLisao = false;

//meus pontos 
let meusPontos = 0;


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

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

function verificaColisao (){ 

  //collideRectCircle(x1, y1, width1, height1, cx, cy, diameter)
  for (let i = 0; i < imagemDosCarros.length; i ++){

    coLisao = collideRectCircle(xCarros[i], yCarros[i],comprimentoDoCarro, alturaDoCarro, xAtor, yAtor,15)

    if (coLisao){
      voltaAtorPosicaoInicial();
    }
  }
}

function voltaAtorPosicaoInicial(){          <---- esta "function" não esta no "function draw" e o jogo esta rodando perfeitamente. 
  yAtor = 366;
}

function incluiPontos(){
  textAlign(CENTER);
  textSize(25);
  text(meusPontos, width / 5, 29)
}

function marcaPonto(){
  if (yAtor < 15){
 meusPontos +=1; 
    voltaAtorPosicaoInicial();
  }
}
1 resposta
solução!

Oi Gustavo, tudo bem?

Antes de mais nada, tomei a liberdade de editar sua publicação para conseguir ver melhor o código que você enviou.

Se quiser postar diretamente o código aqui no fórum, segue os passos para que você consiga enviar seu código completo:

  • No seu terminal, selecione e copie a seção com o código;
  • Aqui no fórum, procure o ícone </>. É a sétima opção na aba superior do nosso editor de texto;
  • Cole o código copiado entre as duas linhas que surgirem;

Agora referente a sua dúvida, a função voltaAtorPosicaoInicial() está inserida dentro da condição if (colidiu) que faz parte da função verificaColisao() :

function verificaColisao (){ 

  //collideRectCircle(x1, y1, width1, height1, cx, cy, diameter)
    for (let i = 0; i < imagemDosCarros.length; i ++){
        coLisao = collideRectCircle(xCarros[i], yCarros[i],comprimentoDoCarro, alturaDoCarro, xAtor, yAtor,15)
        if (coLisao){
      voltaAtorPosicaoInicial();
    }
  }
}

Dessa forma implicitamente ela está inserida dentro da função draw() , portanto quando o p5 faz a leitura dos comandos pertencentes a função draw() ele lê a função verificaColisao() e implicitamente faz a leitura da função voltaAtorPosicaoInicial() buscando as condições adicionadas à ela no escopo dos arquivos criados, mais especificamente no arquivo referente ao ator.

Caso a função voltaAtorPosicaoInicial() seja adicionada na função draw() o ator não vai se movimentar, pois a função estará sendo chamada a todo momento, fazendo com que a vaquinha fique presa na posição y = 366.

Com isso podemos concluir que a função voltaAtorPosicaoInicial() atua como uma função secundária que só deverá ser chamada se uma condição acontecer, como por exemplo: uma colisão acontecer ou se um ponto for marcado. Desse modo ela é utilizada por outras funções para dividir responsabilidades e tornar o código mais claro e objetivo e não deve ser acrescentada na função draw() por não ser uma função principal para que o jogo funcione.

Espero ter ajudado. Caso tenha outras dúvidas, estarei à disposição.

Grande abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado! ✓.