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

[Dúvida de entendimento/ou dúvida lógica] Dúvida na lógica de colisão

Update: O 0(zero) no eixo x do canvas é no canto mais a esquerda da tela. Update 2: O "width" é no canto mais a direita do canvas.

Chamando os raios dentro do eixo y DA BOLINHA de "norte" e "sul" e do eixo x DA BOLINHA de "leste" e "oeste":

Acho que como o y e o x da bolinha são sempre no meio e os raios são sempre iguais, somar o raio serve para testar a borda da bolinha de todos os lados. Aqui no tutorial não se soma a altura, então o valor seria na ponta mais ao norte. Tem um motivo para eu achar que é na ponta ao norte. Para eu testar, eu coloquei o width e o height como 1 e a minha raquete foi para cima. Nesse caso, eu estaria testando se a minha bolinha não passa da parte norte da raquete?

Esse é meu código atual:


let xBolinha = 300;
let yBolinha = 200;
let diametro = 15;
let raio = diametro/2;
let xRaqueteJogador = 30;
let xRaqueteBot = 560;
let yRaqueteJogador = 150;
let yRaquetebot = 150;
let widthRaquete = 10; /*10*/
let heightRaquete = 90; /*90*/
let radiusOfTheCornerOfTheRaquete = 2;    
let velocidadeXBolinha = 1;
let velocidadeYBolinha = 6;

    function setup() {
      createCanvas(600, 400);
    }
    function draw() {
      background(5);
      mostraBolinha()
      movimentaBolinha()
      verificaColisaoDaBolinhaComAParade()
      mostraRaqueteJogador()
      mostraRaqueteBot()
      moveRaqueteJogador()
    }
    function mostraRaqueteJogador(){
      rect(xRaqueteJogador, yRaqueteJogador, widthRaquete, heightRaquete, radiusOfTheCornerOfTheRaquete);
    }
    function mostraRaqueteBot(){
      rect(xRaqueteBot, yRaquetebot, widthRaquete, heightRaquete, radiusOfTheCornerOfTheRaquete);
    }
    function mostraBolinha(){
      circle(xBolinha,yBolinha,diametro);
    }
    function movimentaBolinha(){
      xBolinha += velocidadeXBolinha;
      //yBolinha += velocidadeYBolinha;
    }
    function verificaColisaoDaBolinhaComAParade(){
      if(xBolinha + raio > width|| xBolinha - raio < 0){
    mudaDirecaoBolinhaEixoX()
    }
      if(yBolinha + raio > height || yBolinha - raio < 0){
        mudaDirecaoBolinhaEixoY()
      }
    }
    function mudaDirecaoBolinhaEixoX(){
      velocidadeXBolinha *= -1;
    }
    function mudaDirecaoBolinhaEixoY(){
      velocidadeYBolinha *= -1;
    }
    function moveRaqueteJogador() {
      if (keyIsDown(UP_ARROW)) {
        yRaqueteJogador -= 10;
        }
      if(keyIsDown(DOWN_ARROW)){
        yRaqueteJogador += 10;
      }
    }
    function verificaColisãoComARaquete(){
      if(xBolinha - raio < xRaqueteJogador + widthRaquete &&
        yBolinha - raio < yRaqueteJogador + heightRaquete &&
    yBolinha + raio > yRaqueteJogador){
    velocidadeXBolinha *= -1
  }
}

Outra coisa interessante, consigo prender a minha bolinha na raquete: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

2 respostas
solução!

Boa noite Karina,

Seu pensamento está correto, gostei da tua abordagem usando os pontos cardeais vou aproveitar para ratificar teu entendimento: os testes são para verificar se a fronteira OESTE da bolinha está colidindo com a face LESTE da raquete, porém, ainda é necessário passar por mais dois testes condicionais que são: se a fronteira NORTE da bolinha é menor que o lado NORTE da raquete, o mesmo vale para o lado SUL, resumindo, a bolinha tem que estar entre os limites NORTE e SUL da raquete para que seja verifica a colisão.

No caso da raquete do oponente a única coisa que inverte é o teste de xBolinha, pois nesse caso queremos detectar se a fronteira LESTE da bolinha está colidindo com a face OESTE da raquete.

Segue uma imagem abaixo que fiz a um tempo atrás para ilustrar essa ideia:

Isso me ajudou muito. Obrigada (: