1
resposta

Bolinha sumindo e oponente nunca erra.

Este é meu código até o momento:

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

//variáveis raquete jogador
let xRaquete = 5;
let yRaquete = 150;

//variáveis tamanho da raquete
let larguraRaquete = 10;
let comprimentoRaquete = 100;

//variáveis raquete maquina
let xRaqueteMaquina = 585;
let yRaqueteMaquina = 150;
let velocidadeYOponente;

//velocidade da bolinha
let velocidadeXBolinha = 6;
let velocidadeYBolinha = 6;

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

function draw() {
  background(0);
  desenhaBolinha();
  movimentaBolibha();
  desenhaRaquete(xRaquete, yRaquete);
  verificacolisaoBolinha();
  movimentaRaqueteJogador();
  verificaColisaoBolinhaRaquete();
  desenhaRaquete(xRaqueteMaquina, yRaqueteMaquina);
  verificaColisaoBolinhaRaqueteMaquina();
  movimentaRaqueteMaquina();
}

function desenhaBolinha(){
  circle(xBolinha, yBolinha, diametroBolinha);
}

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

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

function desenhaRaquete(x, y){
  rect(x, y, larguraRaquete, comprimentoRaquete);
}

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

function verificaColisaoBolinhaRaquete(){
  if (xBolinha - raio < xRaquete + larguraRaquete && yBolinha - raio < yRaquete + comprimentoRaquete && yBolinha + raio > comprimentoRaquete)
    xBolinha *= -1;
}

function movimentaRaqueteMaquina(){
  velocidadeYOponente = yBolinha - yRaqueteMaquina - comprimentoRaquete / 2 -30;
  yRaqueteMaquina += velocidadeYOponente;
}


function verificaColisaoBolinhaRaqueteMaquina(){
  if (xBolinha + raio > xRaqueteMaquina && yBolinha - raio < yRaqueteMaquina + comprimentoRaquete && yBolinha + raio > comprimentoRaquete)
    xBolinha *= -1;
}

Não utilizei a biblioteca do Github porque achei mais fácil entender a lógica escrevendo minhas próprias funções. O que acontece é que a raquete da "máquina" nunca erra e a bolinha está sumindo quando acerta os pontos marcados nas raquetes da imagem abaixo:

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeSe alguém souber como me ajudar ficarei agradecido.

1 resposta

Olá Wederson, tudo bem?

Desculpe a demora em obter retorno.

Analisei o seu código e identifiquei alguns erros que estão provocando esse comportamento.

Na função verificaColisaoBolinhaRaqueteMaquina do seu código, na primeira verificação xBolinha + raio > xRaqueteMaquina, é necessário também subtrair a larguraOponente do seu x, isso porque queremos agora achar o ponto de contato à esquerda da raquete oposta.

Seguindo o mesmo nome das variaveis que você utilizou ficaria:

xBolinha + raio > xRaqueteMaquina - larguraRaquete

Além disso, na verificação yBolinha + raio >comprimentoRaquete você colocou o comprimento da Raquete ao invés do seu y, logo, o correto seria:

yBolinha + raio > yRaqueteMaquina

Esse código fará a verificação na parte abaixo da bolinha, portanto, usamos seu y.

Notei que ao invés de inverter a velocidade, você está atribuindo um novo valor ao xBolinha, por isso ela some. Então, ao invés de xBolinha *= -1 colocamos:

velocidadeXBolinha *= -1

Segue a função com a devida alterações:

function verificaColisaoBolinhaRaqueteMaquina(){
if (xBolinha + raio > xRaqueteMaquina - larguraRaquete&&
yBolinha - raio < yRaqueteMaquina + comprimentoRaquete &&
yBolinha + raio > yRaqueteMaquina)
velocidadeXBolinha *= -1;
}

Quanto ao oponente nunca errar, isso é um bug comum. Nessa situação, podemos criar uma função que calcule a chance de errar e chamá-la dentro da função responsável pelo movimento movimentaRaqueteOponente. Para isso criaremos uma variável let chanceDeErrar = 0; essa variável será atribuída ao YRaqueteOponente.

let chanceDeErrar = 0;

function movimentaRaqueteMaquina(){
  velocidadeYOponente = yBolinha - yRaqueteMaquina - comprimentoRaquete / 2 -30;
  yRaqueteMaquina += velocidadeYOponente + chanceDeErrar
  calculaChanceDeErrar()
}

A função calculaChanceDeErrar ela verifica se os pontos do oponente são iguais ou maiores que meus pontos.

function calculaChanceDeErrar() {
  if (pontosDoOponente >= meusPontos) {
    chanceDeErrar += 1
    if (chanceDeErrar >= 39){
    chanceDeErrar = 40
    }
  } else {
    chanceDeErrar -= 1
    if (chanceDeErrar <= 35){
    chanceDeErrar = 35
    }
  }
}

Espero ter ajudá-lo

Abraços.

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