与Graphics2D Translate的NullPointerException

时间:2015-07-08 08:25:45

标签: java nullpointerexception graphics2d

我没有遇到任何问题。我正在创建一个游戏,我构建了一个摄像头,以便在移动时跟随玩家,但是当我使用Graphics2D类的方法转换时,我得到一个空指针。

这个问题并不是一直发生的,有时当我运行游戏时会发生错误?

为Gr

创建所有对象
Exception in thread "Thread-3" java.lang.NullPointerException
at game.Game.render(Game.java:172)
at game.Game.run(Game.java:126)
at java.lang.Thread.run(Thread.java:745)

这里指着这条线。

    g2d.translate(cam.getX(), cam.getY());  

在我的渲染方法中。

    private void render() {
    BufferStrategy bs = this.getBufferStrategy();
    if (bs == null) {
        this.createBufferStrategy(3);
        return;
    }

    Graphics g = bs.getDrawGraphics();
    Graphics2D g2d = (Graphics2D) g; 

    g.setColor(Color.BLACK);
    g.fillRect(0, 0, WIDTH, HEIGHT);

    g2d.translate(cam.getX(), cam.getY());      

    handler.render(g);

    g2d.translate(-cam.getX(), -cam.getY());

    if (gameState == STATE.GAME) {
        hud.render(g);
    } else if (gameState == STATE.MENU || gameState == STATE.HELP ||    gameState == STATE.END) {
        menu.render(g);
    }
    g.dispose();
    bs.show();
}

有什么想法吗?

cam来自此代码:

public Game() {

    tex = new Texture();

    handler = new Handler();
    hud = new HUD();
    menu = new Menu(this, handler, hud);
    this.addKeyListener(new KeyInput(handler));
    this.addMouseListener(menu);

    new Window(WIDTH, HEIGHT, "Let's Build A Game", this);

    spawner = new Spawn(handler, hud);

//      loader = new BufferedImageLoader();
//      background = loader.loadImage("/level.png");
//      
//      loadImageLevel(background);

    cam = new Camera(0, 0);

    if (gameState == STATE.MENU) {
        handler.createMenuParticle();
    } else {
        handler.clearEnemies();
    }
}

这是我使用的相机类。

public class Camera {

private float x, y;

public Camera(float x, float y) {
    this.x = x;
    this.y = y;
}

public void tick(GameObject player) {
    x = -player.getX() + (Game.WIDTH / 2);
    y = -player.getY() + (Game.HEIGHT / 2);
}

public float getX() {
    return x;
}

public void setX(float x) {
    this.x = x;
}

public float getY() {
    return y;
}

public void setY(float y) {
    this.y = y;
}
}

1 个答案:

答案 0 :(得分:0)

由于堆栈跟踪不再深入,因此可能只是g2dcam可能是异常的原因。由于您之前使用g2dg)并且它有效,因此问题必须是cam,此时很可能是null

编辑:从您的编辑中我可以看到cam已在您向我们展示的类构造函数中正确初始化。因此,可能会发生下列情况之一:

  1. 还有另一个构建器未初始化cam
  2. 还有一些其他代码会覆盖cam
  3. 在构造函数中设置render之前调用cam方法。尝试将cam初始化作为构造函数的第一行来检查这一点。最好不要在Game构造函数中启动GUI内容。
  4. 你应该寻找能够完成这三件事的代码。在相关行设置断点以检查它们是否以及何时执行。