2
respostas

A Bolinha atravessa a raquete oponente e está marcando 3 pontos ao invés de 1.

//Variáveis da Bolinha
let xBolinha = 300;
let yBolinha = 200;
let diametro = 15;
let raio = diametro/2;

//Velocidade da Bolinha
let velocidadexBolinha = 2;
let velocidadeyBolinha = 5.5;

//Variáveis da Raquete 1
let xRaquete1 = 5;
let yRaquete1 = 150;
let raquete1Comprimento = 10;
let raquete1Altura = 90;

//Variáveis da Raquete 2
let xRaquete2 = 585;
let yRaquete2 = 150;
let raquete2Comprimento = 10;
let raquete2Altura = 90;
let velocidadeyRaquete2;

//Placar do Jogo
let pontosPlay1 = 0;
let pontosPlay2 = 0;

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

function draw() {
  background(0);
  mostraBolinha();
  //movimentoBolinha();
  verificaColisaoBorda();
  mostraRaquete1(xRaquete1, yRaquete1);
  movimentaRaquete1();
  verificaColisaoRaquete1();
  mostraRaquete2(xRaquete2, yRaquete2);
  movimentaRaquete2();
  verificaColisaoRaquete2();
  incluiPlacar();
  marcaPonto();
}

function mostraBolinha(){
  circle(xBolinha, yBolinha, diametro);
}

function movimentoBolinha(){
  xBolinha += velocidadexBolinha;
  yBolinha += velocidadeyBolinha;
}

function verificaColisaoBorda(){
  if(xBolinha+raio > width ||
    xBolinha-raio < 0){
  velocidadexBolinha *= -1;
  }
  if(yBolinha+raio > height ||
    yBolinha-raio < 0){
  velocidadeyBolinha *= -1;
  }
}

function mostraRaquete1(x, y){
  rect(x, y, raquete1Comprimento, raquete1Altura);
}

function movimentaRaquete1(){
  if(keyIsDown(UP_ARROW)){
    yRaquete1 -=10;
  }
  if(keyIsDown(DOWN_ARROW)){
    yRaquete1 +=10;
  }
}

function verificaColisaoRaquete1(){
  if (xBolinha - raio < xRaquete1 + raquete1Comprimento && 
      yBolinha - raio < yRaquete1 + raquete1Altura && 
      yBolinha + raio > yRaquete1){
    velocidadexBolinha *= -1;
  }
}

function mostraRaquete2(x, y){
  rect(x, y, raquete2Comprimento, raquete2Altura);
}

function movimentaRaquete2(){
  velocidadeyRaquete2 = yBolinha - yRaquete2 - raquete2Comprimento / 2 - 35;
  yRaquete2 += velocidadeyRaquete2;
}

function verificaColisaoRaquete2(){
  if (xBolinha + raio > xRaquete2 - raquete2Comprimento & 
      yBolinha + raio > yRaquete2 - raquete2Altura & 
      yBolinha - raio < yRaquete2){
    velocidadexBolinha *= -1;
  }
}

function incluiPlacar(){
  fill(255);
  text(pontosPlay1, 278, 26);
  text(pontosPlay2, 321, 26);
}

function marcaPonto(){
  if(xBolinha > 590){
    pontosPlay1 += 1;
  }
  if(xBolinha < 10){
    pontosPlay2 += 1;
  }
}
2 respostas

Oi Diego, tudo bem?

Pelo que eu vejo, você está enfrentando dois problemas principais: a bolinha está atravessando a raquete do oponente e o placar está marcando 3 pontos ao invés de 1.

Para o primeiro problema, acredito que o erro esteja na função verificaColisaoRaquete2(). Você está usando o operador & para a verificação, quando deveria usar && para um correto funcionamento do operador lógico AND. Assim, a função fica:

function verificaColisaoRaquete2(){
  if (xBolinha + raio > xRaquete2 - raquete2Comprimento && 
      yBolinha + raio > yRaquete2 - raquete2Altura && 
      yBolinha - raio < yRaquete2){
    velocidadexBolinha *= -1;
  }
}

Quanto ao segundo problema, parece que a função marcaPonto() está sendo chamada mais de uma vez antes que a bolinha possa ser resetada para o centro, fazendo com que mais de um ponto seja marcado por vez. Uma solução possível seria adicionar uma variável de controle para verificar se a bolinha já marcou ponto e evitar que ela marque novamente até ser resetada.

Por exemplo, você pode adicionar uma variável marcouPonto:

