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

[Dúvida] Copiei código do professor, mas esta dando erro

a minha função de colisão da raquete está dando o seguinte erro: Função:

function verificaColisaoRaquete(){
  if (xBolinha - raio < xRaquete + raqueteComprimento && yBolinha - raio < yRaquete + raqueteAltura && yBolinha + raio > yRaquete){
    velocidadeXBolinha *= -1;
  }
}

Erro: TypeError: verificaColisaoRaquete is not a function

p5.js says: "verificaColisaoRaquete" could not be called as a function. Check the spelling, letter-casing (JavaScript is case-sensitive) and its type.

A função era executada antes de eu começar a fazer a segunda raquete, agora dá isso.

4 respostas

Olá Mylena, tudo bem?

Pelo erro que você postou, parece que o JavaScript não está reconhecendo a função verificaColisaoRaquete como uma função. Isso pode acontecer por diversos motivos, mas uma possibilidade é que você esteja tentando chamá-la antes de ela ser declarada.

Verifique se a função verificaColisaoRaquete está sendo declarada antes do ponto em que é chamada. Se não for isso, pode ser que haja algum erro de digitação ou de sintaxe no código que está impedindo a declaração da função.

E se não for isso eu peço que você compartilhe o código completo comigo para que eu possa avaliar e testar ele para procurar o erro que pode estar lhe gerando problemas.

Espero ter ajudado e bons estudos!

Olá, Renan!! Não sei se entendi muito bem, rs. vou compartilhar o código completo para você avaliar.

// variaveis da bolinha
let xBolinha = 100;
let yBolinha = 100;
let diametro = 20;
let raio = diametro/ 2

// velocidade da bolinha
let velocidadeXBolinha = 6;
let velocidadeYBolinha = 6;

// variaveis da raquete
let xRaquete = 5;
let yRaquete = 150;
let raqueteComprimento = 10;
let raqueteAltura = 90;

// variaveis outra raquete
let xRaquete2 = 580;
let yRaquete2 = 150;
let raqueteCompriment = 10;
let raqueteAltur = 90;

let colidiu = false;

function setup() {
  createCanvas(600, 400);

}

function draw() {
  background(0);  
  mostraBolinha();
  movimentaBolinha();
  verificaColisaoBorda();
  mostraRaquete();
  movimentaMinhaRaquete();
  verificaColisaoRaquete();
  colisaoMinhaRaqueteBiblioteca();
  outraRaquete();


function movimentaBolinha (){
   xBolinha += velocidadeXBolinha;
   yBolinha += velocidadeYBolinha;
}

function verificaColisaoBorda (){
  if (xBolinha + raio > width || 
      xBolinha - raio < 0){
    velocidadeXBolinha *= -1;
  }

  if (yBolinha + raio > height ||
     yBolinha - raio < 0){
    velocidadeYBolinha *= -1;
  }

    }
function mostraBolinha (){
  circle (xBolinha, yBolinha, diametro);
}

function mostraRaquete (){
    rect (xRaquete, yRaquete, raqueteComprimento, raqueteAltura);
  }

function movimentaMinhaRaquete(){
  if (keyIsDown(UP_ARROW)){
    yRaquete -= 10;
  }
}

  if(keyIsDown(UP_ARROW)){
      yRaquete2 -= 5
      if(yRaquete2 < 0){
        yRaquete2 = 0

  if (keyIsDown (DOWN_ARROW)){
    yRaquete += 10;
  }
}

function verificaColisaoRaquete(){
  if (xBolinha - raio < xRaquete + raqueteComprimento && yBolinha - raio < yRaquete + raqueteAltura && yBolinha + raio > yRaquete){
    velocidadeXBolinha *= -1;
  }
}

  function colisaoMinhaRaqueteBiblioteca(){
    colidiu = 
    collideRectCircle(xRaquete, yRaquete, raqueteComprimento, raqueteAltura, xBolinha, yBolinha, raio);
    if (colidiu){
      velocidadeXBolinha *= -1;
    } 

  }
 function outraRaquete(){
   rect(xRaquete2, yRaquete2, raqueteComprimento, raqueteAltura);
 } 
}
  }
solução!

Olá Mylena, tudo bem?

Primeiramente agradeço por compartilhar seu código comigo, isso facilitou muito o processo.

O que aconteceu no seu código foram alguns equivicos na indentação, pois você fechou algumas functions onde não precisava, e colocou alguns if´s dentro de outros if´s junto com o comando que originava aquele if, por exemplo nessa funtion aqui:

