我正在使用LibGDX为Android开发游戏。我创建了几个屏幕,如果我还没有访问它们,我就能成功访问它们。例如,我可以从StartScreen
到HomeScreen
到LoginScreen
到MainMenuScreen
就好了。但是,当我尝试通过点击退出按钮从我的MainMenuScreen
切换到我的应用程序的StartScreen
时,我会得到一个NPE:
Exception in thread "LWJGL Application" java.lang.NullPointerException
at com.mathsvszombies2.game.Screens.MainMenuScreen$3.clicked(MainMenuScreen.java:145)
at com.badlogic.gdx.scenes.scene2d.utils.ClickListener.touchUp(ClickListener.java:89)
at com.badlogic.gdx.scenes.scene2d.InputListener.handle(InputListener.java:58)
at com.badlogic.gdx.scenes.scene2d.Stage.touchUp(Stage.java:353)
at com.badlogic.gdx.backends.lwjgl.LwjglInput.processEvents(LwjglInput.java:332)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:217)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:126)
点击注册SignUpScreen
后,当我尝试从LoginScreen
转到button
时出现同样的错误,但是,我不相信这是一个错误与button
有关,因为正如我之前提到的,使用screens
点击(例如button
到HomeScreen
使用{{LoginScreen
最初可以正常使用Login
1}} button
)。因此,我相信我的应用程序中有一个共同的error
。在MainMenuScreen
点击后,让我们关注StartScreen
到logout button
错误。
我首先在Game
类的顶部声明我的MainMenuScreen
变量:
private Game game;
这是我的MainMenuScreen构造函数:
public MainMenuScreen(Game game) {
app.log("Screen", "Main Menu Screen");
camera= new OrthographicCamera();
viewport = new FitViewport(MathsVsZombies.V_WIDTH, MathsVsZombies.V_HEIGHT, camera);
stage = new Stage(viewport);
}
这是我尝试切换屏幕的地方:
logoutBtn.addListener(new ClickListener(){
@Override
public void clicked(InputEvent event, float x, float y) {
LoginScreen.isLoggedIn = false;
game.setScreen(new StartScreen(game));
}
});
这是我的StartScreen类 - 我首先在StartScreen类的顶部声明我的Game变量:
private Game game;
这是我的StartScreen构造函数:
public StartScreen(Game game){
Gdx.app.log("Screen", "Start Screen");
this.game = game;
camera= new OrthographicCamera();
viewport = new FitViewport(MathsVsZombies.V_WIDTH, MathsVsZombies.V_HEIGHT, camera);
stage = new Stage(viewport);
StartScreenActor actor = new StartScreenActor();
stage.addActor(actor);
Gdx.input.setInputProcessor(stage);
}
我该如何解决这个问题?
答案 0 :(得分:0)
简单地说,您所要做的就是在构造函数方法中为您拥有的任何屏幕类添加以下代码:
this.game = game;
这就是说这个对象是游戏的一个实例。没有它,通过"游戏"当您说game.setScreen(new StartScreen(game));
无法引用时,进入StartScreen,因此会产生NullPointerException。
更新了MainMenuScreen构造函数:
public MainMenuScreen(Game game) {
this.game = game;
app.log("Screen", "Main Menu Screen");
camera= new OrthographicCamera();
viewport = new FitViewport(MathsVsZombies.V_WIDTH, MathsVsZombies.V_HEIGHT, camera);
stage = new Stage(viewport);
}
这是您必须做出的唯一改变,现在更换屏幕会很好。