1
resposta

[Dúvida] duvida sobre logica de programação

//parametro da bola

let xBola = 300;
let yBola = 200;
let diametroBola = 20;
let raio = diametroBola / 2;


//movimento da bola

let velocidadeXBola = 2;
let velocidadeYBola = 6;

//parametro da raquete

let xRaquete = 5;
let yRaquete = 150;
let comprimentoRaquete = 10;
let alturaRaquete = 90;

//parametro da raquete 2

let xRaquete2 = 585;
let yRaquete2 = 150;
let comprimentoRaquete2 = 10;
let alturaRaquete2 = 90;
let velocidadeYDaRaquete2

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

function draw() {
  background(0);
  mostrarBola();
  movimentoDaBola();
  verificarColisaoDasBordas();
 raquete(xRaquete, yRaquete);
  raquete(xRaquete2, yRaquete2);
  movimentoDaRaquete();
  movimentoDaRaquete2();
  verificarColisaoComRaquete(xRaquete, yRaquete);
    verificarColisaoComRaquete(xRaquete2, yRaquete2);
}

function mostrarBola() {
  circle(xBola, yBola, diametroBola);
}

function movimentoDaBola() {
  xBola += velocidadeXBola;
  //yBola += velocidadeYBola;
}

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

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

function raquete(x,y) {
  rect(x, y, comprimentoRaquete, alturaRaquete);
}

function movimentoDaRaquete() {
  if (keyIsDown(UP_ARROW)) {
    yRaquete -= 10;
  }

   if (keyIsDown(DOWN_ARROW)) {
    yRaquete -= -10;
   }
}

function verificarColisaoComRaquete(x,y) {
  if (xBola - raio < x + comprimentoRaquete && yBola - raio < y + alturaRaquete && yBola + raio > y) {
      velocidadeXBola *= -1;
      }
}


function movimentoDaRaquete2() {
  velocidadeYDaRaquete2 = yBola - yRaquete2 - comprimentoRaquete2 / 2 - 30;
  yRaquete2 += velocidadeYDaRaquete2
}

olá, preciso de ajuda para entender mais sobre a logica. no jogo ping pong eu estava tentando colocar a colisão da bolinha nas duas raquetes usando esse codigo

function verificarColisaoComRaquete(x,y) {
  if (xBola - raio < x + comprimentoRaquete && yBola - raio < y + alturaRaquete && yBola + raio > y) {
      velocidadeXBola *= -1;
      }
} 

mais a bolinha fica travada no centro das duas raquetes, poderia me informa qual o erro no código e qual a forma certa de fazer e qual a logica por traz ?

1 resposta

Oii Felipe! Como você está?

Antes de tudo, precisamos entender como funciona o plano cartesiano do P5.JS:

Plano cartesiano. O valor 0, 0 está no vértice superior esquerdo, o y cresce para baixo e o x cresce para a direita.

Quando mais a direita, maior o x e, quanto mais abaixo, maior o y.

Agora, vamos analisar a condição para que a função verificarColisaoComRaquete seja executada:

if (xBolinha - raio < xRaquete + raqueteComprimento && yBolinha - raio < yRaquete + raqueteAltura && yBolinha + raio > yRaquete)

Em JS, && é um operador lógico que significa "e". É como se tivéssemos três ifs em uma linha apenas, cada um com uma condição que será analisada e terá um retorno verdadeiro ou falso.

  • Em xBolinha - raio < xRaquete + raqueteComprimento, analisamos a parte esquerda da bolinha e a colisão com a raquete;
  • Em yBolinha - raio < yRaquete + raqueteAltura comparamos a parte superior da bolinha com a parte inferior da raquete;
  • Em yBolinha + raio > yRaquete comparamos a parte inferior da bolinha com a parte superior da raquete.

Quando todas as condições forem verdadeiras, ou seja: a bolinha está no mesmo x que a raquete, nem acima, nem abaixo no eixo y, a colisão acontece e a movimentação da bolinha muda de direção.

Considerando esses valores dentro do plano cartesiano, o uso de parâmetros para x e y não funcionam nessa função. Precisamos também considerar os operadores.

Para verificar a colisão da bolinha com a raquete no outro lado da tela, podemos criar uma função verificaColisaoOponente, assim:

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

Perceba que a diferença está na primeira condição a ser avaliada: a posição x da bolinha em relação ao oponente. Aqui, esperamos que a parte direita da bolinha colida com a parte esquerda da raquete. Logo, o x será somado ao raio e terá de ser maior que o valor da raquete.

Espero que tenha ficado mais claro, Felipe. Estou a disposição.

Abração.

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