Fala pessoal, ao concluir o projeto do jogo Pong pude repara alguns bugse trabalhei no c+odigo para tentar melhorar a experiência do jogo.
O oponente ou aertava demasiado ou errada sempre dependendo do edsvio colocado; alem disso ele sempre acompanhava a bolinha na esma velocidade. Assim pensei em uma maneira de movimenrtação dele mais natural. Como a gente movimenta a nossa raquete? Se a bolinha está pra cima apertamos as setas e a raquete se movementa na direção. Então euq uis simular esse comportamento trazendo uma velocidade à raquete. Assim, inclusive fica mais fácil ou mais difícil mexer com a dificuldade do jogo, podendo deixar o oponente mais rápido ou mais devagar, assim como a bolinha. Mas como fiz isso? coloquei uma variável de velocidade e esse valor é adicionado ou retirado da posição do meio da raquete doa dversário, se o Y da bolinah estiver menor ele retira valor, se estiver maio ele adiciona. Isso faz com que ele se moviemnte de maneira mais fluida e quanto maior a diferença na velocidade dele e da bolinha mais fácil ele errar. Com isso é poss+ivel, inclusive, fazer um aumento progressivo de difikculdade com base no tempo ou pontuação.
Outro bug era que as vezes a bolinha atravessava a parede e ia embora, junto com ela ia a raquete do oponente, isso porque a ideia de inverter a trajetória no eixo X era reprtida duas vezes dependendo da movimentação da bolinha. para corrigir isso tentei diversas coisas até uma deu resultado, em vez de inverter o sentido em duas variáveis diferentes eu quis juntar tudo em apenas um if fazendo a condição ocorrer sempre seja uma lado ou outro, assim a bolinha nunca mais escapou.
Outro fato que era bobo mas me incomodava era a possibilidade de mover a raquete para além das bordas, então para resolver isso simplesmente adicionei um limite na condicional de mocviemnto, como? A adição ou remoção de valores do eixo Y só ocorre se precionar as setas E o valor de y ser maior que zero ou menor que o limite da altura.
Segue abeixo o código completo:
//ball variables
let ballX = 300;
let ballY = 200;
let d = 13;
let r = d / 2 ;
let ballSpeedX = 6;
let ballSpeedY = 6;
//bat_a variables
let batX_a = 5;
let batY_a = 150;
let batWidth_a = 10;
let batHeight_a = 90;
//bat_b variables
let batX_b = 585;
let batY_b = 150;
let batWidth_b = 10;
let batHeight_b = 90;
let batSpeed_b = 4;
//game score
let scoreA = 0;
let scoreB = 0;
function preload(){
ambiance = loadSound("trilha.mp3");
hit = loadSound("raquetada.mp3");
gol = loadSound("ponto.mp3");
}
function setup() {
createCanvas(600, 400);
ambiance.loop();
}
function draw() {
background(0);
circle(ballX, ballY, d);
ballMoviment();
impact();
rect(batX_a, batY_a, batWidth_a, batHeight_a);
rect(batX_b, batY_b, batWidth_b, batHeight_b);
bat_aMoviment();
batImpact();
bat_bMoviment();
score();
}
function ballMoviment(){
ballX += ballSpeedX;
ballY += ballSpeedY;
}
function impact(){
if (ballX + r> width ||
ballX - r< 0 || batImpact()){
ballSpeedX *= -1;
}else if (ballY + r> height ||
ballY - r < 0){
ballSpeedY *= -1;
}
}
function bat_aMoviment(){
if (keyIsDown(UP_ARROW)&&batY_a>0){
batY_a -= 10;
}
if (keyIsDown(DOWN_ARROW)&&batY_a+batHeight_a<400){
batY_a += 10;
}
}
function batImpact(){
if (ballX - r < batX_a + batWidth_a && ballY - r < batY_a + batHeight_a && ballY + r > batY_a){
return true;
}else if(ballX + r > batX_b && ballY - r < batY_b + batHeight_b && ballY + r > batY_b){
return true
}
}
function bat_bMoviment(){
if(ballY < batY_b + batHeight_b/2){
batY_b -= batSpeed_b
}else if (ballY > batY_b + batHeight_b/2){
batY_b += batSpeed_b
}
}
function score(){
stroke(255);
textAlign(CENTER);
textSize(16);
fill(color(255, 140, 0));
rect(150, 10, 40, 20);
fill(255);
text(scoreA, 170, 26);
fill(color(255, 140, 0));
rect(450, 10, 40, 20);
fill(255);
text(scoreB, 470, 26);
if (ballX > 590){
scoreA += 1;
hit.play();
}else if (ballX < 10){
scoreB += 1;
hit.play();
}
}
Seguem aqui os links:
https://preview.p5js.org/ricardosipe/present/o2CPy6ey5