title: Collision detection using plain arrays and rectangles--java
body: <p>I am almost done with my first little java game for my final project.  It is a sidescroller where you have to shoot/avoid asteroids. My last problem is figuring out how to make my array of asteroids collide with the player's lasers.  Here's what I have so far, there's an "AWT-EventQueue-0" java.lang.NullPointerException" on line 137, that I can't deal with.  Any help is appreciated.</p>
  
  <p><strong>Edit</strong>: I added in my other classes, I realize it would be hard to judge the functionality of my code if I didn't show you where it came from.</p>
  
  <pre><code>package ShooterGame;
  
  import java.applet.Applet;
  import java.applet.AudioClip;
  import java.awt.*;
  import java.awt.event.*;
  import java.util.ArrayList;
  import java.util.Random;
  
  import javax.swing.*;
  
  public class Board extends JPanel implements ActionListener
  {   
      Enemy[] baddies = new Enemy[10000];
      Player p;
      Image img;
      int y;
      Timer time;
      boolean lost = false;
      static Font font = new Font("SanSerif", Font.BOLD, 24);
      public AudioClip theme, bang, laser;    
      static ArrayList&lt;Enemy&gt; enemies;
  
      public static int score = 0;
      public static int lives = 5;
  
      public Board() 
      {           
          p = new Player();       
          addKeyListener(new ActionListener());
          setFocusable(true);
          ImageIcon i = new ImageIcon("images/background.png");
          img = i.getImage();
  
          time = new Timer(5, this);
          time.start();
  
          for(int j = 0; j &lt; baddies.length; j++)
          {   
              Random ran = new Random();
              y = ran.nextInt(365)+1;
              baddies[j]= new Enemy((100*j + 700), y, "images/asteroid.gif");
          }
  
          theme = Applet.newAudioClip(getClass().getResource("theme.mid"));
          theme.play();
  
          bang = Applet.newAudioClip(getClass().getResource("bang.wav"));
      }
  
      public void actionPerformed(ActionEvent e)
      {
          checkCollisions();
          ArrayList&lt;?&gt; bullets = Player.getBullets();
  
          for(int i = 0; i &lt; bullets.size(); i++)
          {
              Bullet b = (Bullet)bullets.get(i);
  
              if(b.isVisible() == true)
              {
                  b.move();
              }
              else
              {
                  bullets.remove(i);
              }
          }
  
          p.move();
          for(int i = 0; i &lt; baddies.length; i++)
          {
              if(p.x &gt; 400)
              {
                  baddies[i].move(p.getdx());
              }
          }
  
          repaint();
      }
  
      public void paint(Graphics g)
      {   
          super.paint(g);
          Graphics2D g2d = (Graphics2D) g;
  
          if(lost)
          {
              g2d.drawString("You Lose!", 300, 300);
          }
  
          if((p.getX() - 590) % 2400 == 0 || (p.getX() - 590) % 2400 == 1)
          {
              p.nx = 0;
          }
  
          if((p.getX() - 1790) % 2400 == 0 ||(p.getX() - 1790) % 2400 == 1)
          {
              p.nx2 = 0;
          }
  
          g2d.drawImage(img, 685-p.nx2, 0, null);
  
          if(p.getX() &gt;= 590)
          {
              g2d.drawImage(img, 685-p.nx, 0, null);
          }
  
          g2d.drawImage(p.getImage(), p.edge, p.getY(), null);
  
          ArrayList&lt;?&gt; bullets = Player.getBullets();
          for(int i = 0; i &lt; bullets.size(); i++)
          {
              Bullet b = (Bullet)bullets.get(i);
              g2d.drawImage(b.getImg(), b.getX(), b.getY(), null);
  
          }
              for(int i = 0; i &lt; baddies.length; i++)
              {
                  if(baddies[i].isAlive == true)
                  {
                      g2d.drawImage(baddies[i].getImg(), baddies[i].getX(), baddies[i].getY(), null);
                  }
              }
  
          g2d.setColor(Color.white);
          g2d.drawString("Score: " + score, 0, 320);
          g2d.drawString("Lives: " + lives, 80, 320);
      }
  
      public void checkCollisions()
      {       
          Rectangle[] rect = new Rectangle[baddies.length];
          for(int i = 0; i &lt; baddies.length; i++)
          {
              Enemy e = (Enemy)baddies[i];
              rect[i] = e.getBounds();
          }
  
          ArrayList&lt;?&gt; bullets = Player.getBullets();
          for (int i = 0; i &lt; bullets.size(); i++)
          {
              Bullet b = (Bullet) bullets.get(i);
              Rectangle b1 = b.getBounds();
  
              if (rect[i].intersects(b1) &amp;&amp; baddies[i].isAlive())
              {
                  score++;
                  baddies[i].isAlive = false;
                  baddies[i].isVisible = false;
                  bang.play();
               }
  
              Rectangle h = p.getBounds();
              if (h.intersects(rect[i]))
              {
                  if(baddies[i].isAlive() == true)
                  {
                      lives--;
                      if(lives &lt; 0)
                      {
                          lost = true;
                          theme.stop();
                          System.exit(1);
                      }
                  }
              }
          }
      }
  
      private class ActionListener extends KeyAdapter
      {
          public void keyReleased(KeyEvent e)
          {
              p.keyReleased(e);
          }
  
          public void keyPressed(KeyEvent e)
          {
              p.keyPressed(e);
          }
      }
  }
  </code></pre>
  
  <p>Enemy </p>
  
  <pre><code>package ShooterGame;
  
  import java.awt.*;
  
  import javax.swing.ImageIcon;
  
  public class Enemy 
  {
      int x, y;
      Image img;
      boolean isAlive = true;
      boolean isVisible = true;
  
  
      public Enemy(int startX, int startY, String location)
      {
          x = startX;
          y = startY;
          ImageIcon l = new ImageIcon(location);
          img = l.getImage();
      }
  
      public Rectangle getBounds()
      {
          return new Rectangle(x, y, 60, 60);
      }
  
  
      public int getX() 
      {
          return x;
      }
  
      public int getY() 
      {
          return y;
      }
  
      public boolean isAlive() 
      {
          return isAlive;
      }
  
      public boolean isVisible() 
      {
          return isVisible;
      }
  
      public Image getImg() 
      {
          return img;
      }   
  
      public void move(int dx)
      {
          x = x - dx;
      }
  
  }
  </code></pre>
  
  <p>Bullet</p>
  
  <pre><code>package ShooterGame;
  
  import java.applet.Applet;
  import java.awt.*;
  import javax.swing.ImageIcon;
  import java.applet.AudioClip;
  
  public class Bullet 
  {   
      int x, y;
      Image img;
      boolean visible;
  
      public Bullet(int startX, int startY)
      {
          x = startX;
          y = startY;
  
          ImageIcon newBullet = new ImageIcon("images/bullet.gif");
          img = newBullet.getImage();
          visible = true;
      }
  
      public Rectangle getBounds()
      {
          return new Rectangle(x, y, 9, 5);
      }
  
      public int getX() 
      {
          return x;
      }
  
      public int getY() 
      {
          return y;
      }
  
      public Image getImg() 
      {
          return img;
      }
  
      public boolean isVisible() 
      {
          return visible;
      }
  
      public void move()
      {
          x = x + 2;
          if(x &gt; 700)
          {
              visible = false;
          }
      }
  
      public void setVisible(boolean isVisible)
      {
          visible = isVisible;
      }
  }
  </code></pre>
  
  <p>Player</p>
  
  <pre><code>package ShooterGame;
  
  import java.applet.Applet;
  import java.applet.AudioClip;
  import java.awt.*;
  import java.awt.event.KeyEvent;
  import java.util.ArrayList;
  
  import javax.swing.ImageIcon;
  
  public class Player 
  {
  
      int x, dx, y, dy, nx2, nx, edge, ceiling; 
      Image player;
      ImageIcon ib = new ImageIcon("images/player1back.gif");
      ImageIcon i = new ImageIcon("images/playerstill.gif");
      ImageIcon f = new ImageIcon("images/playerforward.gif");
      ImageIcon up = new ImageIcon("images/playerup.gif");
      ImageIcon down = new ImageIcon("images/playerdown.gif");
      public AudioClip laser;
      static ArrayList&lt;Bullet&gt; bullets;
  
      public Player()
      {laser = Applet.newAudioClip(getClass().getResource("laser.wav"));
          player = ib.getImage();
          x = 75;
          nx = 0;
          nx2 = 685;
          y = 172;
          edge = 150;
          ceiling = 0;
          bullets = new ArrayList&lt;Bullet&gt;();
      }
  
      public static ArrayList&lt;Bullet&gt; getBullets()
      {
          return bullets;
      }
  
      public void fire()
      {
          Bullet z = new Bullet((edge + 60), (y+17));
          bullets.add(z); 
      }
  
      public Rectangle getBounds()
      {
          return new Rectangle(edge, y, 43, 39);
      }
  
      public void move()
      {
          y = y + dy;
          if(y &lt; ceiling)
          {
              y = ceiling;
          }
  
          if(y &gt; 290)
          {
              y = 290;
          }
  
          if(dx != -1)
          {
              if(edge + dx &lt;= 151)
              {
                  edge = edge + dx;
              }
              else
              {
                  x = x + dx;
                  nx2 = nx2 + dx;
                  nx = nx + dx;
              }
          }
          else
              {
              if(edge + dx &gt; 0)
              {
                  edge = edge + dx;
              }
          }   
  
      }
  
      public int getX()
      {
          return x;
      }
  
      public int getdx()
      {
          return dx;
      }
  
      public int getY()
      {
          return y;
      }
  
      public Image getImage()
      {
          return player;
      }
  
      public void keyPressed(KeyEvent e)
      {
          int key = e.getKeyCode();
  
          if(key == KeyEvent.VK_RIGHT)
          {
              dx = 2;
              player = f.getImage();
          }
          if(key == KeyEvent.VK_UP)
          {
              dy = -1;
              player = up.getImage();
          }
          if(key == KeyEvent.VK_DOWN)
          {
              dy = 1;
              player = down.getImage();
          }
          if(key == KeyEvent.VK_SPACE)
          {
              fire();
              laser.play();
          }
      }
  
      public void keyReleased(KeyEvent e)
      {
          int key = e.getKeyCode();
  
          if(key == KeyEvent.VK_RIGHT)
          {
              dx = 1;
              player = ib.getImage();
          }
  
          if(key == KeyEvent.VK_UP)
          {
              dy = 0;
              player = ib.getImage();
          }
  
          if(key == KeyEvent.VK_DOWN)
          {
              dy = 0;
              player = ib.getImage();
          }
      }
  }
  </code></pre>
  
  <p>Frame</p>
  
  <pre><code>package ShooterGame;
  
  import javax.swing.*;
  
  public class Frame 
  {
      public AudioClip theme;
  
          public Frame()
          {
                  JFrame frame = new JFrame();
                  frame.add(new Board());
                  frame.setTitle("SideShooter");
                  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                  frame.setSize(700,365);
                  frame.setVisible(true);
                  frame.setLocationRelativeTo(null);
  
          }
  
          public static void main(String[] args)
          {
                  new Frame();
  
          }
  }
  </code></pre>