Click here to Skip to main content
Rate this: bad
good
Please Sign up or sign in to vote.
See more: Java
Hi
 
I found some code for breakout game in java on internet, i tried to run it in eclipse, but it throws exceptions.
 
if anyone could please help me out.
 
here is the code:
The game consists of seven files.
Commons.java
package breakout;
 
public interface Commons {
    public static final int WIDTH = 300;
    public static final int HEIGTH = 400;
    public static final int BOTTOM = 390;
    public static final int PADDLE_RIGHT = 250;
    public static final int BALL_RIGHT = 280;
}
The Commons.java file has some common constants.
Sprite.java
package breakout;
import java.awt.Image;
import java.awt.Rectangle;
 
public class Sprite {
 
    protected int x;
    protected int y;
    protected int width;
    protected int heigth;
    protected Image image;
 

    public void setX(int x) {
        this.x = x;
    }
 
    public int getX() {
        return x;
    }
 
    public void setY(int y) {
        this.y = y;
    }
 
    public int getY() {
        return y;
    }
 
    public int getWidth() {
        return width;
    }
 
    public int getHeight() {
        return heigth;
    }
 
    Image getImage()
    {
      return image;
    }
 
    Rectangle getRect()
    {
      return new Rectangle(x, y, 
          image.getWidth(null), image.getHeight(null));
    }
}
The Sprite class is a base class for all objects on the Board. We put here all methods and variables that are in Ball, Brick and Paddle objects. Like getImage() or getX() methods.
Brick.java
package breakout;
import javax.swing.ImageIcon;
 
public class Brick extends Sprite {
 
    String brickie = "../images/brickie.png";
 
    boolean destroyed;
 

    public Brick(int x, int y) {
      this.x = x;
      this.y = y;
 
      ImageIcon ii = new ImageIcon(this.getClass().getResource(brickie));
      image = ii.getImage();
 
      width = image.getWidth(null);
      heigth = image.getHeight(null);
 
      destroyed = false;
    }
 
    public boolean isDestroyed()
    {
      return destroyed;
    }
 
    public void setDestroyed(boolean destroyed)
    {
      this.destroyed = destroyed;
    }
 
}
This is the Brick class.
boolean destroyed;
In the destroyed variable we keep the state of a brick.
Ball.java
package breakout;
import javax.swing.ImageIcon;
 
public class Ball extends Sprite implements Commons {
 
   private int xdir;
   private int ydir;
 
   protected String ball = "../images/ball.png";
 
   public Ball() {
 
     xdir = 1;
     ydir = -1;
 
     ImageIcon ii = new ImageIcon(this.getClass().getResource(ball));
     image = ii.getImage();
 
     width = image.getWidth(null);
     heigth = image.getHeight(null);
 
     resetState();
    }
 

    public void move()
    {
      x += xdir;
      y += ydir;
 
      if (x == 0) {
        setXDir(1);
      }
 
      if (x == BALL_RIGHT) {
        setXDir(-1);
      }
 
      if (y == 0) {
        setYDir(1);
      }
    }
 
    public void resetState() 
    {
      x = 230;
      y = 355;
    }
 
    public void setXDir(int x)
    {
      xdir = x;
    }
 
    public void setYDir(int y)
    {
      ydir = y;
    }
 
    public int getYDir()
    {
      return ydir;
    }
}
This is the Ball class.
 public void move()
 {
   x += xdir;
   y += ydir;
 
   if (x == 0) {
     setXDir(1);
   }
 
   if (x == BALL_RIGHT) {
     setXDir(-1);
   }
 
   if (y == 0) {
     setYDir(1);
   }
 }
The move() method moves the ball on the Board. If the ball hits the borders, the directions are changed accordingly.
 
 public void setXDir(int x)
 {
   xdir = x;
 }
 public void setYDir(int y)
 {
   ydir = y;
 }
These two methods are called, when the ball hits the paddle or a brick.
Paddle.java
package breakout;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
 
public class Paddle extends Sprite implements Commons {
 
    String paddle = "../images/paddle.png";
 
    int dx;
 
    public Paddle() {
 
        ImageIcon ii = new ImageIcon(this.getClass().getResource(paddle));
        image = ii.getImage();
 
        width = image.getWidth(null);
        heigth = image.getHeight(null);
 
        resetState();
 
    }
 
