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

[Dúvida] Colisão da bolinha com a raquete adversária não funciona.

function racketsballcolision (x, y) {
  if (xball - rball < xracket1 + widthracket && yball - rball < yracket1 + heightracket && yball + rball > yracket1) {

    veloballx *= -1;
  }
  if (xball > xracket2 - widthracket && yball + rball > yracket2 && yball < yracket2) {

    veloballx *= -1;
  }
}

Usei o código acima e, quando a bolinha se movimenta somente na direção x, colide tudo certinho. Mas quando eu habilito a movimentação no eixo y ele para de colidir e ignora a raquete adversária... Eu já mudei todo o código da raquete2 e nada funciona, alguém pode me salva? :(

Este é o código completo:

//ball variables
let xball = 300;
let yball = 200;
let dball = 20;
let rball = dball / 2;

//ball speed
let velobally = 6;
let veloballx = 6;

//racket 1 variables
let xracket1 = 5;
let yracket1 = 150; //<-- account of the racket height, subtract the screen height for racket height.
let widthracket = 10;
let heightracket = 100;

//racket 2 variables
let xracket2 = 585; //<-- account of the racket width, subtract the screen width for the racket width.
let yracket2 = 150;
let racket2speed;

//screen width x height
function setup() {
  createCanvas(600, 400);
  }

function draw() {
  background(0);
  showball ();
  ballmovement ();
  borderballcolision ();
  rackets (xracket1, yracket1);
  racketsmovement ();
  rackets (xracket2, yracket2);
  racketsballcolision ();
}

function showball () {
  circle (xball, yball, dball); 
  }

function ballmovement () {
  xball += veloballx;
  yball += velobally;   
  }

function borderballcolision () {

  //width colision
  if (xball + rball > width ||
    xball - rball < 0) {

  veloballx *= -1;
  }

  //height colision
  if (yball + rball > height ||
   yball - rball < 0) {

  velobally *= -1;
  }
}
function rackets (x, y) {
  rect (x, y, widthracket, heightracket)
}

function racketsmovement () {
  if (keyIsDown (UP_ARROW)) {
    yracket1 -= 10;
  }

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

  racket2speed = yball - yracket2 - widthracket / 2 - 45;
  yracket2 += racket2speed;

}

function racketsballcolision (x, y) {
  if (xball - rball < xracket1 + widthracket && yball - rball < yracket1 + heightracket && yball + rball > yracket1) {

    veloballx *= -1;
  }
  if (xball > xracket2 - widthracket && yball + rball > yracket2 && yball < yracket2) {

    veloballx *= -1;
  }
}
2 respostas
solução!

Olá João, tudo certo?

Parabéns pelo seu esforço e dedicação até aqui!

Analisando o seu código percebi que a parte referente a raquete do jogador pode ser reutilizado na raquete do oponente. Nesse caso sugiro o código abaixo:

function racketsballcolision (x, y) {
  if (xball - rball < xracket1 + widthracket && yball - rball < yracket1 + heightracket && yball + rball > yracket1) {

    veloballx *= -1;
  }
  if (xball + rball > xracket2 - widthracket && yball - rball < yracket2 +  heightracket && yball + rball > yracket2) {

    veloballx *= -1;
  }
}

Para entender melhor como abordamos a colisão das raquetes segue um tópico com imagens que podem auxiliar:


Vamos ao Código?

Quebraremos o código em partes para que fique claro a lógica por trás do mesmo:

  • Em um primeiro momento acrescentamos na posição da bolinha o seu raio, compreendendo dessa forma toda a parte direita da bolinha que entrará em colisão:
xball + rball
  • Usaremos o sinal de maior como forma de de explicar ao código que quando está parte da bolinha atravessar a posição a seguir ela voltará com veloballx *= -1;

Mas não é só isso, na construção tanto da bolinha quanto da raquete, por se tratar de um objeto plano tem tanto largura quanto altura que devem ser calculadas na hora da colisão, por conta disso:

  • Considere que a posição horizontal da raquete (X) e sua largura vão compor a parte em colisão horizontal:
xball + rball > xracket2 - widthracket
  • E a partir de agora trabalharemos as mesmas ideias só que com as posições verticais da raquete e da bolinha para que colidam adequadamente tanto na parte de cima como a de baixo:
yball - rball < yracket2 +  heightracket
yball + rball > yracket2

Deixo aqui o link do projeto para que comprove que está tudo funcionando corretamente:

Se precisar de ajuda ou tiver alguma dúvida, estou à disposição, conte comigo!

Um bom dia e bons estudos

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

Muito obrigado pela explicação!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software