function movimentaMinhaRaquete(){
  if (keyIsDown(UP_ARROW)){
    yRaquete -= 10;
  }
}

  if(keyIsDown(UP_ARROW)){
      yRaquete2 -= 5
      if(yRaquete2 < 0){
        yRaquete2 = 0

  if (keyIsDown (DOWN_ARROW)){
    yRaquete += 10;
  }
}

Se você olhar com calma a function se encerra aqui:

function movimentaMinhaRaquete(){
  if (keyIsDown(UP_ARROW)){
    yRaquete -= 10;
  }
}

E depois disso os dois if´s que deveriam estar dentro da funtion estão "jogadas" no escopo global da página, e aí deu erro.

Outra coisa que acontece depois de acoplar esses if´s da function é um erro que é gerado pelo fato de um if estar dentro de outro, como você pode ver abaixo:

//Começa um if
if(keyIsDown(UP_ARROW)){
//Começa o comando gerado pelo if
      yRaquete2 -= 5
      //aqui já começa mais outro if
      if(yRaquete2 < 0){
      //Começa o comando gerado pelo novo if
        yRaquete2 = 0

//Começa outro if dentro do if que também está dentro do if inicial
  if (keyIsDown (DOWN_ARROW)){
  //começa o comando do novo if
    yRaquete += 10;
  }
 //termina o terceiro if
}
//termina o segundo if

Assim como eu especifiquei usando os mini comentários no trecho de código coisinhas assim aconteceram várias vezes em seu código, portanto eu vou liberar abaixo uma versão corrigida do seu código, mas em geral o código está certo, você somente precisa tomar um pouquinho mais de cuidado com onde você começa e termina as partes dos códigos.

O código corrigido e funcionando:

// variaveis da bolinha
let xBolinha = 100;
let yBolinha = 100;
let diametro = 20;
let raio = diametro/ 2

// velocidade da bolinha
let velocidadeXBolinha = 6;
let velocidadeYBolinha = 6;

// variaveis da raquete
let xRaquete = 5;
let yRaquete = 150;
let raqueteComprimento = 10;
let raqueteAltura = 90;

// variaveis outra raquete
let xRaquete2 = 580;
let yRaquete2 = 150;
let raqueteCompriment = 10;
let raqueteAltur = 90;

let colidiu = false;

function setup() {
  createCanvas(600, 400);

}

function draw() {
  background(0);  
  mostraBolinha();
  movimentaBolinha();
  verificaColisaoBorda();
  mostraRaquete();
  movimentaMinhaRaquete();
  verificaColisaoRaquete();
  colisaoMinhaRaqueteBiblioteca();
  outraRaquete();
}

function movimentaBolinha (){
   xBolinha += velocidadeXBolinha;
   yBolinha += velocidadeYBolinha;
}

function verificaColisaoBorda (){
  if (xBolinha + raio > width || 
      xBolinha - raio < 0){
    velocidadeXBolinha *= -1;
  }

  if (yBolinha + raio > height ||
     yBolinha - raio < 0){
    velocidadeYBolinha *= -1;
  }

}

function mostraBolinha (){
  circle (xBolinha, yBolinha, diametro);
}

function mostraRaquete (){
    rect (xRaquete, yRaquete, raqueteComprimento, raqueteAltura);
}

function movimentaMinhaRaquete(){
  if (keyIsDown(UP_ARROW)){
    yRaquete -= 10;
  }

  if(keyIsDown(UP_ARROW)){
      yRaquete2 -= 5
  }

  if(yRaquete2 < 0){
        yRaquete2 = 0
  }

  if (keyIsDown (DOWN_ARROW)){
    yRaquete += 10;
  }
}

function verificaColisaoRaquete(){
  if (xBolinha - raio < xRaquete + raqueteComprimento && yBolinha - raio < yRaquete + raqueteAltura && yBolinha + raio > yRaquete){
    velocidadeXBolinha *= -1;
  }
}

function colisaoMinhaRaqueteBiblioteca(){
    colidiu = 
    collideRectCircle(xRaquete, yRaquete, raqueteComprimento, raqueteAltura, xBolinha, yBolinha, raio);
    if (colidiu){
      velocidadeXBolinha *= -1;
    }
}

function outraRaquete(){
   rect(xRaquete2, yRaquete2, raqueteComprimento, raqueteAltura);
}

Em geral, era isso, se você precisar de mais algo, ou não entendeu alguma coisa que eu falei, é só manifestar-se que eu tentarei explicar de outra forma. Desde já fico a disposição.

Espero ter ajudado um pouco pelo menos. Um abraço e bons estudos.

Aaahh, perfeito, Renan! Eu entendi agora, muitíssimo obrigada!