Изменение траектории мяча, чтобы избежать повторения петель в игре в понг - PullRequest
0 голосов
/ 06 августа 2020

Я сделал версию игры в Понг. Это работает, но время от времени он попадает в 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;    
  }
  
}
...