    public void move() {
        x += dx;
        if (x <= 2) 
          x = 2;
        if (x >= Commons.PADDLE_RIGHT)
          x = Commons.PADDLE_RIGHT;
    }
 
    public void keyPressed(KeyEvent e) {
 
        int key = e.getKeyCode();
 
        if (key == KeyEvent.VK_LEFT) {
            dx = -2;
 
        }
 
        if (key == KeyEvent.VK_RIGHT) {
            dx = 2;
        }
    }
 
    public void keyReleased(KeyEvent e) {
        int key = e.getKeyCode();
 
        if (key == KeyEvent.VK_LEFT) {
            dx = 0;
        }
 
        if (key == KeyEvent.VK_RIGHT) {
            dx = 0;
        }
    }
 
    public void resetState() {
        x = 200;
        y = 360;
    }
}
This is the Paddle class. It encapsulates the paddle object in the Breakout game. The paddle is controlled with left and right arrow keys. By pressing the arrow key, we set the direction variable. By releasing the arrow key, we set the dx variable to zero. This way the paddle stops moving.
Board.java
package breakout;
 
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
 
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JPanel;
 
public class Board extends JPanel implements Commons {
 
    Image ii;
    Timer timer;
    String message = "Game Over";
    Ball ball;
    Paddle paddle;
    Brick bricks[];
 
    boolean ingame = true;
    int timerId;
 
    public Board() {
 
        addKeyListener(new TAdapter());
        setFocusable(true);
 
        bricks = new Brick[30];
        setDoubleBuffered(true);
        timer = new Timer();
        timer.scheduleAtFixedRate(new ScheduleTask(), 1000, 10);
    }
 
        public void addNotify() {
            super.addNotify();
            gameInit();
        }
 
    public void gameInit() {
 
        ball = new Ball();
        paddle = new Paddle();
 
        int k = 0;
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 6; j++) {
                bricks[k] = new Brick(j * 40 + 30, i * 10 + 50);
                k++;
            }
        }
    }
 
    public void paint(Graphics g) {
        super.paint(g);
 
        if (ingame) {
            g.drawImage(ball.getImage(), ball.getX(), ball.getY(),
                        ball.getWidth(), ball.getHeight(), this);
            g.drawImage(paddle.getImage(), paddle.getX(), paddle.getY(),
                        paddle.getWidth(), paddle.getHeight(), this);
 
            for (int i = 0; i < 30; i++) {
                if (!bricks[i].isDestroyed())
                    g.drawImage(bricks[i].getImage(), bricks[i].getX(),
                                bricks[i].getY(), bricks[i].getWidth(),
                                bricks[i].getHeight(), this);
            }
        } else {
 
            Font font = new Font("Verdana", Font.BOLD, 18);
            FontMetrics metr = this.getFontMetrics(font);
 
            g.setColor(Color.BLACK);
            g.setFont(font);
            g.drawString(message,
                         (Commons.WIDTH - metr.stringWidth(message)) / 2,
                         Commons.WIDTH / 2);
        }
 

        Toolkit.getDefaultToolkit().sync();
        g.dispose();
    }
 
    private class TAdapter extends KeyAdapter {
 
        public void keyReleased(KeyEvent e) {
            paddle.keyReleased(e);
        }
 
        public void keyPressed(KeyEvent e) {
            paddle.keyPressed(e);
        }
    }
 
    class ScheduleTask extends TimerTask {
        public void run() {
            ball.move();
            paddle.move();
            checkCollision();
            repaint();
        }
    }
 
    public void stopGame() {
        ingame = false;
        timer.cancel();
    }
 
    public void checkCollision() {
        if (ball.getRect().getMaxY() > Commons.BOTTOM) {
            stopGame();
        }
 
        for (int i = 0, j = 0; i < 30; i++) {
            if (bricks[i].isDestroyed()) {
                j++;
            }
            if (j == 30) {
                message = "Victory";
                stopGame();
            }
        }
 
        if ((ball.getRect()).intersects(paddle.getRect())) {
 
            int paddleLPos = (int)paddle.getRect().getMinX();
            int ballLPos = (int)ball.getRect().getMinX();
 
            int first = paddleLPos + 8;
            int second = paddleLPos + 16;
            int third = paddleLPos + 24;
            int fourth = paddleLPos + 32;
 
            if (ballLPos < first) {
                ball.setXDir(-1);
                ball.setYDir(-1);
            }
 
            if (ballLPos >= first && ballLPos < second) {
                ball.setXDir(-1);
                ball.setYDir(-1 * ball.getYDir());
            }
 
            if (ballLPos >= second && ballLPos < third) {
                ball.setXDir(0);
                ball.setYDir(-1);
            }
 
            if (ballLPos >= third && ballLPos < fourth) {
                ball.setXDir(1);
                ball.setYDir(-1 * ball.getYDir());
            }
 
            if (ballLPos > fourth) {
                ball.setXDir(1);
                ball.setYDir(-1);
            }
        }
 
        for (int i = 0; i < 30; i++) {
            if ((ball.getRect()).intersects(bricks[i].getRect())) {
 
                int ballLeft = (int)ball.getRect().getMinX();
                int ballHeight = (int)ball.getRect().getHeight();
                int ballWidth = (int)ball.getRect().getWidth();
                int ballTop = (int)ball.getRect().getMinY();
 
                Point pointRight =
                    new Point(ballLeft + ballWidth + 1, ballTop);
                Point pointLeft = new Point(ballLeft - 1, ballTop);
                Point pointTop = new Point(ballLeft, ballTop - 1);
                Point pointBottom =
                    new Point(ballLeft, ballTop + ballHeight + 1);
 
                if (!bricks[i].isDestroyed()) {
                    if (bricks[i].getRect().contains(pointRight)) {
                        ball.setXDir(-1);
                    }
 
                    else if (bricks[i].getRect().contains(pointLeft)) {
                        ball.setXDir(1);
                    }
 
                    if (bricks[i].getRect().contains(pointTop)) {
                        ball.setYDir(1);
                    }
 
                    else if (bricks[i].getRect().contains(pointBottom)) {
                        ball.setYDir(-1);
                    }
 
                    bricks[i].setDestroyed(true);
                }
            }
        }
    }
}
This is the Board class. Here we put the game logic.
 public void gameInit() {
 
     ball = new Ball();
     paddle = new Paddle();
 
     int k = 0;
     for (int i = 0; i < 5; i++) {
         for (int j = 0; j < 6; j++) {
             bricks[k] = new Brick(j * 40 + 30, i * 10 + 50);
             k++;
         }
     }
 }
