6
respostas

Pong p5.js com alterações

Boa tarde pessoal, Segue abaixo o link do meu projeto do jogo Pong no p5.js, fiz algumas modificações em relação ao exemplo do professor, são elas:

  • Mudança na interface do placar, indicando a posição dos players 1 e 2, com cores diferentes;
  • Toda vez que o jogo começa a bolinha sai pra uma direção aleatória;
  • Fiz um "menuzinho" inicial para o jogador escolher a quantidade de gols em que o jogo acaba e se quer jogar no modo Single player ou Multiplayer, bem como indicação das teclas a serem usadas em cada player;
  • No final do jogo definido pelo usuário, indica quem foi o ganhador e toca um som diferente para cada um (modo single player);
  • Criei um botão para reiniciar o jogo;
  • Travei as raquetes dentro da tela do jogo.

Com certeza o código pode ser melhorado, mas por hora gostei do resultado.

obs: Tentei alterar o visual do input onde o jogador informa a quantidade de gols, porém não consegui. Acredito que a única maneira seria criando o input pelo HTML e formatando via CSS, mas não o fiz, uma vez que esse não era o intuito do curso.

Fiquem a vontade para jogar, analisar o código e fazerem sugestões ou críticas.

https://editor.p5js.org/HermannDF/full/Su0IHh624

https://editor.p5js.org/HermannDF/sketches/Su0IHh624

6 respostas

Cara! Achei tão legal que resolvi adicionar umas ideias que eu tive junto com meu filho. Logo eu compartilho o resultado contigo.

Que legal Isaac, compartilha sim que fiquei curioso rs

Cara ficou muito bom, será se vc poderia colocar como separaou o inicio das telas? iniciei o curso essa semana, esses updates teu ficou muito bom parabens!!!!

Laydson, obrigado =]

Vamos lá, primeiro criei essa função e chamei só ela no draw e atribuo 0 para jogadores.

//receber quantidade de gols e de jogadores
function start(){
      inp.input(escolheGols);
  if (jogadores == 0){
    telaInicial();
  }else if(jogadores == 1){
    //tela = 1;
    jogo(1);
  }else if(jogadores == 2){
    //tela = 2;
    jogo(2);
  }
}

Aqui ela vai verificar o valor da variável jogadores para decidir como o jogo será montado, quando ele clicar em um dos botões o jogo vai ser montado conforme a opção selecionada. Isso é feito chamando a função jogo e passando o parâmetro 1 para singleplayer e 2 para multiplayer. Se a variável jogadores for = 0 ele vai executar a função telaInicial() que é a função que cria a tela de escolha que você comentou.

function telaInicial(){
  noStroke();
  stroke(255);
  noFill();
  rect(xBotaoSingle,yBotaoSingle,larguraBotoes,alturaBotoes,10);
  rect(xBotaoMulti,yBotaoMulti,larguraBotoes,alturaBotoes,10);
  noStroke();
  fill(255);
  textStyle(BOLD);
  textAlign(CENTER,CENTER);
  textSize(24);
  //texto botoes
  text("Single Player",xBotaoSingle+100,yBotaoSingle+25);
  text("Multiplayer",xBotaoMulti+100,yBotaoMulti+25);
  //texto selecao de gols
  text("O jogo acaba em",300,100);
  text("gols",475,100);
  noFill();
  noErase();
  fill(255);
  erase(75);
  textSize(30);
  textStyle(BOLDITALIC);
  text("Controles",90,50);
  textAlign(LEFT);
  textStyle(BOLDITALIC);
  textSize(20);
  text("Player 1:",50,130);
  textStyle(NORMAL);
  textSize(14);
  text("- W Sobe",50,155);
  text("- S desce",50,175);
  textStyle(ITALIC);
  textSize(20);
  text("Player 2:",50,250);
  textStyle(NORMAL);
  textSize(14);
  text("- Seta para Cima",50,275);
  text("- Seta para Baixo",50,295);
  noFill();
  noErase();

  //MouseOver
  fill(255);
  erase(30);
  rect(xBotaoSingle,mouse,larguraBotoes,alturaBotoes,10)
}

A função acima vai criar os botões de single ou multiplayer e os textos da tela inicial. Ainda não aparecem as raquetes e a bolinha porque as funções que fazem isso ainda não foram chamadas. Elas só serão chamadas quando o jogador clicar em um dos botões.

