title: Java Pong game bounce ball from paddle
body: <p>I'm trying to make a Pong game in Java and I have a little problem with bouncing the ball from the paddle.</p>
  
  <p>I have two paddles: left paddle1, right paddle2.</p>
  
  <p>My idea is the following: <code>ball_Y</code> should be between the height of the paddle and <code>ball_X</code> touching point should be <code>paddle width (PP1_width or PP2_width) +/- ball_radius</code></p>
  
  <p>Paddle2 is working OK, but the ball passes through paddle1 and I cannot see my mistake. </p>
  
  <p>Here is the video of how it looks like;</p>
  
  <p><a href="https://streamable.com/bzrud" rel="nofollow noreferrer">https://streamable.com/bzrud</a></p>
  
  <p>Here is the paddle bouncing part:</p>
  
  <pre><code>if(ball_Y &gt; P1_Y &amp;&amp; ball_Y &lt; P1_Hit_Y){
              if(ball_X &lt; P1_Hit_X){
  
                  ball_Velocity_X *= -1;
  
                  ball_X = P1_Hit_X;
              }
          }
  
          if (ball_Y &gt; P2_Y &amp;&amp; ball_Y &lt; P2_Hit_Y){
              if(ball_X &gt; P2_Hit_X){
  
                  ball_Velocity_X *= -1;
  
                  ball_X = P2_Hit_X;
  
  
              }
          }
  </code></pre>
  
  <p>Here is all the code:</p>
  
  <pre><code>import java.awt.*;
  import java.awt.geom.*;
  import javax.swing.*;
  import java.awt.event.*;
  
  
  public class PongGame extends GameEngine{
  
      public static void main(String args[]) {
          // Warning - don't edit this function.
  
          // Create a new game.
          createGame(new PongGame());
      }
  
      int game_width, game_height;
      double PP1_width, PP1_height, PP2_width, PP2_height;
      double P1_X, P1_Y, P2_X, P2_Y;
      double PP_Velocity;
      boolean PP1_UP, PP1_DOWN, PP2_UP, PP2_DOWN;
      double ball_X, ball_Y, ball_Radius, ball_Velocity_X, ball_Velocity_Y;
      double P1_Hit_X, P1_Hit_Y, P2_Hit_X, P2_Hit_Y;
      AudioClip wall_bounce;
  
  
  
  
  
  
  
      //TODO: Create paddles and a ball
      //Two paddles for two players: They will be controlled with W-S and UP-DOWN Keys
      public void paddle1(){
          drawSolidRectangle(P1_X, P1_Y, PP1_width, PP1_height);
  
      }
      public void paddle2(){
          drawSolidRectangle(P2_X, P2_Y, PP2_width, PP2_height);
  
      }
  
      public void ball(){
          drawSolidCircle(ball_X, ball_Y, ball_Radius);
      }
  
      //TODO: Update Paddles
      //DONE: Sources from PhysicsDemo lecture
      /**
       * These methods allow us the update the window with each framerate so we will be able to move the 
       * paddles
       */
      public void paddle1_update(double dt){
          // Paddle 1 Up with W
          if(PP1_UP == true){
              P1_Y -= PP_Velocity * dt; 
  
              // Check paddle inside wall
              if((P1_Y &lt; 0) ) {
                  P1_Y = 0;
  
              }
          }
          // Paddle 1 Down with S
          if(PP1_DOWN == true){
              P1_Y += PP_Velocity * dt; 
  
              // Check paddle inside wall
              if(P1_Y &gt; game_height-PP1_height){
                  P1_Y = game_height-PP1_height;
              }
  
          }
  
  
  
  
  
      }
      public void paddle2_update(double dt){
  
           // Paddle 2 Up with Up Key
           if(PP2_UP == true){
              P2_Y -= PP_Velocity * dt; 
  
              // Check paddle inside wall
              if((P2_Y &lt; 0) ) {
                  P2_Y = 0;
  
              }
          }
          // Paddle 2 Down with Down Key
          if(PP2_DOWN == true){
              P2_Y += PP_Velocity * dt; 
  
              // Check paddle inside wall
              if(P2_Y &gt; game_height-PP2_height){
                  P2_Y = game_height-PP2_height;
              }
          }
  
      }
  
      public void ball_update(double dt){
          ball_X += ball_Velocity_X * dt;
          ball_Y += ball_Velocity_Y * dt;
  
          // Bouncing the ball from edge of the wals
          if(ball_Y &lt; ball_Radius) {
              ball_Velocity_Y *= -1;
              //Play wall bounce sound
              playAudio(wall_bounce);
          }else if (ball_Y &gt; (game_height - ball_Radius)){
              ball_Velocity_Y *= -1;
               //Play wall bounce sound
              playAudio(wall_bounce);
  
          } 
  
  
  
      }
  
  
      // Background
      //TODO: Override init method in GameEngine
  
      public void init(){
          //Initialise Window size
          game_width = 750;
          game_height = 450;
  
          //Position for Paddles
          PP_Velocity = 250;
          PP1_width = 10;
          PP1_height = 100;
          P1_X = 0;
          P1_Y = 100;
  
          PP2_width = 10;
          PP2_height = 100;
          P2_X = game_width - PP2_width;
          P2_Y = 100;
  
          //Initialise Keyboard variables
          PP1_UP = false;
          PP1_DOWN = false;
          PP2_UP = false;
          PP2_DOWN= false;
  
          //Initialise Ball
          ball_X = 250;
          ball_Y = 250;
          ball_Radius = 10;
          ball_Velocity_X = 200;
          ball_Velocity_Y = 200;
  
          //Paddle ball bounce point
  
          P1_Hit_X = PP1_width + ball_Radius;
          P1_Hit_Y = P1_Y + PP1_height;
          P2_Hit_X = P2_X - ball_Radius;
          P2_Hit_Y = P2_Y + PP2_height;
  
          /* NOTE: Sound Resources
          * https://freesound.org/people/NoiseCollector/sounds/4391/
          * https://freesound.org/people/NoiseCollector/sounds/4386/
          */
          wall_bounce = loadAudio("Audio/wall_bounce.wav");
        //  paddle = loadAudio("Audio/paddle_bounce.wav");
          //background = loadAudio("Audio/background.wav");
  
  
  
  
      }
  
      // Override abstract method update(double) in GameEngine
      public void update(double dt){
          paddle1_update(dt);
          paddle2_update(dt);
          ball_update(dt);
  
  
          if(ball_Y &gt; P1_Y &amp;&amp; ball_Y &lt; P1_Hit_Y){
              if(ball_X &lt; P1_Hit_X){
  
                  ball_Velocity_X *= -1;
  
                  ball_X = P1_Hit_X;
              }
          }
  
          if (ball_Y &gt; P2_Y &amp;&amp; ball_Y &lt; P2_Hit_Y){
              if(ball_X &gt; P2_Hit_X){
  
                  ball_Velocity_X *= -1;
  
                  ball_X = P2_Hit_X;
  
  
              }
          }
  
  
      }
      public void paintComponent() {
          // Clear the background to black
          setWindowSize(game_width, game_height);
  
          changeBackgroundColor(black);
          clearBackground(game_width, game_height);
  
          changeColor(white);
          drawLine(game_width/2, 0, game_width/2, game_height);
  
          paddle1();
          paddle2();
          ball();
  
          // Draw in black
          changeColor(black);
  
      }
  
         //TODO: Key Listener for paddles ()
         //DONE: KeyListener -&gt; Space game example
         // KeyPressed Event
      public void keyPressed(KeyEvent event) {
          // Left Arrow
          if(event.getKeyCode() == KeyEvent.VK_W) {
              PP1_UP = true;
          }
          // Right Arrow
          if(event.getKeyCode() == KeyEvent.VK_S) {
              PP1_DOWN = true;
          }
          // Space Button
          if(event.getKeyCode() == KeyEvent.VK_UP) {
              PP2_UP = true;
          }
          if(event.getKeyCode() == KeyEvent.VK_DOWN) {
              PP2_DOWN = true;
          }
      }
  
      // KeyReleased Event
      public void keyReleased(KeyEvent event) {
          // Left Arrow
          if(event.getKeyCode() == KeyEvent.VK_W) {
              PP1_UP = false;
          }
          // Right Arrow
          if(event.getKeyCode() == KeyEvent.VK_S) {
              PP1_DOWN = false;
          }
          // Space Button
          if(event.getKeyCode() == KeyEvent.VK_UP) {
              PP2_UP = false;
          }
          if(event.getKeyCode() == KeyEvent.VK_DOWN) {
              PP2_DOWN = false;
          }
      }
  
  
  }
  </code></pre>