2
respostas

[Dúvida] programando sem a função "colidiu"

Por questão de exercitar a minha lógica de programação, optei por tentar fazer o código funcionar sem importar aquela função para verificar se a bola colidiu na raquete. Mudei alguns sinais para o código fazer sentido na raquete do oponente. O problema está somente na raquete do oponente, a qual não está sendo reconhecida pela bola, fazendo com que ela ignore a raquete, encoste na parede e contabilize mais um ponto para o placar. Segue o código, ou se preferirem, o link do p5.js

https://editor.p5js.org/Helphus20/sketches/fE6lHbBD9

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

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


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

//variáveis do oponente
let xRaqueteOponente = 589;
let yRaqueteOponente = 150;
let velocidadeyOponente = velocidadeYBolinha
let velocidadexOponente = velocidadeXBolinha

//variaveis do placar
let meusPontos = 0;
let pontosDoOponente = 0;

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

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

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);
  rect(xRaqueteOponente, yRaqueteOponente, 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 = 0.8*yBolinha - yRaqueteOponente - raqueteComprimento/2 -30;
  yRaqueteOponente += velocidadeyOponente;
}

function placar(){
  fill(255);
  text(meusPontos, 278, 26);
  text(pontosDoOponente, 321, 26)
}

function marcaPonto(){
  if (xBolinha + raio > 600){
    meusPontos += 1;
  }
  if (xBolinha - raio < 1){
    pontosDoOponente += 1;
  }
}
2 respostas

Olá, Felipe! 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!

Muito obrigado Camila pela sua ajuda! Estava conferindo o meu com o da Jéssica, fiz algumas modificações tendo como base o dela, porém a bola continua ignorando a raquete do oponente. Comparei mas não consegui identificar o que fiz de errado. Mas mesmo assim obrigado!

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

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


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

//variáveis do oponente
let xRaqueteOponente = 585;
let yRaqueteOponente = 150;
let velocidadeyOponente = velocidadeYBolinha
let velocidadexOponente = velocidadeXBolinha

//variaveis do placar
let meusPontos = 0;
let pontosDoOponente = 0;

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

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

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, raqueteLargura, raqueteAltura);
}

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

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

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

function movimentaRaqueteOponente(){
  velocidadeyOponente = 0.8*yBolinha - yRaqueteOponente - raqueteLargura/2 -30;
  yRaqueteOponente += velocidadeyOponente;
}

function placar(){
  fill(255);
  text(meusPontos, 278, 26);
  text(pontosDoOponente, 321, 26)
}

function marcaPonto(){
  if (xBolinha + raio > 600){
    meusPontos += 1;
  }
  if (xBolinha - raio < 1){
    pontosDoOponente += 1;
  }
}