1
resposta

Nao consigo fazer funcionar a colisão usando a lib que ele usa do git.

Olá meu código tem algumas diferenças para o do prof. pois fui tentando fazer do meu jeito, estava dando certo até precisar fazer a colisão da raquete do oponente, das maneiras que tentei nao funcionam, sem entrar em detalhes a melhor solução é a apresentada pelo professor, mas não consigo fazer a biblioteca apresentada gerar o efeito de colisão devido; meu código:

//sessão de declaração de variáveis.          

//variaveis da bolinha

let xBolinha = 300;
let yBolinha = 200;
let diametro = 50;
let raio = 25;

//velocidade da bolinha

let xVelocidadebol = 2;
let yVelocidadebol = 6;


//velocidade da bolinha oponente
let xVelocidadebolOp = 2;
let yVelocidadebolOp = 6;

//Variáveis Raquete
let xRaquete = 5;
let yRaquete = 150;
let raioNormal = 10
let xRaqueteComRaio = xRaquete + raioNormal
let raqueteComprimento = 10;
let raqueteAltura = 100;
let MovRaquete = 6;

//variáveis raquete oponente
let xRaqueteOp = 585;
let yRaqueteOp = 150; 
let MovRaqueteOp = 6;
let raioOp = 10

//variável referente a biblioteca de colisão importada do github: https://github.com/bmoren/p5.collide2D#colliderectcircle

let colidiu = false;

//sessão de funções do programa.
function setup() {
  createCanvas(600, 400);
}

//DRAW
function draw() {
  background(0);  
  describe ('black outline');
  mostrabolinha ();  
  movimentoBolinha ();
  //colisaoBordasBolinha (); 
  Raquete (xRaquete, yRaquete);
  Raquete (xRaqueteOp, yRaqueteOp);
  movimentoRaquete ();
  //movimentoRaqueteOp(); 
  colisaoMinhaRaqueteBiblioteca ();
  //colisaoRaqueteBola(); 
  //colisaoRaqueteBolaOponete ();


}

//Funções desenho da bolinha

function mostrabolinha (){
   circle(xBolinha,yBolinha,diametro);    
}
//Função movimento da bolinha
function movimentoBolinha (){
  xBolinha += xVelocidadebol;
  //yBolinha += yVelocidadebol;    
}
//FUNÇÃO colisão da bolinha com bordas
function colisaoBordasBolinha (){  
  if(xBolinha + raio >= width || xBolinha - raio < 0){
     xVelocidadebol *= -1;  }    
  if (yBolinha + raio > height || yBolinha - raio < 0){
      yVelocidadebol *= -1; }       
}

// FUNÇÃO DESENHO da raquete
// ______
function Raquete (x,y){
  rect (x,y,raqueteComprimento,raqueteAltura);
}


 //FUNÇÃO Movimento da raquete e 
function movimentoRaquete() {
  if (keyIsDown(UP_ARROW)){
    yRaquete -= 10 ;} 
  //else if(yRaquete + raioRaquete  >= height ){
     //MovRaquete *= +1;
 // } 
    if(keyIsDown(DOWN_ARROW)){
      yRaquete += 10;    }
}  
//FUNÇÃO Movimento da raquete oponente
  function movimentoRaqueteOp (){
    MovRaqueteOp = yBolinha - yRaqueteOp -RaqueteComprimento / 2 - 30;
    yRaqueteOp += MovRaqueteOp

  }
//FUNÇÃO colisão raquete e bolinha
  function colisaoRaqueteBola ()   {    
  if(xBolinha - raio <= xRaquete + raioNormal && yBolinha - raio < yRaquete + RaqueteAltura && yBolinha + raio > yRaquete  ){
     xVelocidadebol *= -1;  }

  }

  function colisaoRaqueteBolaOponete (){    
    if(xBolinhaOp + raioBolOp <= xRaqueteOp + raioBolOp   ){
     xVelocidadebolOp *= -1;  }
  }
// Função colisão raquete da biblioteca

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

Olá Daniel, tudo bem?

Peço desculpa pela demora para responder o seu tópico.

Realizei uns testes no código compartilhado, vou estar deixando alguns pontos de melhorias que você pode estar fazendo.

Modificar a função colisaoMinhaRaqueteBiblioteca(), de forma que você peça que seja passado dois parâmetros, sendo eles o x e y. Pois assim, quando você fazer a chamada da função no DRAW, essa função irá funcionar tanto para a sua raquete quanto para a do oponente. Segue o exemplo:

function verificaColisaoRaquete(x, y) {
    colidiu = collideRectCircle(x, y, raqueteComprimento, raqueteAltura, xBolinha, yBolinha, raio);
    //restante do código
}

E quando chamar a função no DRAW, faça da seguinte forma:

    verificaColisaoRaquete(xRaquete, yRaquete);
    verificaColisaoRaquete(xRaqueteOp, yRaqueteOp);

Alterar o nome da variável que representa a velocidade X da bolinha, que está sendo usando dentro da função function colisaoMinhaRaqueteBiblioteca().

function colisaoMinhaRaqueteBiblioteca(x, y) {
    colidiu = collideRectCircle(x, y, raqueteComprimento, raqueteAltura, xBolinha, yBolinha, raio);
    if (colidiu) {
        xVelocidadebol *= -1;
    }
}

Você está usando a variável velocidadeXBol para fazer a alteração da direção da bolinha, porém, no começo do seu código, você definiu a variável xVelocidadebol para fazer isso. Logo, fazendo a alteração do nome, como no exemplo acima, podemos solucionar essa situação.

Por fim, por uma questão mais visual, aconselho que altere o tamanho do diâmetro da bolinha para 40. Pois o valor 50, que estava antes, deixava uma parte da bolinha passar pela raquete.

Espero que esses pontos que deixei possam lhe ajudar. Caso tenha mais alguma questão ou dúvida, estarei à disposição.

Bons estudos!

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