3
respostas

Ajuda por favooor: Colisão Raquete Imperfeita

Boa noite (ou dia, ou tarde), espero que estejam bem!

Meu jogo funciona perfeitamente, tal qual o do professor nos vídeos, PORÉM, tem uma coisa que está me matando lentamente, a bolinha entrando parcialmente na raquete! Se você segue o código na íntegra, a bolinha entrará tanto na parede quando na raquete de vez em quando, caracterizando, ao meu ver, uma colisão imperfeita. A parede, consegui resolver criando um parâmetro de offset que, antes de a bolinha se mover, é calculada um valor que se a bolinha entraria na parede, ele ajusta o próximo movimento. Com a raquete, porém, não consegui implementar a mesma lógica, já que ela não é estática e não tenho como determinar se a raquete estará ou não no próximo frame no lugar de colisão.

Alguém tem uma solução da "Colisão Imperfeita com a Raquete"?

Deixo meu código:

let xCanva = 800;
let yCanva = 450;
let xBall = xCanva/2;
let yBall = yCanva/2;



let dBall = 30;
let xspdBall = -13
let yspdBall = -13

let yspdP1 = 15; 


let xoffset = 0;
let yoffset = 0;

let xP1 = xCanva/50;
let yP1 = yCanva/2;
let hP1 = yCanva/7;
let wP1 = xCanva/95;

let hit = false;




function setup() {
  createCanvas(xCanva, yCanva);
  frameRate(30);
}

function draw() {
background(0);

movePlayers();
showP1();
showBall();
colisionwall();
//colisionP1();
colisionP1Lib();
moveBall();


}


// Fazendo a refatoração


function movePlayers(){
  if (keyIsDown( UP_ARROW)) {
        if(yP1-yspdP1 < 10) {yP1 = 5} else yP1-=yspdP1
    } else
    if (keyIsDown(DOWN_ARROW)) {
        if(yP1+yspdP1 > yCanva-hP1-10) {yP1 = yCanva-hP1-5} else yP1+=yspdP1
    }
}

function showP1(){
rect(xP1,yP1, wP1, hP1);
}

function showBall(){
circle(xBall,yBall,dBall);
}

function colisionwall(){
  //Fazer usando o width e o height que denominam o tamanho da tela
if (xBall+0.5*dBall>=width || xBall-0.5*dBall<=0) {xspdBall*=-1};
if (yBall+0.5*dBall>=height|| yBall-0.5*dBall<=0) {yspdBall*=-1};

//fazendo o offset para fazer com que a bolinha nunca entre na parede
xoffset=0;
yoffset=0;
if (xBall + 0.5*dBall + xspdBall >= width) {xoffset = xspdBall - (width - xBall-0.5*dBall)};
if (xBall - 0.5*dBall + xspdBall <= 0) {xoffset = xspdBall+xBall-0.5*dBall};

if (yBall + 0.5*dBall + yspdBall >= height) {yoffset = yspdBall - (height - yBall-0.5*dBall)};
if (yBall - 0.5*dBall + yspdBall <= 0) {yoffset = yspdBall+yBall-0.5*dBall};
}

function colisionP1Lib(){

  hit = collideRectCircle(xP1, yP1, wP1, hP1, xBall, yBall, dBall/2);

  if (hit){xspdBall*=-1};

}


function colisionP1(){

  if (xBall-dBall/2 <= xP1+wP1*2 && yBall-dBall/2<=yP1+hP1 && yBall+dBall/2>=yP1)
  {xspdBall*=-1};
  console.log(xP1+wP1,xBall-dBall/2)
}

function moveBall(){
xBall += xspdBall - xoffset;
yBall += yspdBall - yoffset;
}
3 respostas

Olá, Jonas, tudo bem?

Nessa situação, podemos criar uma função para reconhecer quando a bolinha atravessa a área da raquete e envia uma instrução para a bolinha surgir um pouco à frente da posição da raquete.

Utilizando as suas variáveis criadas, ficaria assim:

function bolinhaNaoFicaPresa(){
    if (xBall - (dBall/2 < 0){
      xBall = 25
    }
}

Deixo como sugestão um tópico em que alguns alunos resolveram essa questão de outras formas, onde toda vez que fizer um ponto a bolinha retornasse ao centro do jogo :

Espero ter ajudado.

Reforço que estou à disposição para tirar dúvidas.

Abraços,

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

Olá, Monalisa, não é esse o problema, a bolinha não trava na minha raquete, mas, antes de colidir, ela entra meia raquete e sai. Isso me incomoda mto, e não consegui sair com uma solução bacana pro problema.

Olá, Jonas! Tudo certo?

Você já resolveu o problema com a lógica!

A situação que ocorreu é que você modificou também os valores do código e, nesse caso, vai precisar alterar outros valores no restante dele, inclusive no diâmetro da bolinha.

Além disso, o diâmetro da bola é apenas um valor de referência, você pode alterá-lo diretamente na condição de colisão, por exemplo:

function colisionP1Lib(){

  hit = collideRectCircle(xP1, yP1, wP1, hP1, xBall, yBall, 20/2);

  if (hit){xspdBall*=-1};

}