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

[Dúvida] Problema com o placar...

O placar ficou no entanto bem estranho, eu deixo rodando o codigo e deixo o oponente acertar o lado esquerdo da tela, mas não conta em sequência, quando volto a olhar o placar pula do 0 para o 7 e do 7 para o 31, ainda não entendi mas deve ser apenas algum bug ou paridade.

aqui vai o codigo:

//let bolinha
let xBolinha = 300;
let yBolinha = 200;
let diametroBolinha = 30;
let velocidadeXBolinha = 8;
let velocidadeYBolinha = 8;
let raio = diametroBolinha / 2;

//let raquete
let xRaquete = 5;
let yRaquete = 150;
let raqueteComprimento = 10;
let raqueteAltura = 90;

//let raquete2
let xRaquete2 = 585;
let yRaquete2 = 150;
let speedRaquete2;

// hit bolinha
let hit = false;

//pontos
let pontos = 0;
let pontosOponente = 0;

/*-----------------setup-----------------*/
function setup() {
  createCanvas(600, 400);
}
/*-----------------setup-----------------*/
function draw() {
  background(70);
  mostraBolinha();
  movimentaBolinha();
  colisaoBorda();
  raqueteDisplay(xRaquete, yRaquete);
  raqueteDisplay(xRaquete2, yRaquete2);
  movimentoRaquete();
  movimentoRaquete2();
  colisaoRaquete();
  p5collide2d(xRaquete,yRaquete);
  p5collide2d(xRaquete2,yRaquete2);
  placar();
  marcarPontos();
}

function mostraBolinha () {
  circle(xBolinha, yBolinha, diametroBolinha)
}

function movimentaBolinha () {
   xBolinha += velocidadeXBolinha;
   yBolinha += velocidadeYBolinha;
}

function colisaoBorda () {

   if (xBolinha + raio > width || xBolinha - raio < 0) {
    velocidadeXBolinha *= -1;  
  }

    if (yBolinha + raio > height || yBolinha - raio< 0) {
    velocidadeYBolinha *= -1;  
  }
}

function raqueteDisplay (x, y) {
  rect(x, y, raqueteComprimento, raqueteAltura);
}

function movimentoRaquete() {
  if (keyIsDown(UP_ARROW)) {
    yRaquete -= 10;
  }

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

}

function movimentoRaquete2() {
  speedRaquete2 = yBolinha - yRaquete2 - raqueteComprimento / 2 - 30;
  yRaquete2 += speedRaquete2;
}

function colisaoRaquete() {
  if (xBolinha - raio < xRaquete + raqueteComprimento && yBolinha - raio < yRaquete + raqueteAltura && yBolinha + raio > yRaquete) {
    velocidadeXBolinha *= -1;
  } 
}

function p5collide2d(x,y) {
  hit = collideRectCircle(x, y, raqueteComprimento, raqueteAltura, xBolinha, yBolinha, raio);
  if(hit) {
    velocidadeXBolinha *= -1;
  }
}

function placar() {
  fill (255);
  text(pontos, 278, 26);
  text (pontosOponente,231, 26)
}

function marcarPontos() {
  if (xBolinha > 590){
    pontos += 1;
  }
  if (xBolinha < 10) {
    pontosOponente += 1;
  }
}
3 respostas
solução!

Oi, Ian! Tudo bem?

Para pontuarmos normalmente, temos que ajustar o parâmetro de xBolinha na função marcarPontos() ao tamanho do raio da nossa bolinha.

Como o ponto central da bolinha é o ponto que definirá a sua localização, então sempre que a posição x da bolinha estiver a uma distância igual ao seu raio da parede, deveremos contar 1 ponto, pois é sinal que a extremidade da bolinha atingiu a parede.

Devemos notar, entretanto, que na função marcarPontos() a diferença entre a posição da bolinha e a localização dos extremos da tela (que representam as paredes) é inferior ao seu raio.

Como o nosso raio declarado no código é 15, podemos calcular então a posição x da Bolinha ao atingir a parede através dele, da seguinte forma: 0 (extremidade esquerda da tela do jogo) + 15 (raio da bolinha) = 15. E 600(extremidade direita da tela do jogo) - 15 (raio da bolinha) = 585.

