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

[Dúvida]Colisão do Oponente sem collideRectCircle?

Olá, tudo certo?

Estava fazendo a aula em questão, porém acabei não optando por utilizar a importação do repositório e biblioteca collideRectCircle. No caso fiz vários testes no código, e notei que o mesmo código de colisão na minha raquete não se aplica para a colisão da raquete do oponente, ocorrendo algum bug travando a bolinha no centro e movendo apenas o eixo y. Fiz vários testes de tamanho e valores para tentar simular a colisão da raquete do oponente, porém nenhuma funcionou devidamente. Minha dúvida é se teria alguma forma de fazer a colisão da raquete do oponente sem usar a biblioteca? Segue abaixo o código.

//Criação das Variáveis Bola
let xBola = 300;
let yBola = 200;
let velxBola = 3;
let velyBola = 3;
let diametro = 30;
let raio = diametro / 2;

//Criação das Variáveis Raquete
let xRaquete = 5;
let yRaquete = 160;
let compRaquete = 10;
let largRaquete = 90;
let xRaqueteOp = 585;
let yRaqueteOp = 160;
let velyRaqueteOp;

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

function draw() {
  background(0);
  bola();
  movimentarBola();
  colisaoBola();
  pau();
  movimentarPau();
  colisaoPaus();
  pauNPC();
  movimentarPauNPC();
}

function bola() {
  circle(xBola, yBola, diametro);
}

function movimentarBola() {
  xBola += velxBola;
  yBola += velyBola;
}

function colisaoBola() {
  if (xBola + raio > width || xBola - raio < 0)
    velxBola *= -1;

  if (yBola + raio > height || yBola - raio < 0)
    velyBola *= -1;
}

function pau() {
  rect(xRaquete, yRaquete, compRaquete, largRaquete);
}

function pauNPC() {
  rect(xRaqueteOp, yRaqueteOp, compRaquete, largRaquete);
}

function movimentarPau() {
  if (keyIsDown(UP_ARROW)) {
    yRaquete -= 5;
  }
  if (keyIsDown(DOWN_ARROW)) {
    yRaquete += 5;
  }
}
function colisaoPaus() {
  if (xBola - raio < xRaquete + compRaquete && yBola - raio < yRaquete + largRaquete && yBola + raio > yRaquete)
    velxBola *= -1

  if (xBola - raio < xRaqueteOp + compRaquete && yBola - raio < yRaqueteOp + largRaquete && yBola + raio > yRaqueteOp)
    velxBola *= -1

}

function movimentarPauNPC() {
  velyRaqueteOp = yBola - yRaqueteOp - 50;
  yRaqueteOp += velyRaqueteOp;
}

Se remover a parte do código if (xBola - raio < xRaqueteOp + compRaquete && yBola - raio < yRaqueteOp + largRaquete && yBola + raio > yRaqueteOp) velxBola *= -1 presente na função de colisaoPaus, a bolinha funciona corretamente, porém sem colisão com a raquete do oponente.

2 respostas

Olá, também gostaria de saber como. Não queria incluir o arquivo p5.collide.js no meu jogo !

Tentei vários códigos, incluindo a da raquete que controlo.

solução!

Atualizando o Post. Fiz alguns testes e consegui corrigir criando a limitação X da raquete do oponente na parte da esquerda também, ficando da seguinte forma:

if (xBola - raio < xRaqueteOp + compRaquete &&  xBola - raio > 555 && yBola - raio < yRaqueteOp + largRaquete && yBola + raio > yRaqueteOp)
    velxBola *= -1
}

Adicionei apenas a parte do && xBola - raio > 555, para complementar em qual posição X a Bolinha deveria estar para considerar a colisão na parte da "esquerda" da raquete.

Pode alterar manualmente o valor de 555 para outros e ir testando, vai notar que a bolinha vai bater em locais diferentes, e ir ajustando até a o valor X correto da raquete, ou pode usar a variável também, mas preferi manualmente.