Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Pq o som do ponto toca as vezes e o meu ponto nao contabiliza?

Fiz meu código um pouco diferente do que o professor ensina, mas algumas vezes o som do ponto é ativado mas meu ponto nao é contabilizado.

https://editor.p5js.org/lleo.gomes1998/sketches/6gXd4R_LX

//variáveis da bolinha
let xBolinha = 300;
let yBolinha = 200;
let dBolinha = 25;
let raio = dBolinha / 2;

//variáveis das raquetes 
let xRaquete1 = 5;
let yRaquete1 = 150;
let xRaquete2 = 585;
let yRaquete2 = 150;
let cRaquete = 10;         //comprimento das raquetes
let aRaquete = 90;         //altura das raquetes
let velocidadeYRaquete2;
let chanceDeErrar=0;     

//variáveis da velocidade da bolinha
let velocidadeXBolinha = 6;
let velocidadeYBolinha = 6;

//variáveis do placar
let eu = 0;
let ele = 0;

//variáveis sons do jogo
let raquetada;
let ponto;
let trilha;

function preload(){
  raquetada = loadSound('raquetada.mp3');
  ponto= loadSound('ponto.mp3');
  trilha = loadSound ('trilha.mp3');
}

  function setup() {
  createCanvas(600, 400);
  trilha.loop();

}

function draw() {
    background(0);

    criaBolinha();
    movimentaBolinha();
    colideBolinhaBorda();
    criaRaquete1();
    movimentaRaquete1();               //movimenta com as teclas "W" E "S"
    colideBolinhaRaquete1();
    criaRaquete2();
    movimentaRaquete2();
    colideBolinhaRaquete2();
    mostraPlacar();
    contaPlacar();
    //movimentaRaquete2Multiplayer();   //movimenta com as teclas "UP_ARROW" E "DOWN_ARROW"


}

function criaBolinha(){
  circle(xBolinha,yBolinha,dBolinha);
}

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

function colideBolinhaBorda(){
    if (xBolinha + raio > width || xBolinha - raio <0){
    velocidadeXBolinha *= -1;
      ponto.play();
    }
    if (yBolinha + raio > height || yBolinha - raio <0){
    velocidadeYBolinha *=-1;
    }
}

function criaRaquete1(){
    rect(xRaquete1,yRaquete1,cRaquete,aRaquete)
}

function movimentaRaquete1(){
    if (keyIsDown(87)){
      yRaquete1 -= 10}
    if (keyIsDown(83)){
      yRaquete1 += 10}
}

function colideBolinhaRaquete1 (){
    if (yBolinha-raio<yRaquete1+aRaquete && yBolinha+raio>yRaquete1 && xBolinha-raio<xRaquete1+cRaquete){
    xBolinha= 30;
    velocidadeXBolinha *= -1;
    raquetada.play()}

}

function criaRaquete2(){
    rect(xRaquete2,yRaquete2,cRaquete,aRaquete)
}

function movimentaRaquete2(){
    velocidadeYRaquete2 = yBolinha-yRaquete2-cRaquete/2-30;
    yRaquete2 += velocidadeYRaquete2+chanceDeErrar;
    calculaChanceDeErrar();
}

function  colideBolinhaRaquete2(){
    if (xBolinha+raio>xRaquete2 && yBolinha+raio>yRaquete2 && yBolinha-raio<yRaquete2+aRaquete){
      xBolinha = 570;
      velocidadeXBolinha *= -1;
     raquetada.play()}
}

function mostraPlacar(){
  stroke (255);
  textSize (20);
  fill (255,40,0);
  rect(175, 9, 60, 20, 20)
  fill (255);
  text(eu, 200, 26);
  fill (255,40,0);
  rect(375, 9, 60, 20,20)
  fill (255);
  text(ele, 400, 26);
}

function contaPlacar(){
    if (xBolinha+raio>width){
      eu+=1;
    xBolinha=580;}
    if(xBolinha-raio<0){
      ele+=1;
      xBolinha = 20;
    }
}

function  movimentaRaquete2Multiplayer(){
    if (keyIsDown(UP_ARROW)){
      yRaquete2 -= 10}
      if (keyIsDown(DOWN_ARROW)){
      yRaquete2 += 10}
}

function calculaChanceDeErrar(){
      chanceDeErrar = random(43,53)
}
1 resposta
solução!

Oi, Leonardo! Tudo bom?

De maneira geral, ao rodar seu jogo, não notei o problema da marcação de pontos. Mesmo assim, trago algumas sugestões que podem auxiliar na refatoração do seu código, com isso, teremos uma ação de pontuar mais efetiva.

As ideias que irei trazer estão relacionadas à bolinha e como ela age em tela. Vamos ver isso com mais detalhes?

Diâmetro da Bolinha

O tamanho da bolinha pode estar dificultando a marcação de pontos, haja vista que este processo depende do contato da bola com as laterais da tela. Sendo assim, ao invés do diâmetro igual a 25, podemos deixá-lo com o valor 20. O código referente a isso está logo abaixo:

let dBolinha = 20;

Alteração da posição x da bolinha

Em vários momentos do código, há alteração da posição horizontal da bolinha assim que ela colide com as raquetes ou cumpre a condição de marcação de pontos. Dessa maneira, acaba havendo um conflito no código.

Para resolver tal questão, precisaremos remover a modificação da posição x da bolinha das função em que esse comando aparece. Abaixo, seguem os códigos após a alteração:

function colideBolinhaRaquete1 (){
    if (yBolinha - raio < yRaquete1 + aRaquete && 
        yBolinha + raio > yRaquete1 && 
        xBolinha - raio < xRaquete1 + cRaquete){
      velocidadeXBolinha *= -1;
      raquetada.play()
    }
}
function  colideBolinhaRaquete2(){
    if (xBolinha + raio > xRaquete2 && 
        yBolinha + raio > yRaquete2 && 
        yBolinha - raio < yRaquete2 + aRaquete){
      velocidadeXBolinha *= -1;
      raquetada.play()}
}
function contaPlacar(){
    if (xBolinha > width - raio){
      eu += 1;
    }

    if(xBolinha < raio){
      ele += 1;
    }
}

Criando uma função para impedir que a bolinha fique presa atrás da raquete

Nos códigos vistos anteriormente, foi alterado o valor de xBolinha . No entanto, é interessante a criação de uma função única que trabalha com esse ponto — dessa maneira, além de evitarmos bugs, tornamos nosso código mais legível.

Olha só a função que elaborei:

function bolinhaNaoBuga(){
    if (xBolinha - raio <= 0){
      xBolinha = 20;
    } else if (xBolinha >= width - raio){
      xBolinha = width - 20;
    }
}

A função acima irá verificar se xBolinha menos o raio (o que resulta na posição correspondente à borda esquerda da bolinha) é inferior ou igual a 0. Caso isso seja verdade, alteramos o valor de xBolinha para 20. Por outro lado, se xBolinha tiver um valor superior ou igual ao width (tamanho da tela) subtraído de raio, então será necessário alterar o valor de xBolinha para 20 posições a menos do tamanho horizontal da tela.

Aliás, vale ressaltar que, para a função de fato funcionar, precisa-se chamá-la dentro de draw(), da seguinte maneira:

function draw(){
    bolinhaNaoBuga();
}

Com isso, evitamos incompatibilidades com relação à pontuação dos jogadores.

Espero que tenha compreendido minha explicação. Caso surjam outras dúvidas, não hesite em enviá-las no fórum. Fico à disposição para te ajudar.

Até mais e ótimos estudos!

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