Dessa forma, para conseguirmos pontuar basta alterarmos os nossos parâmetros utilizados inicialmente pelos parâmetros calculados acima. Deixando a função marcarPontos() da seguinte maneira:

function marcarPontos() {
  if (xBolinha > 585){
    pontos += 1;
  }
  if (xBolinha < 15) {
    pontosOponente += 1;
  }
}

Vale ressaltar também, que podemos considerar uma margem de erro igual a 2 no nosso programa, logo, 586 e 587, juntamente com 14 e 13, também são valores aplicáveis para possíveis substituições.

Espero ter ajudado! Estou à disposição caso surja alguma dúvida!

Um forte abraço e bons estudos!

Caso este post tenha te ajudado, por favor, marcar como solucionado ✓

Então, estou tendo mesmo problema, mesmo quando considerei o raio da minha bolinha e incluindo no código, e ainda estrapolando os valores limites para contar os pontos o placar não mudou. O que está errado?

//placar do jogo
let meusPontos = 0
let pontosOponente = 0

//variáveis da bolinha
let xBolinha = 300;
let yBolinha = 200;
let diametro = 20;
let raio = diametro / 2;

//velocidade da bolinha
let velocidade_x_Bolinha = 3;
let velocidade_y_Bolinha = 3;

//variáveis da raquete
let xRaquete = 5;
let yRaquete = 150;
let raqueteCompr = 8;
let raqueteAltura = 90;

//variáveis da raquete oponente
let xRaqueteOponente = 585;
let yRaqueteOponente = 150;
let velocidade_Y_Oponente;

let colidiu = false

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

function draw() {
  background(0);
  incluiPlacar();
  marcaPontos(meusPontos, pontosOponente);
  mostraBolinha();
  movimentaBolinha();
  verificaColisao();
  mostraRaquete(xRaquete,yRaquete);
  mostraRaquete(xRaqueteOponente,yRaqueteOponente);
  moverRaquete();
  movimentaRaqueteOponente();
  //verificaColisaoRaquete();
  verificaColisaoRaquetes(xRaquete, yRaquete);
  verificaColisaoRaquetes(xRaqueteOponente, yRaqueteOponente);
}

function incluiPlacar() {
  fill(255)
  textSize(24)
  text(meusPontos, 245, 26)
  text(pontosOponente, 340, 26)
}

function marcaPontos() {
  if (xBolinha > 587) {
    meusPontos += meusPontos
  }
  if (xBolinha < 23) {
    pontosOponente += pontosOponente
  }
}

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

function movimentaBolinha() {
  xBolinha += velocidade_x_Bolinha;
  yBolinha += velocidade_y_Bolinha;
}

function verificaColisao() {
  if (xBolinha + raio > width ||
      xBolinha - raio < 0){
    velocidade_x_Bolinha *= -1;
  }
  if (yBolinha + raio > height ||
      yBolinha - raio < 0){
    velocidade_y_Bolinha *= -1;
  }
}

function verificaColisaoRaquete() {
  if (xBolinha - raio < xRaquete + raqueteCompr
      && yBolinha - raio < yRaquete + raqueteAltura
      && yBolinha + raio > yRaquete) {
        velocidade_x_Bolinha *= -1;
  }
}

function mostraRaquete(x,y) {
  rect(
    x,
    y,
    raqueteCompr,
    raqueteAltura
    )    
}

function moverRaquete() {
  if (keyIsDown(UP_ARROW)) {
    yRaquete -= 10;
  }
  if (keyIsDown(DOWN_ARROW)) {
    yRaquete += 10
  }
}

function verificaColisaoRaquetes(x, y) {
  colidiu = collideRectCircle(x, y, raqueteCompr, raqueteAltura, xBolinha, yBolinha, raio);
  if (colidiu){
    velocidade_x_Bolinha *= -1;
  }
}

function movimentaRaqueteOponente(){
  velocidade_Y_Oponente = yBolinha - yRaqueteOponente - raqueteCompr /2 -30;
  yRaqueteOponente += velocidade_Y_Oponente;
}

Desculpem, achei o erro!