function jogo(qtdJogadores){
  inp.hide(); // oculta o input durante o jogo
  mostraBolinha();
  movimentaBolinha();
  verificaColisaoBorda();
  mostraRaquetes(xRaquete, yRaquete);
  mostraRaquetes(xRaqueteOponente, yRaqueteOponente);
  movimentaMinhaRaquete();
  verificaColisaoRaquetes(xRaquete, yRaquete);
  verificaColisaoRaquetes(xRaqueteOponente, yRaqueteOponente);
  incluiPlacar();
  // define a movimentacao da 2 raquete e cor do placar
  if (qtdJogadores == 1){
    movimentaRaqueteOponente();
    r2 = 255;
    g2 = 50;
    b2 = 30;
  }else if(qtdJogadores == 2){
    movimentaRaquetePlayer2();
    r2 = 100;
    g2 = 255;
    b2 = 0;
  }
  marcaPonto(jogadores);
  bolinhaNaoFicaPresa();
  jaJogou = true;
}

Aqui em cima ele vai montar o jogo em si, chamando todas as funções que no curso o professor colocou no draw, e tem um if para definir se ele exibira a raquete oponente ou a raquete do computador, de acordo com o numero que vai vir do botão que o jogador clicou. Ah, aqui também ele vai esconder a caixa que o jogador digita quantos gols o jogo acaba.

Nesse momento os botões e textos da tela inicial não aparecem mais porque a função telaInicial() que exibe eles não é mais executada. Quando o jogo acaba ele chama a função recomecaJogo(), que é parecida com a função telaInicial(). Ela vai criar o botão de recomeçar. A função abaixo verifica se o botão reiniciar foi apertado e chama a função resetaVariaveis()

function mouseClicked(){
 if (mouseX >= xBotaoRecomeca && mouseX <= xBotaoRecomeca+larguraBotoes && mouseY >= yBotaoRecomeca && mouseY <= yBotaoRecomeca+alturaBotoes){
    mouse = 600;
    resetaVariaveis();
  }
}

A função resetaVariaveis() vai zerar todas a variáveis do jogo, principalmente a jogadores e vai colocar o valor pra zero.

function resetaVariaveis(){
inp.show();
xBolinha = 300;
yBolinha = 200;
diametro = 15;
raio = diametro / 2;

//variaveis da raquete
xRaquete =5;
yRaquete = 150;
raqueteComprimento = 10;
raqueteAltura = 90;

//variaveis do oponente
xRaqueteOponente = 585;
yRaqueteOponente = 150;

//velocidade da bolinha
velocidadeXBolinha = random(aleatorio);
velocidadeYBolinha = random(aleatorio);
aleatorio = [-6,6];

//variaveis do placar
meusPontos = 0;
pontosOponente = 0;

//variaveis de controle
jogadores = 0;
jaJogou = false;
acabou = true;
trilha.loop();
}

Como a função start() fica sendo executada o tempo todo no draw, assim que jogadores voltar a ser 0 ela vai novamente chamar a variável telaInicial() e ai começa tudo de novo rs. Espero que tenha dado pra entender. Qualquer coisa me fala que tento explicar melhor =]

Meu querido Danilo, conforme o prometido... lá vai !

Pong 2.0

https://editor.p5js.org/isaac.firmos/sketches/vL_QSQ6Fi

Algumas coisas legais que eu coloquei:

A bola aumenta de velocidade a cada toque na raquete; A bola assume velocidade inicial no sentido oposto quando é marcado um ponto; Possibilidade de desligar sons e música;

Tentei ser o mais fiel ao conteúdo apresentado pela Alura no curso, apenas adicionando a biblioteca de botões e usando ifs e elses.

Ainda falta fazer as telas de vitória e game over, e encerrar o jogo.

Meus sinceros agradecimentos ao Danilo e à comunidade Alura que está sempre tentando ir um passo além !

Aos pouquinhos, conforme for evoluindo nos estudos vou adicionar algumas animações, mais personalizações e principalmente, adicionar física à bola.

Saudações a todos!

Olá Issac,

Tá ficando muito bom seu Pong. Gostei bastante da sua solução de configurações, achei que ficou muito prática.

Parabéns, e gostaria de agradecer por compartilhar conosco suas ideias.

Estou ansioso pela versão final rs

Grande abraço.