title: XNA Rectangle intersection
body: <p>I recently started on XNA development and having some (very limited) experience with it in the past, I decided to try and make a Pong clone to see how much I could remember. Most of what I knew came back to me, but I am having problems with collision detection between the bats and the ball. I have 3 rectangles set to update position along with the sprites that I am using, and when the ball rectangle intersects with a bat rectangle, I multiply the X speed of the ball by -1. However this produces an unusual effect by which the ball bounces around the bat as shown in <a href="http://www.youtube.com/watch?v=rRouXG7y2HM" rel="nofollow">this video</a>.What am I doing wrong here?</p>
  
  <p>Here is the code for this project (poor, I know):</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.Linq;
  using Microsoft.Xna.Framework;
  using Microsoft.Xna.Framework.Audio;
  using Microsoft.Xna.Framework.Content;
  using Microsoft.Xna.Framework.GamerServices;
  using Microsoft.Xna.Framework.Graphics;
  using Microsoft.Xna.Framework.Input;
  using Microsoft.Xna.Framework.Media;
  
  namespace Pong
  {
  
  public class Game1 : Microsoft.Xna.Framework.Game
  {
      GraphicsDeviceManager graphics;
      SpriteBatch spriteBatch;
  
      System.Random generator = new Random();
  
      Texture2D ball;
      Texture2D bat1;
      Texture2D bat2;
      Texture2D middle;
  
      Vector2 midPos;
      Vector2 bat1Pos;
      Vector2 bat2Pos;
      Vector2 ballPos;
      Vector2 ballVelo;
  
      public Game1()
      {
          graphics = new GraphicsDeviceManager(this);
          Content.RootDirectory = "Content";
      }
  
      protected override void Initialize()
      {
          base.Initialize();
      }
  
      protected override void LoadContent()
      {
          // Create a new SpriteBatch, which can be used to draw textures.
          spriteBatch = new SpriteBatch(GraphicsDevice);
  
          //Load sprites
          ball = Content.Load&lt;Texture2D&gt;(@"sprites/pongball");
          bat1 = Content.Load&lt;Texture2D&gt;(@"sprites/pongbat");
          bat2 = Content.Load&lt;Texture2D&gt;(@"sprites/pongbat");
          middle = Content.Load&lt;Texture2D&gt;(@"sprites/pongmiddle");
  
          //Set default sprite positions
          midPos.X = (Window.ClientBounds.Width / 2) - 5;
          midPos.Y = 0;
  
          bat1Pos.X = 10;
          bat1Pos.Y = (Window.ClientBounds.Height/2) - 50;
  
          bat2Pos.X = Window.ClientBounds.Width - 20;
          bat2Pos.Y = (Window.ClientBounds.Height/2) - 50;
  
          ballPos.X = (Window.ClientBounds.Width / 2) - 5;
          ballPos.Y = (Window.ClientBounds.Height / 2) - 5;
  
          //Generate random ball velocity
          ballVelo.X = generator.Next(5,10);
          ballVelo.Y = generator.Next(4, 7);
      }
  
      protected override void UnloadContent()
      {
  
      }
  
      protected override void Update(GameTime gameTime)
      {
  
  
          //Update rectangle values
          Rectangle bat1Rect = new Rectangle((int)bat1Pos.X, (int)bat1Pos.Y, 10, 100);
          Rectangle bat2Rect = new Rectangle((int)bat2Pos.X, (int)bat2Pos.Y, 10, 100);
          Rectangle ballRect = new Rectangle((int)ballPos.X, (int)ballPos.Y, 10, 100);
  
          //Move ball
          ballPos += ballVelo;
  
          // Allows the game to exit
          if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
              this.Exit();
          if (Keyboard.GetState().IsKeyDown(Keys.Escape))
              this.Exit();
  
          //Bat 1 movement and restriction
          if (Keyboard.GetState().IsKeyDown(Keys.Up))
              bat1Pos.Y -= 4;
  
          if (Keyboard.GetState().IsKeyDown(Keys.Down))
              bat1Pos.Y += 4;
  
          if (bat1Pos.Y &lt;= 0)
              bat1Pos.Y = 0;
  
          if (bat1Pos.Y &gt;= Window.ClientBounds.Height - 100)
              bat1Pos.Y = Window.ClientBounds.Height - 100;
  
  
          //Bat 2 movement and restriction
          if (Keyboard.GetState().IsKeyDown(Keys.W))
              bat2Pos.Y -= 4;
  
          if (Keyboard.GetState().IsKeyDown(Keys.S))
              bat2Pos.Y += 4;
  
          if (bat2Pos.Y &lt;= 0)
              bat2Pos.Y = 0;
  
          if (bat2Pos.Y &gt;= Window.ClientBounds.Height - 100)
              bat2Pos.Y = Window.ClientBounds.Height - 100;
  
          //Ball movement restrictions
          if (ballPos.X &lt;= 0)
              ballVelo.X *= -1;
  
          if (ballPos.Y &lt;= 0)
              ballVelo.Y *= -1;
  
          if (ballPos.X &gt;= Window.ClientBounds.Width - 5)
              ballVelo.X *= -1;
  
          if (ballPos.Y &gt;= Window.ClientBounds.Height - 5)
              ballVelo.Y *= -1;
  
  
          //Collision detection between bats and ball
          if (ballRect.Intersects(bat1Rect))
          {
              ballVelo.X *= -1;
          }
  
          if (ballRect.Intersects(bat2Rect))
          {
              ballVelo.X *= -1;
          }
  
          base.Update(gameTime);
      }
  
      protected override void Draw(GameTime gameTime)
      {
          GraphicsDevice.Clear(Color.Black);
  
          spriteBatch.Begin();
          spriteBatch.Draw(middle, midPos, Color.White);
          spriteBatch.Draw(bat1, bat1Pos, Color.White);
          spriteBatch.Draw(bat2, bat2Pos, Color.White);
          spriteBatch.Draw(ball, ballPos, Color.White);
          spriteBatch.End();
  
          base.Draw(gameTime);
      }
  }
  }
  </code></pre>