虽然循环导致异常?

时间:2013-08-18 15:33:00

标签: android animation while-loop

我正在尝试为精灵制作动画。有一个包含玩家对象的主类。此播放器对象扩展了一个精灵对象。播放器对象将它的图像数组赋予精灵类,这应该在不同的图像之间切换。 但是现在,每当我尝试用while()编写内容时,我都会遇到异常? 一切正常,但我只是无法得到任何循环开始......

游戏类绘制图像:

g2d.drawImage(player.getImage(),(int) player.getX(),(int) player.getY(),  null);

播放器扩展了精灵类。它包含x和y坐标。

public Player(double x, double y) {
    bitmap = new Bitmap("/sprites.png");
    sprites = new BufferedImage[2];
    sprites[0] = bitmap.getSprite(2, 2, 48, 48);
    sprites[1] = bitmap.getSprite(52, 2, 48, 48);
    this.x = x;
    this.y = y;
    setImages(sprites);
}

这是玩家类的构造函数。

然而,为什么我不能使用while循环?

您需要更多代码吗?

这是我的例外

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at com.ochs.game.Game.paint(Game.java:59)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JLayeredPane.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paintToOffscreen(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
at javax.swing.RepaintManager.paint(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
at java.awt.Container.paint(Unknown Source)
at java.awt.Window.paint(Unknown Source)
at javax.swing.RepaintManager$3.run(Unknown Source)
at javax.swing.RepaintManager$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.access$1000(Unknown Source)
at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

这是game.java代码:

public class Game extends JPanel implements Runnable{

public static final int WIDTH = 320;
public static final int HEIGHT = 240;
public static final int SCALE = 2;

public boolean isRunning;

private Player player;

public Game() {
    start();
}

public void start() {
    isRunning = true;
    new Thread(this).start();
}

public void stop() {
    isRunning = false;
}

public void run() {
    init();
    while(isRunning) {

        update();
        repaint();

        try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
            System.out.println("Failed to sleep");
        }
    }
}

public void init() {
    player = new Player(100, 100);
}

public void update() {

}

public void paint(Graphics g) {
    super.paint(g);
    Graphics2D g2d = (Graphics2D)g;
    g2d.drawImage(player.getImage(),(int) player.getX(),(int) player.getY(),  null);
}

public static void main(String[] args) {
    Game gameComponent = new Game();
    Dimension size = new Dimension(WIDTH*SCALE, HEIGHT*SCALE);

    JFrame frame = new JFrame("Invaders");
    frame.setVisible(true);
    frame.setSize(size);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    frame.add(gameComponent);
}
}

1 个答案:

答案 0 :(得分:0)

我意识到,在while循环中启动while循环将无法同时运行...我应该尝试使用“if”代替...从我的错误中学到:D