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

Problema com Bug + Incremento do Projeto

Boa tarde. O meu jogo está pronto e rodando, mas um problema eu não consegui corrigir e gostaria de um norte para realizar determinados incrementos no meu código. Primeiro a respeito dos incrementos:

  1. Eu programei para que a bolinha voltasse para o centro da tela quando um ponto fosse marcado. Entretanto, eu gostaria de deixar um delay nessa ação, pois instantaneamente ela começa a se mover a partir do centro logo após um ponto ser marcado, não dando tempo para os jogadores se preparem após levarem/marcarem um ponto. Vi algumas informações na internet a respeito de setInterval(), setTimeou(), wait(), delayTime(), etc, porém não consegui fazer funcionar. Parece que o js não as reconhece como funções. Não sei se apenas não soube usar ou se tem que adicionar alguma biblioteca.
  2. Eu gostaria de fazer um menu para o jogo, onde pudesse ser escolhido o modo de jogo: 2 players ou contra o bot. Pensei em utilizar redraw(), createCheckbox(), etc. Mas não sei por onde começar e gostaria de algumas dicas. Esse menu seria programado na mesma função draw() onde está o resto do meu código?

Sobre o problema: consegui com as dicas da seção 5.8 resolver o bug da bolinha ficar presa ATRÁS da raquete, por fora do background e contabilizar vários pontos. Entretanto, forçando a colisão da raquete com a bolinha pela parte lateral (de baixo para cima ou de cima para baixo), ainda acontece de a bolinha ficar momentaneamente presa DENTRO da raquete até se desprender, apesar de isso não estar contabilizando pontos, o que é positivo. Meu código está assim:

//Variáveis da bolinha
let xCircle = 300;
let yCircle = 200;
let diameter = 15;
let radius = diameter / 2;

//Variáveis da velocidade da bolinha
let xCircleVelocity = 6;
let yCircleVelocity = 6;

//Variáveis da raquete 1
let xRect1 = 5;
let yRect1 = 155;
let widthRect = 10;
let heightRect = 90;

//Variáveis da velocidade da raquete do(s) player(s)
let yRectVelocity1 = 10;

//Variáveis da raquete 2 - que possui mesmos comprimento e largura que a 1
let xRect2 = 585;
let yRect2 = 155;

//Variáveis para o placar
let p1 = 0;
let p2 = 0;

//Variáveis para o som do jogo
let racket;
let points;
let ost;

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

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

    function draw() { 
      background(0);
      drawCircle();
      drawRect(xRect1, yRect1);
      drawRect(xRect2, yRect2);
      moveCircle();
      moveRect1();
      //moveRect1Const();
      //moveRect2();
      //moveRect2Const();
      backgroundCollision();
      circleRectCollision();
      circleRect2Collision();
      scoreboard();
      moveRectP2();
    }

//Função para desenhar a bolinha na tela
function drawCircle(){
  circle(xCircle, yCircle, diameter);
}

//Função para desenhar aS raqueteS
function drawRect(x, y){
  rect(x, y, widthRect, heightRect);
}

//Função para fazer a bolinha mexer
function moveCircle(){
  xCircle += xCircleVelocity;
  yCircle += yCircleVelocity;
}

//Função para mover a raquete do player
function moveRect1(){
  if(keyIsDown(87) && yRect1 >= 10){
    yRect1 -= yRectVelocity1; 
  }
  if(keyIsDown(83) && yRect1 + heightRect <= height - 10){
    yRect1 += yRectVelocity1;
  }
}

//Função para movimentar a raquete do player 2
function moveRectP2(){
  if(keyIsDown(UP_ARROW) && yRect2 >= 10){
    yRect2 -= yRectVelocity1; 
  }
  if(keyIsDown(DOWN_ARROW) && yRect2 + heightRect <= height - 10){
    yRect2 += yRectVelocity1;
  }
}

//Função para colidir a bolinha com a borda da tela
function backgroundCollision(){  
  if(xCircle + radius >= width || 
     xCircle - radius <= 0){
    xCircleVelocity *= -1;
  }
  if(yCircle + radius >= height || 
     yCircle - radius <= 0){
    yCircleVelocity *= -1;
  }
}

//Função para colidir a bolinha com a raquete do player
function circleRectCollision(){
  if(xCircle - radius <= xRect1 + widthRect &&
     yCircle + radius >= yRect1 &&
     yCircle - radius <= yRect1 + heightRect){
    xCircleVelocity *= -1;
    racket.play();
  }
}

//Função para colidir a bolinha com a raquete do bot
function circleRect2Collision(){
  if(xCircle + radius >= xRect2 &&
     yCircle + radius >= yRect2 &&
     yCircle - radius <= yRect2 + heightRect){
    xCircleVelocity *= -1;
    racket.play();
  }
}

