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

[Dúvida] Como encerrar o jogo com vencedor?

Busquei fazer alguma melhoria para aperfeiçoamento e desenvolvimento do aprendizado. Logo, inclui um limite que pontos para informar o vencedor da partida, mas não consegui inserir uma pausa no jogo, um stop. Apesar de reportar certinho quem ganhou e o placar o jogo continua rodando com a mensagem na tela. Quero de o jogo pare assim que tiver o vencedor e fique apenas a mensagem até ser reiniciado.

Segue Código:

//Pong - JavaScript - Sem biblioteca - Com placar e vencedor

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

//variáveis da velocidade da bolinha
let velocidadeXBolinha = 6;
let velocidadeYBolinha = 6;

//variáveis raquete player
let xRaquete = 5;
let yRaquete = 165;
let raqueteComp = 5;
let raqueteAlt = 70;

//variáveis raquete oponente
let xRaqueteOpo = 590;
let yRaqueteOpo = 165;
let velocidadeXOpo;
let velocidadeYOpo;

//placar do jogo
let meusPontos = 0;
let pontosDoOpo = 0;

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

function draw() {
  background(50, 50, 205); //código RGB de cores 'azul'
  meioDeCampo();
  raqueteOponente(xRaqueteOpo, yRaqueteOpo);
  mostraBolinha();
  movimentoBolinha();
  raquete(xRaquete, yRaquete);
  movimentaMinhaRaquete();
  movimentaRaqueteOpo();
  verificaColisaoBorda (); 
  verificaColisaoRaquete();
  verificaColisaoRaqueteOpo();
  incluirPlacar();
  contador();
  vencedor();
}

function raquete(){
  rect(xRaquete, yRaquete, raqueteComp, raqueteAlt)
}

function raqueteOponente(){
  rect(xRaqueteOpo, yRaqueteOpo, raqueteComp, raqueteAlt)
};
  

function meioDeCampo(){
  rect (300,0,2, 400)
}

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

function movimentoBolinha(){
  xBolinha += velocidadeXBolinha;
  yBolinha += velocidadeYBolinha;  
}

function verificaColisaoBorda (){
   if (xBolinha + raio > width || xBolinha - raio < 0){ //'width'limite borda horizontal
    velocidadeXBolinha *= -1;
  }
  if (yBolinha + raio > height || yBolinha - raio < 0){ //'width'limite borda vertical
    velocidadeYBolinha *= -1;
  }  
}

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

function movimentaRaqueteOpo (){
  velocidadeYOpo = yBolinha - yRaqueteOpo - raqueteComp/2 - 75;
  yRaqueteOpo += velocidadeYOpo;
  yRaqueteOpo = constrain(yRaqueteOpo, 5, 325);
}

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

function verificaColisaoRaqueteOpo(){
  if (xBolinha + raio > xRaqueteOpo + raqueteComp && yBolinha - raio < yRaqueteOpo + raqueteAlt && yBolinha + raio > yRaqueteOpo){
      velocidadeXBolinha *= -1;
      }
}

function incluirPlacar (){
  text(meusPontos, 278, 26);
  text(pontosDoOpo, 317, 26);
}

function contador (){
  if (xBolinha > 590){
    meusPontos += 1;
  }
  if (xBolinha < 10){
    pontosDoOpo += 1;
  }
}

function vencedor(){
  if (meusPontos > pontosDoOpo && meusPontos >= 10){ 
    text("Você Venceu", 110, 200);
    text(meusPontos, 120,210);
    text(" X ", 134, 210);
    text(pontosDoOpo, 155, 210);
  }
  if (meusPontos < pontosDoOpo && pontosDoOpo >= 10) {
    text("Você Perdeu", 110, 200);
    text(meusPontos, 120,210);
    text(" X ", 134, 210);
    text(pontosDoOpo, 155, 210);
  }
}

Caso tenha melhorias a serem realizadas podem sugerir por favor. Não sei por que motivo não consegui inserir parâmetros em algumas função como: "movimentoRaqueteOpo".

Obrigado.

2 respostas
solução!

Olá, Dúlio, tudo bem?

Para resolver a sua dúvida, você pode utilizar a função noLoop() do p5.js, ela faz com que o desenho pare de ser executado continuamente no loop do draw(). Você pode inserir essa função dentro da sua função vencedor(), assim que a condição de vitória for atingida.

function vencedor(){
  if (meusPontos > pontosDoOpo && meusPontos >= 10){ 
    text("Você Venceu", 110, 200);
    text(meusPontos, 120,210);
    text(" X ", 134, 210);
    text(pontosDoOpo, 155, 210);
    noLoop(); // Adicione esta linha
  }
  if (meusPontos < pontosDoOpo && pontosDoOpo >= 10) {
    text("Você Perdeu", 110, 200);
    text(meusPontos, 120,210);
    text(" X ", 134, 210);
    text(pontosDoOpo, 155, 210);
    noLoop(); // Adicione esta linha
  }
}

Lembre-se de chamá-la na função draw. É provável ser necessária algumas adaptações em relação ao seu código, como a posição da mensagem de vencedor ou perdedor.

Quanto a sua dúvida em relação a inserir parâmetros em algumas funções, é importante lembrar que os parâmetros são usados para passar valores para funções. No caso da função movimentoRaqueteOpo(), ao criá-la não criamos nenhum parâmetro, ou seja, ela não precisa de nenhum valor externo para funcionar, portanto, ao chamá-la na função draw não é necessário usar parâmetros.

Espero ter ajudado.

Caso surja alguma dúvida, fico à disposição.

Abraços e bons estudos!

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

Boa noite, Bacana funcionou para encerramento do jogo, entretanto, não funcionou para a trilha sonora. Tentei adicionar um comando "trilha.noLoop ();", mas não reconheceu, reportou erro.

function vencedor(){
  if (meusPontos > pontosDoOpo && meusPontos >= 2){ 
    stroke(255,255,0);
    fill(255,255,0);
    text("Você Venceu", 140, 200);
    text(meusPontos, 120,230);
    text(" X ", 134, 230);
    text(pontosDoOpo, 155, 230);
    noLoop(); //encerrar com vencedor
    trilha.noLoop(); //aqui não teve resultado, continuou com a música de fundo
  }
  if (meusPontos < pontosDoOpo && pontosDoOpo >= 2) {
    stroke(255,0,0);
    fill(255,0,0);
    text("Você Perdeu", 140, 200);
    text(meusPontos, 120,230);
    text(" X ", 134, 230);
    text(pontosDoOpo, 155, 230);
    noLoop(); //encerrar com vencedor
    trilha.noLoop(); //aqui não teve resultado, continuou com a música de fundo
  }
}

Obrigado pelo apoio.