In the gameInit() method we create a ball a paddle and 30 bricks.
if (ingame) {
     g.drawImage(ball.getImage(), ball.getX(), ball.getY(),
                 ball.getWidth(), ball.getHeight(), this);
     g.drawImage(paddle.getImage(), paddle.getX(), paddle.getY(),
                 paddle.getWidth(), paddle.getHeight(), this);
 
     for (int i = 0; i < 30; i++) {
         if (!bricks[i].isDestroyed())
             g.drawImage(bricks[i].getImage(), bricks[i].getX(),
                         bricks[i].getY(), bricks[i].getWidth(),
                         bricks[i].getHeight(), this);
     }
 }
If the game is not finished, we draw the ball, the paddle and the bricks inside the paint event.
 class ScheduleTask extends TimerTask {
 
     public void run() {
         ball.move();
         paddle.move();
         checkCollision();
         repaint();
     }
 }
The ScheduleTask is triggerd every 10 ms. In the run method, we move the ball and the paddle. We check for possible collisiont. And we repaint the screen.
 if (ball.getRect().getMaxY() > Commons.BOTTOM)
        stopGame();
 }
If the ball hits the bottom, we stop the game.
  for (int i = 0, j = 0; i < 30; i++) {
      if (bricks[i].isDestroyed()) {
          j++;
      }
      if (j == 30) {
          message = "Victory";
          stopGame();
      }
  }
We check how many bricks are destroyed. If we destroyed all 30 bricks, we win the game.
 if (ballLPos < first) {
     ball.setXDir(-1);
     ball.setYDir(-1);
 }
If the ball hits the first part of the paddle, we change the direction of the ball to the north-east.
 if (bricks[i].getRect().contains(pointTop)) {
     ball.setYDir(1);
 }
If the ball hits the bottom of the brick, we change the y direction of the ball. It goes down.
 