let marcouPonto = false;

E então, na função marcaPonto(), você verifica se marcouPonto é false antes de adicionar pontos:

function marcaPonto(){
  if(xBolinha > 590 && !marcouPonto){
    pontosPlay1 += 1;
    marcouPonto = true;
  }
  if(xBolinha < 10 && !marcouPonto){
    pontosPlay2 += 1;
    marcouPonto = true;
  }
}

Finalmente, você precisa resetar marcouPonto para false quando a bolinha é resetada para o centro. Supondo que você tenha uma função resetBolinha() que faz isso, ela ficaria assim:

function resetBolinha(){
  xBolinha = 300;
  yBolinha = 200;
  marcouPonto = false;
}

Espero que essas sugestões possam te ajudar a solucionar os problemas. Lembre-se que a prática leva à perfeição, então continue se esforçando e não desanime!

Um abraço e bons estudos.

Oi Lorena. Fiz os ajustes, os pontos estão funcionando agora. Porem a bolinha continua atravessando a raquete.

//Variáveis da Bolinha
let xBolinha = 300;
let yBolinha = 200;
let diametro = 15;
let raio = diametro/2;

//Velocidade da Bolinha
let velocidadexBolinha = 5;
let velocidadeyBolinha = 5.5;

//Variáveis da Raquete 1
let xRaquete1 = 5;
let yRaquete1 = 150;
let raquete1Comprimento = 10;
let raquete1Altura = 90;

//Variáveis da Raquete 2
let xRaquete2 = 585;
let yRaquete2 = 150;
let raquete2Comprimento = 10;
let raquete2Altura = 90;
let velocidadeyRaquete2;

//Placar do Jogo
let pontosPlay1 = 0;
let pontosPlay2 = 0;
let marcouPonto = false;

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

function draw() {
  background(0);
  mostraBolinha();
  movimentoBolinha();
  verificaColisaoBorda();
  mostraRaquete1(xRaquete1, yRaquete1);
  movimentaRaquete1();
  verificaColisaoRaquete1();
  mostraRaquete2(xRaquete2, yRaquete2);
  movimentaRaquete2();
  verificaColisaoRaquete2();
  incluiPlacar();
  marcaPonto();
  resetBolinha();
}

function mostraBolinha(){
  circle(xBolinha, yBolinha, diametro);
}

function movimentoBolinha(){
  xBolinha += velocidadexBolinha;
  yBolinha += velocidadeyBolinha;
}

function verificaColisaoBorda(){
  if(xBolinha+raio > width ||
    xBolinha-raio < 0){
  velocidadexBolinha *= -1;
  }
  if(yBolinha+raio > height ||
    yBolinha-raio < 0){
  velocidadeyBolinha *= -1;
  }
}

function mostraRaquete1(x, y){
  rect(x, y, raquete1Comprimento, raquete1Altura);
}

function movimentaRaquete1(){
  if(keyIsDown(UP_ARROW)){
    yRaquete1 -=10;
  }
  if(keyIsDown(DOWN_ARROW)){
    yRaquete1 +=10;
  }
}

function verificaColisaoRaquete1(){
  if (xBolinha - raio < xRaquete1 + raquete1Comprimento && 
      yBolinha - raio < yRaquete1 + raquete1Altura && 
      yBolinha + raio > yRaquete1){
    velocidadexBolinha *= -1;
  }
}

function mostraRaquete2(x, y){
  rect(x, y, raquete2Comprimento, raquete2Altura);
}

function movimentaRaquete2(){
  velocidadeyRaquete2 = yBolinha - yRaquete2 - raquete2Comprimento / 2 - 35;
  yRaquete2 += velocidadeyRaquete2;
}

function verificaColisaoRaquete2(){
  if (xBolinha + raio > xRaquete2 - raquete2Comprimento && 
      yBolinha + raio > yRaquete2 - raquete2Altura && 
      yBolinha - raio < yRaquete2){
    velocidadexBolinha *= -1;
  }
}

function incluiPlacar(){
  fill(255);
  text(pontosPlay1, 278, 26);
  text(pontosPlay2, 321, 26);
}

function marcaPonto(){
  if(xBolinha > 590 && !marcouPonto){
    pontosPlay1 += 1;
    marcouPonto = true;
  }
  if(xBolinha < 10 && !marcouPonto){
    pontosPlay2 += 1;
    marcouPonto = true;
  }
}

function resetBolinha (){
  marcouPonto = false;
}

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