//Função para o placar
function scoreboard(){
  if(xCircle - radius < 3){
    p2 += 1;
    points.play();
    xCircle = 300;
    yCircle = 200;
  }
  if(xCircle + radius > width - 3){
    p1 += 1;
    points.play();
    xCircle = 300;
    yCircle = 200;
  }
  textAlign(CENTER);
  stroke(255);
  textSize(20);
  fill(color(255, 125, 51));
  rect(145, 7, 60, 24);
  rect(395, 7, 60, 24);
  fill(255);
  text(p1, 175, 26);
  text(p2, 425, 26);
}

Grato desde já!

2 respostas

Olá Gabriel, tudo bem?

Parece que você tem um jogo legal acontecendo aí. Vou fornecer algumas dicas sobre os tópicos que você mencionou:

  1. Delay na Bolinha Após um Ponto: Para criar um atraso após um ponto ser marcado antes que a bolinha volte ao centro, você pode usar a função setTimeout(). Ela permite que você execute uma função após um intervalo de tempo específico. Certifique-se de chamar a função de movimento da bolinha somente após o tempo de atraso ter decorrido. Aqui está um exemplo de como você pode fazer isso:
function scoreboard(){
  if(xCircle - radius < 3){
    p2 += 1;
    points.play();
    setTimeout(resetBolinha, 1000); // 1000ms de atraso (1 segundo)
  }
  if(xCircle + radius > width - 3){
    p1 += 1;
    points.play();
    setTimeout(resetBolinha, 1000); // 1000ms de atraso (1 segundo)
  }
  // Resto do código...
}

function resetBolinha(){
  xCircle = 300;
  yCircle = 200;
}

Isso fará com que a função resetBolinha() seja executada após um segundo (1000 milissegundos) de atraso.

  1. Menu de Modo de Jogo: Adicionar um menu de modo de jogo é uma ideia ótima! Você pode criar elementos de interface do usuário usando HTML e CSS. Por exemplo, você pode criar botões ou caixas de seleção para escolher o modo de jogo. Para fazer isso, você pode usar as funções createButton() ou createCheckbox() do p5.js. Quanto aonde colocar esse menu, é recomendável não incluí-lo diretamente no draw(), pois ele será chamado repetidamente. Você pode criar um botão para iniciar o jogo, por exemplo, e quando o botão for clicado, o loop draw() pode começar a executar.

Em relação ao seu código, parece que você está no caminho certo! Certifique-se de testar cada adição incremental para verificar se está funcionando conforme o esperado. Se precisar de mais ajuda em algum ponto específico, sinta-se à vontade para perguntar. Bom trabalho no seu projeto!

Abraços!

solução!

Obrigado pelas dicas! Já consegui fazer o delay da bolinha, apenas tive que dar uma adaptada na ideia que você deu, pois o delay estava ocorrendo antes de ela ir para o centro e não após, pois a ideia é que ela fique parada no meio por 1 segundo; e adicionei um modo para ela ir para direções diferentes cada vez que ela reseta a partir do centro. Só ainda não fiz o menu do jogo. Vou deixar aqui como está até agora caso alguém veja o post e queira aproveitar a ideia.

//Variáveis para o placar
let p1 = 0;
let p2 = 0;
let sum = 0;

//Variáveis do reset da bolinha
let i = 1;
let j = 1;

function draw() { 
      background(0);
      drawCircle();
      moveCircle();
      drawRect(xRect1, yRect1);
      drawRect(xRect2, yRect2);
      moveRect1();
      backgroundCollision();
      circleRectCollision();
      circleRect2Collision();
      scoreboard();
      moveRectP2();
    }
    function resetCircle(){
  xCircle = 300;
  yCircle = 200;
}

function resetCircleVelocity(){
  xCircleVelocity = 0;
  yCircleVelocity = 0;
}

function restoreCircleVelocity(){
  if(sum % 4 == 0){
    i = 1;
    j = 1;
  }
  else if(sum % 4 == 1){
    i = -1;
    j = 1;
  }
  else if(sum % 4 == 2){
    i = -1;
    j = -1;
  }
  else if(sum % 4 == 3){
    i = 1;
    j = -1;
  }    
  xCircleVelocity = 6 * i;
  yCircleVelocity = 6 * j;
}

//Função para o placar, movimento da bolinha e delay após pontuação
function scoreboard(){
  if(xCircle - radius < 3){
    p2 += 1;
    sum = p1 + p2;
    points.play();
    resetCircleVelocity();
    resetCircle();
    setTimeout(restoreCircleVelocity, 1000);
  }
  if(xCircle + radius > width - 3){
    p1 += 1;
    sum = p1 + p2;
    points.play();
    resetCircleVelocity();
    resetCircle();
    setTimeout(restoreCircleVelocity, 1000);
  }
  textAlign(CENTER);
  stroke(255);
  textSize(20);
  fill(color(255, 125, 51));
  rect(145, 7, 60, 24);
  rect(395, 7, 60, 24);
  fill(255);
  text(p1, 175, 26);
  text(p2, 425, 26);
}

O resto do código permanece igual.