private void stopBall(PlayerInterface player) { // This would be a condition where it would be sensible to stop the ball // if(player.Ball().Velocity().LengthSq()>Prm.holdingBallSpeed){ System.out.println("Trying to stop the ball!"); Vector2D randomSmallVector = new Vector2D(Utilities.RandomClamped(), Utilities.RandomClamped()); // The illusion of stopping the ball if (player.isReadyForNextKick()) { player.Ball().setPos(randomSmallVector.add(player.Pos())); Vector2D BallTarget = player.Ball().Pos().addToCopy(player.Ball().Velocity()); player.Kick(BallTarget, Prm.StoppingForce); } else { System.err.println( "RL Version of stop ball was called when agent was not ready for kick, shouldn't happen"); } // change state player.GetFSM().changeState(ChaseBall.Instance()); }
// ----------------------------- AddNoiseToKick -------------------------------- // // this can be used to vary the accuracy of a player's kick. Just call it // prior to kicking the ball using the ball's position and the ball target as // parameters. // ----------------------------------------------------------------------------- Vector2D AddNoiseToKick(Vector2D BallPos, Vector2D BallTarget) { double displacement = (Math.PI - Math.PI * Prm.PlayerKickingAccuracy) * Utilities.RandomClamped(); Vector2D toTarget = BallTarget.subtractToCopy(BallPos); toTarget.RotateAroundOrigin(displacement); return toTarget.add(BallPos); }