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

Inclusão de erro incremental - Pong JS

Olá pessoal!

Estou tentando elaborar um sistema de erro incremental do oponente com base na quantidade de acertos que ambos (jogador e oponente) fazemos. Consegui fazer que o erro fosse progredindo até que o jogador marque o ponto, entretanto, ao resetar o contador do erro, a bolinha fica presa na raquete do oponente.

Defini uma chance de erro inicial (missEnemy) em zero, sendo que cada contato com a raquete (hit) haveria um incremento (missDelta) no erro inicial. Após a marcação da pontuação, esse erro seria zerado, entretanto isso faz que a posição y central da raquete do oponente se iguale a posição y central da bolinha, travando ela no canto.

Gostaria de saber se há algum código que possibilite um delay na execução do reset do erro, de forma que não trave a bolinha na raquete do oponente.

Segue abaixo código do erro incremental, sendo o link completo pro jogo https://editor.p5js.org/TMMichaelsen/sketches/76jT0kKPy.

//Enemy paddle miss chance variables
let missEnemy = 0;
let missDelta = 5;

//Check if ball collides with paddle (Library p5.collide2d)
function checkPaddleCollision(x,y) {
  hit = collideRectCircle(x, y, paddleWidth, paddleHeight, posXBall, posYBall, radius);
  if (hit) {
    velXBall *= -1;
    missEnemy += missDelta;
    hitSound.play();
  }
}

//Increase scoreboard on hit
function scoreboard() {
  if (posXBall - radius < 0) {
    enemyScore += 1;
    scoreSound.play();
    missEnemy = 0;
  }
  if (posXBall + radius > width) {
    playerScore += 1;
    scoreSound.play();
    missEnemy = 0;
  }
}

Edit:

Consegui resolver o erro com a variação negativa do incremento da variação quando o oponente erra, fazendo que a bolinha volte a bater na raquete até errar novamente pelo outro lado. Segue o código:

//Increase scoreboard on hit
function scoreboard() {
  if (posXBall - radius < 0) {
    enemyScore += 1;
    scoreSound.play();
    missEnemy = 0;
  }
  if (posXBall + radius > width) {
    playerScore += 1;
    scoreSound.play();
    missEnemy -= missDelta;
    missDelta *= -1;
  }
}

Entretanto, ainda gostaria de saber se o Javascript contém alguma função que forme um delay na execução de alguma linha de código. As únicas formas que encontrei foi através de WHILE ou FOR, mas estas fazem uma execução em loop enquanto a condição for verdadeira, sendo que gostaria que houvesse uma execução quando a condição for falsa.

Obrigado!

2 respostas
solução!

Olá, Thiago! Espero que esteja bem!

Desculpe a demora em dar um retorno

Que bacana que solucionou e valeu muito por ter compartilhado o código conosco

Vai contribuir demais com quem passar pelo curso!

Sobre um método que atue como delay, pode ser que o Timeouts ou intervalos possam te ajudar

Dê uma conferida nesse link onde é abordado na documentação!

Um abraço e bons estudos, Thiago!

Olá Cassio!

Essa função do Timeout era exatamente o comportamento que buscava no Javascript.

Pensei inicialmente em fazer algum processo de teste de posição, fazendo um bloco funcionar apenas uma vez quando atingisse uma posição externa à raquete, porém uma solução temporal me parece mais simplificada.

Muito obrigado pela resposta! Um abraço!