Я сделал версию игры в Понг. Это работает, но время от времени он попадает в al oop, где мяч может подпрыгивать между компьютером и пользовательскими лопастями без необходимости перемещаться между ними. Я предполагаю, что могу запустить функцию, которая изменяет движение мяча в этих случаях, используя операторы if, но я не уверен, как лучше всего интегрировать ее в код, который я написал для управления движением мяча. Я пробовал пару раз, но получилось очень странное движение, поэтому я явно делаю что-то не так.
Это код, который я использую для перемещения мяча:
//paddleTwo = AI
//paddleOne = player
function moveEverything() {
ballPositionX = ballPositionX + ballVelocityX;
if(ballPositionX > canvas.width - paddleWidth*2 - ballSize/2) {
if(ballPositionY >= paddleTwoY && ballPositionY <= paddleTwoY + paddleHeight && ballPositionX < canvas.width - paddleWidth) {
ballVelocityX = -ballVelocityX;
if(ballPositionY >= paddleTwoY &&
ballPositionY < paddleTwoY + paddleHeight*.2) {
ballVelocityY = -15 * (.25 * difficultyLevel);
} else if(ballPositionY >= paddleTwoY + paddleHeight*.2 &&
ballPositionY < paddleTwoY + paddleHeight*.4) {
ballVelocityY = -10 * (.25 * difficultyLevel);
} else if(ballPositionY >= paddleTwoY + paddleHeight*.4 &&
ballPositionY < paddleTwoY + paddleHeight*.6) {
ballVelocityY = getRandomNumber(-5,5);;
} else if(ballPositionY >= paddleTwoY + paddleHeight*.6 &&
ballPositionY < paddleTwoY + paddleHeight*.8) {
ballVelocityY = 10 * (.25 * difficultyLevel);
} else if(ballPositionY >= paddleTwoY + paddleHeight*.8 &&
ballPositionY < paddleTwoY + paddleHeight) {
ballVelocityY = 15 * (.25 * difficultyLevel);
}
} else if(ballPositionX > canvas.width) {
resetBall();
playerOneScore++;
difficultyLevel = playerOneScore*.5;
}
randomizeGame(); <=== this function just manipulates the AI player behaviour
} else if(ballPositionX < paddleWidth*2 + ballSize/2) {
if(ballPositionY >= paddleOneY &&
ballPositionY <= paddleOneY + (paddleHeight+ 20) &&
ballPositionX > paddleWidth + ballSize/2) {
ballVelocityX = -ballVelocityX;
paddleHit = 'hit';
gorilla.metric({paddleHit});
console.log({paddleHit});
if(ballPositionY >= paddleOneY &&
ballPositionY < paddleOneY + (paddleHeight+ 20)*.2) {
ballVelocityY = -20 * (.25 * difficultyLevel);
} else if(ballPositionY >= paddleOneY + (paddleHeight + 20)*.2 &&
ballPositionY < paddleOneY + (paddleHeight+ 20) *.4) {
ballVelocityY = -10 * (.25 * difficultyLevel);
} else if(ballPositionY >= paddleOneY + (paddleHeight+ 20)*.4 &&
ballPositionY < paddleOneY + (paddleHeight+ 20)*.6) {
ballVelocityY = 10 * (.25 * difficultyLevel);
} else if(ballPositionY >= paddleOneY + (paddleHeight+ 20)*.6 &&
ballPositionY < paddleOneY + (paddleHeight+ 20)*.8) {
ballVelocityY = 10 * (.25 * difficultyLevel);
} else if(ballPositionY >= paddleOneY + (paddleHeight+ 20)*.8 &&
ballPositionY < paddleOneY + (paddleHeight+ 20)) {
ballVelocityY = 20 * (.25 * difficultyLevel);
}
} else if(ballPositionX <= -ballSize) {
resetBall();
paddleHit = 'miss';
gorilla.metric({paddleHit});
gorilla.metric({pressCount});
console.log({paddleHit});
console.log({pressCount})
playerTwoScore++;
pressCount = 0;
}
randomizeGame();
}
ballPositionY = ballPositionY + ballVelocityY;
if(ballPositionY > canvas.height - ballSize/2) {
ballVelocityY = -ballVelocityY;
ballPositionY = canvas.height - ballSize/2;
} else if(ballPositionY < ballSize/2) {
ballVelocityY = -ballVelocityY;
ballPositionY = ballSize/2;
}
if(paddleOneDirectionY === 'up' && paddleOneY >= 0) {
paddleOneY = paddleOneY - paddleOneVelocityY;
} else if(paddleOneDirectionY === 'down' &&
paddleOneY < (canvas.height - (paddleHeight+ 20)) ) {
paddleOneY += paddleOneVelocityY;
}
if(ballPositionY < paddleTwoY) {
paddleTwoY -= paddleTwoVelocityY;
} else if(ballPositionY > paddleTwoY + paddleHeight) {
paddleTwoY += paddleTwoVelocityY;
}
}