The autoMove() method is called each game cycle to move the ball on the screen. If it hists the boundaries, the ball direction changes.
 
Breakout.java
package breakout;
import javax.swing.JFrame;
 
public class Breakout extends JFrame {
 
    public Breakout()
    {
        add(new Board());
        setTitle("Breakout");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(Commons.WIDTH, Commons.HEIGTH);
        setLocationRelativeTo(null);
        setIgnoreRepaint(true);
        setResizable(false);
        setVisible(true);
    }
 
    public static void main(String[] args) {
        new Breakout();
    }
}
here are the exceptions:
Exception in thread "main" java.lang.NullPointerException
    at javax.swing.ImageIcon.<init>(Unknown Source)
    at Ball.<init>(Ball.java:14)
    at Board.gameInit(Board.java:48)
    at Board.addNotify(Board.java:43)
    at java.awt.Container.addNotify(Unknown Source)
    at javax.swing.JComponent.addNotify(Unknown Source)
    at java.awt.Container.addNotify(Unknown Source)
    at javax.swing.JComponent.addNotify(Unknown Source)
    at java.awt.Container.addNotify(Unknown Source)
    at javax.swing.JComponent.addNotify(Unknown Source)
    at javax.swing.JRootPane.addNotify(Unknown Source)
    at java.awt.Container.addNotify(Unknown Source)
    at java.awt.Window.addNotify(Unknown Source)
    at java.awt.Frame.addNotify(Unknown Source)
    at java.awt.Window.show(Unknown Source)
    at java.awt.Component.show(Unknown Source)
    at java.awt.Component.setVisible(Unknown Source)
    at java.awt.Window.setVisible(Unknown Source)
    at BrickBreaker.<init>(BrickBreaker.java:16)
    at BrickBreaker.main(BrickBreaker.java:20)
Exception in thread "Timer-0" java.lang.NullPointerException
    at Board$ScheduleTask.run(Board.java:110)
    at java.util.TimerThread.mainLoop(Unknown Source)
    at java.util.TimerThread.run(Unknown Source)
Posted 7-Oct-12 18:08pm
Edited 7-Oct-12 22:20pm
v3
Comments
Sergey Alexandrovich Kryukov at 8-Oct-12 2:02am
   
I don't think this is an appropriate question and reasonable way to learn programming. Write your own code, and, if you face some problems and can clearly explain them, we will gladly help you. There are too many poorly working pieces of code, why looking at them? This is almost a spam: one can find huge number of some works on the Web, select some which failed to work immediately and ask huge number of questions, but why? This is counter-productive.
--SA

1 solution

Rate this: bad
good
Please Sign up or sign in to vote.

Solution 1

Exception in thread "main" java.lang.NullPointerException
    at javax.swing.ImageIcon.<init>(Unknown Source)
    at Ball.<init>(Ball.java:14)
    at Board.gameInit(Board.java:48)
</init></init>
 
You should learn to read the exception - it's all written there:
There is a nullpointer on the ImageIcon. The nullpointer is thrown in the class Ball on line 14.
 
Please switch on line numbers in the Eclipse Preferences (Window -> Preferences-> enter "text editor" and refer to the option pane).
 
You can also place a break point on such exceptions, just click on the exception in the console view and accept the dialog. You should then be able to see the exception as a break point in the view "Breakpoints" (Debug layout, I like to add that view to my "normal" Java view (Window->show View -> other -> debug)).
Then, when you debug that code, the debugger will stop at the nullpointer. You can then check the stack in the debug view and see where your code failed.
  Permalink  

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

  Print Answers RSS
0 Nirav Prabtani 268
1 OriginalGriff 217
2 Mika Wendelius 185
3 CPallini 170
4 _Amy 170
0 Nirav Prabtani 284
1 OriginalGriff 217
2 Mika Wendelius 185
3 _Amy 170
4 CPallini 170


Advertise | Privacy | Mobile
Web01 | 2.8.140721.1 | Last Updated 8 Oct 2012
Copyright © CodeProject, 1999-2014
All Rights Reserved. Terms of Service
Layout: fixed | fluid

CodeProject, 503-250 Ferrand Drive Toronto Ontario, M3C 3G8 Canada +1 416-849-8900 x 100