3
respostas

Código sem a biblioteca, função calculaChanceDeErrar não funciona.

Boa tarte!

Optei por não usar a biblioteca no meu código, e não sei se é devido a isso, mas a função calculaChanceDeErrar não está funcionando. A bolinha agora parece que ultrapassa a ponta da raquete, e fica sempre fazendo ponto.

Abaixo meu código.

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

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

//variáveis da raquete
let xRaquete = 1;
let yRaquete = 150;
let larguraRaquete = 10;
let alturaRaquete = 90;

//variáveis do oponente
let xRaqueteOponente = 584;
let yRaqueteOponente = 150;
let velocidadeYOponente;
let chanceDeErrar = 0;

//variáveis do placar
let meusPontos = 0;
let pontosDoOponente = 0;

//variável do som
let ponto;
let raquetada;
let trilha;

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

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

function draw() {
  background(0);
  exibeBolinha();
  movimentaBolinha();  
  colideBolinhaBordas();
  exibeRaquete(xRaquete, yRaquete);
  movimentaRaquete();
  colideBolinhaRaquete();    
  exibeRaquete(xRaqueteOponente, yRaqueteOponente);
  movimentaRaqueteOponente();
  tocaRaqueteOponente();
  incluirPlacar();
  marcarPontos();
  bolinhaNaoFicaPresa()
}

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

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

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

function exibeRaquete(x, y){   
  rect (x, y, larguraRaquete, alturaRaquete)   
}

function movimentaRaquete(){
  if (keyIsDown(UP_ARROW) && yRaquete >= 0){
    yRaquete -= 10;
  }
  if (keyIsDown(DOWN_ARROW) && yRaquete <= height - alturaRaquete){
    yRaquete += 10;
  }  
}

function colideBolinhaRaquete(){
  if (xBolinha - raio < xRaquete + larguraRaquete 
      && yBolinha - raio < yRaquete + alturaRaquete
      && yBolinha + raio > yRaquete){
    velocidadeXBolinha *= -1;
    raquetada.play();
  }
}

function movimentaRaqueteOponente(){
  velocidadeYOponente = yBolinha - yRaqueteOponente - larguraRaquete / 2 - 30;
  yRaqueteOponente += velocidadeYOponente + chanceDeErrar;
  calculaChanceDeErrar()

  //outra pessoa movimenta a raquete usando as teclas W e S
  /*if (keyIsDown(87) && yRaqueteOponente >= 0){
    yRaqueteOponente -= 10;
  }
  if (keyIsDown(83) && yRaqueteOponente <= height - alturaRaquete){
    yRaqueteOponente += 10;
  } */
}

function tocaRaqueteOponente(){
  if (yBolinha + raio > yRaqueteOponente + larguraRaquete
      && yBolinha - raio < yRaqueteOponente + alturaRaquete
      && xBolinha + raio > xRaqueteOponente){
    velocidadeXBolinha *= -1;
    raquetada.play();   
  }  

}

function incluirPlacar(){
  stroke(255);
  textSize(16);
  textAlign(CENTER)
  fill(color(255, 140, 0));
  rect(200, 10, 40, 20);
  fill (255);
  text (meusPontos, 220, 26);
  fill(color(255, 140, 0));  
  rect(400, 10, 40, 20);
  fill (255);  
  text (pontosDoOponente, 420, 26);
}

function marcarPontos(){
  if (xBolinha > 590){
    meusPontos += 1;
    ponto.play();    
  }
  if (xBolinha < 10){
    pontosDoOponente += 1;
    ponto.play();    
  }
}

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

function bolinhaNaoFicaPresa(){
    if (xBolinha - raio < 0){    
    xBolinha = 23;
    }
}
3 respostas

Olá, Adriana! Tudo bem?

Vou deixar aqui um link que irá realizar o download automático da biblioteca para o seu computador, tudo bem?

  • Sobre a solução sem a Biblioteca

É perfeitamente possível você movimentar a raquete do oponente sem a biblioteca, basta modificar um pouco os valores utilizados na lógica para fazer correspondência com o outro lado da tela. No entanto, você aplicou os mesmos valores e por isso não funcionou adequadamente.

Vou deixar uma solução incrível desenvolvida pela aluna Alura Jéssica Cordeiro :

Espero que tenha ajudado, fico à disposição!

Um abraço e bons estudos!

Oi Camila, tudo bom e com você?

No meu código a raquete do oponente já está funcionando corretamente, então o código da Jéssica é só um outra forma de fazer.

A minha dúvida, que acho que não ficou clara, é que ao inserir a função para criar a chanceDeErrar do Oponente, a bolinha para de tocar na raquete do oponente e toda bolinha que vai no sentido do oponente é marcado ponto.

No código da aluna Jéssica ela não colocou essa função chanceDeErrar, mesmo assim copiei o código dela para colisão com a raqueteDoOponente e ao inserir a função chanceDeErrar, a bolinha continua colidindo na raquete do oponente sem errar.

A dúvida é, como fazer funcionar o percentual de erro do oponente???

Aguardo seu retorno! =]

PS: Não quero colocar a biblioteca externa no meu código!

Compreendi melhor, Adriana!

A função chanceDeErrar() cria uma probabilidade de erro com base na pontuação. Dessa maneira, esse nível de abstração é previsível para um humano.

Você pode fazer algumas alterações de valores que modificam um pouco o comportamento da raquete do oponente, observe:

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

Ou então você pode utilizar uma solução de erro aleatório do oponente, vou deixar um link para outro tópico em que um aluno resolveu essa questão: * Link para tópico "Erro aleatório do oponente"

Sobre a biblioteca externa, entendo que você não deseje utilizá-la. No entanto, é uma prática bem comum no cotidiano como pessoa desenvolvedora e muito útil para otimizar o tempo.

Fico à disposição. Bons estudos!