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

[Sugestão] Bolinha nao move no eixo X e a raquete do oponente some.

Bom dia ! Estava funcionando até a adição do movimento da raquete do oponente. segue o código se alguém poder me ajudar.

// variaveis da bola 
let xBola = 300;
let yBola = 200;
let dBola = 20;
let raio = dBola / 2;

//velocidade da bola 
let velocidadexBola = 3;
let velocidadeyBola = 3;

//variaveis minha raquete
let xRaquete1 = 5;
let yRaquete1 = 145;
let larguraRaquete = 10;
let alturaRaquete = 90;

//variaveis raquete oponente
let xRaquete2 = 585;
let yRaquete2 = 145;
let velocidadeyRaquete2;

let colidiu = false;

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

function draw() {
  background(0);
  desenhoBola();
  movimentaBola();
  colisaoBorda();
  desenhoRaquete(xRaquete1, yRaquete1);
  movimentaRaquete1();
  colisaoRaquete();
  desenhoRaquete(xRaquete2, yRaquete2);
  movimentaRaquete2();

}

function desenhoBola(){
  circle(xBola, yBola, dBola);
}

function movimentaBola(){
  xBola += velocidadexBola;
  yBola += velocidadeyBola;
}

function colisaoBorda(){
  if (xBola + raio > width || xBola < 0){
    velocidadexBola *= -1;
  }

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

function desenhoRaquete(x,y){
  rect(x, y, larguraRaquete, alturaRaquete);
}

function movimentaRaquete1(){
  if (keyIsDown(UP_ARROW)){
    yRaquete1 -= 2;
  }
  if (keyIsDown(DOWN_ARROW)){
    yRaquete1 += 2;
  }
}

function colisaoRaquete(){
  colidiu = 
  collideRectRect(xRaquete1, yRaquete1, alturaRaquete, larguraRaquete, xBola, yBola, raio);
  velocidadexBola *= -1;
}

function movimentaRaquete2(){
  velocidayRaquete2 = yBola - yRaquete2 - alturaRaquete / 2 - 30;
  yRaquete2 += velocidadeyRaquete2
}
2 respostas
solução!

Oi, Raphael! Tudo bem?

Podemos observar alguns pequenos problemas que precisarão ser modificados nas funções colisaoRaquete() e movimentaRaquete2().

Trabalhando, inicialmente a função colisaoRaquete() o método collideRectCircle está escrito como collideRectRect, o que define a colisão entre um retângulo e outro e não de um retângulo e um circulo, como o caso da raquete a bolinha. Ademais, esse método deve receber como parâmetros em ordem: xRaquete1, yRaquete1, larguraRaquete, alturaRaquete, xBola, yBola, raio , entretanto, está recebendo a largura da raquete e a altura com suas posições trocadas.

Somado a isso, precisamos executar uma estrutura de controle if para utilizar o collideRectCircle e alterar o sentido de movimentação da bolinha após a colisão. Dessa forma, após as alterações essa, a função deverá ficar da seguinte maneira:

function colisaoRaquete(){
  colidiu = 
    collideRectCircle(xRaquete1, yRaquete1, larguraRaquete, alturaRaquete, xBola, yBola, raio);
  if(colidiu){
      velocidadexBola *= -1;
  }

}

Já a função movimentaRaquete2() possui a variável velocidadeyRaquete2 escrita com uma grafia diferente: velocidayRaquete2, por isso, não é reconhecida e a variável alturaRaquete no lugar da variável larguraRaquete, que deveria estar sendo usada no código.

Devido a isso, a função deve ficar da seguinte forma:

function movimentaRaquete2(){
  velocidadeyRaquete2 = yBola - yRaquete2 - larguraRaquete / 2 - 30;
  yRaquete2 += velocidadeyRaquete2
}

Espero ter ajudado!

Um forte abraço e bons estudos!

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

Muito obrigado ! Salvou ,agora está indo. Um forte abraço para você também.