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

Bolinha tremendo no meio da tela - Sem biblioteca

Achei legal a iniciativa de tentar introduzir os alunos ao GitHub, mas lembrando que este é o primeiro curso de formação para programação iniciante, ficou muito vago jogar o conteúdo do GitHub colocando apenas uma aula sobre e buscando apenas uma biblioteca, ficou muito vago. Tentei dar continuidade ao projeto mesmo sem a biblioteca, o que resultou em um erro, onde a bolinha fica tremendo no meio da tela, subindo e descendo. Olhando as outras dúvidas, percebi que tem acontecido muito isso. espero que alguém possa me ajudar.

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

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

//variáveis da raquete
let xRaquete = 5;
let yRaquete = 150;
let raqueteComprimento = 10;
let raqueteAltura = 90;

//variáveis do oponente
let xRaqueteOponente = 585;
let yRaqueteOponente = 150;
let velocidadeYOponente;

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

function draw() {
  background(0);
  mostraBolinha();
  movimentaBolinha();
  verificaColisaoBorda();
  mostraRaquete(xRaquete, yRaquete);
  movimentaMinhaRaquete();
  verificaColisaoRaquete();
  mostraRaquete(xRaqueteOponente, yRaqueteOponente);
  movimentaRaqueteOponente();
  verificaColisaoRaqueteOponente();

}

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

function movimentaBolinha(){
  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 mostraRaquete(x, y){
  rect(x, y, raqueteComprimento, raqueteAltura);
}

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

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

function verificaColisaoRaqueteOponente(){
  if (xBolinha - raio < xRaqueteOponente + raqueteComprimento && yBolinha - raio < yRaqueteOponente + raqueteAltura && yBolinha + raio > yRaqueteOponente){
    velocidadeXBolinha *= -1;
  }
}


function movimentaRaqueteOponente(){
  velocidadeYOponente = yBolinha - yRaqueteOponente - raqueteComprimento / 2 -30;
  yRaqueteOponente += velocidadeYOponente
}
3 respostas

Também pensei como você e quis fazer as colisões por conta própria. Pelo que eu vi o erro está na sua função verificaColisaoRaqueteOponente. No seu if a primeira comparação vai ser sempre verdadeira quando iniciar o jogo, o que vai fazer a bolinha ficar mudando de direção toda hora

if (xBolinha - raio < xRaqueteOponente + raqueteComprimento && yBolinha - raio < yRaqueteOponente + raqueteAltura && yBolinha + raio > yRaqueteOponente){
    velocidadeXBolinha *= -1;
  }

Lembre que o oponente está do lado oposto da tela, então precisa mudar de < para >

if (xBolinha - raio > xRaqueteOponente + raqueteComprimento && yBolinha - raio < yRaqueteOponente + raqueteAltura && yBolinha + raio > yRaqueteOponente){
    velocidadeXBolinha *= -1;
  }

Espero ter ajudado

Olá Vinicius, obrigado por responder a minha dúvida.

Mudando de "Menor", para "maior", realmente resolveu o problema da bolinha tremendo no meio da tela, porém, a bolinha passa a raquete do oponente, sem colidir com ela, marcando pontos para mim.

solução!

Então, pelo mesmo motivo de a raquete estar do lado oposto da tela, outras coisas precisam mudar. Ao invés de xBolinha - Raio, fica xBolinha + raio, já que estamos olhando o lado direito da bolinha. Além disso, também não é preciso somar o comprimento da raquete, já que o xRaquete já se encontra na borda esquerda da raquete, então adicionar o comprimento iria "mover" o xRaquete para a borda direita. Caso não tenha ficado claro eu posso tentar explicar de outra maneira. Valeu!