带有 Graphics2D 转换的 NullPointerException
NullPointerException with Graphics2D Translate
我在解决这个问题时没有遇到任何问题。我正在创建一个游戏,我构建了一个摄像机来跟随玩家移动,但是当我使用从 Graphics2D class 转换的方法时,我得到一个空指针。
这个问题不是一直都会出现,有时候我运行玩游戏的时候会出现这个错误?
所有对象都是为 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();
}
}
这是我用的相机class。
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;
}
}
由于stacktrace没有深入,所以只能是g2d
和cam
可能是异常的原因。由于您之前使用 g2d
(如 g
)并且有效,问题一定是 cam
,此时很可能是 null
。
编辑:从您的编辑中我可以看到 cam
在您向我们展示的 class' 构造函数中正确初始化。因此可能会发生以下情况之一:
- 还有一个构造函数没有初始化
cam
。
- 有一些其他代码覆盖了
cam
。
- 您的
render
方法在构造函数中设置 cam
之前被调用。尝试使 cam
初始化成为构造函数的第一行以检查这一点。完全不在 Game
构造函数中启动 GUI 内容也可能是个好主意。
您应该查找执行这三项操作中的任何一项的代码。在相关行设置断点以检查它们是否以及何时执行。
我在解决这个问题时没有遇到任何问题。我正在创建一个游戏,我构建了一个摄像机来跟随玩家移动,但是当我使用从 Graphics2D class 转换的方法时,我得到一个空指针。
这个问题不是一直都会出现,有时候我运行玩游戏的时候会出现这个错误?
所有对象都是为 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();
}
}
这是我用的相机class。
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;
}
}
由于stacktrace没有深入,所以只能是g2d
和cam
可能是异常的原因。由于您之前使用 g2d
(如 g
)并且有效,问题一定是 cam
,此时很可能是 null
。
编辑:从您的编辑中我可以看到 cam
在您向我们展示的 class' 构造函数中正确初始化。因此可能会发生以下情况之一:
- 还有一个构造函数没有初始化
cam
。 - 有一些其他代码覆盖了
cam
。 - 您的
render
方法在构造函数中设置cam
之前被调用。尝试使cam
初始化成为构造函数的第一行以检查这一点。完全不在Game
构造函数中启动 GUI 内容也可能是个好主意。
您应该查找执行这三项操作中的任何一项的代码。在相关行设置断点以检查它们是否以及何时执行。