LibGDX 切换屏幕时出现 NullPointerException
LibGDX NullPointerException when switching screens
我正在使用 LibGDX 为 Android 开发游戏。我已经创建了几个屏幕,如果我似乎还没有访问过它们,我就可以成功访问它们。例如,我可以从 StartScreen
到 HomeScreen
再到 LoginScreen
再到 MainMenuScreen
就好了。但是,当我尝试通过单击注销按钮从我的 MainMenuScreen
切换到我的应用程序的 StartScreen
时,我得到一个 NPE:
Exception in thread "LWJGL Application" java.lang.NullPointerException
at com.mathsvszombies2.game.Screens.MainMenuScreen.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.run(LwjglApplication.java:126)
点击注册 button
后尝试从 SignUpScreen
转到 LoginScreen
时,我遇到了同样的错误,但是,我认为这不是错误与 button
相关,因为正如我之前提到的,使用 button
点击进入各种 screens
最初效果很好(例如 HomeScreen
到 LoginScreen
使用 Login
button
)。因此,我相信我的应用程序中有一个常见的 error
。让我们关注 MainMenuScreen
到 StartScreen
单击 logout button
时的错误。
我首先在 MainMenuScreen
class:
的顶部声明我的 Game
变量
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 class - 我首先在 StartScreen 的顶部声明我的游戏变量 class:
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);
}
我该如何解决这个问题?
简单地说,您所要做的就是在您拥有的任何屏幕 class 的构造函数方法中添加这行代码:
this.game = game;
这是说这个对象是游戏的一个实例。没有它,当您说 game.setScreen(new StartScreen(game));
时将 "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);
}
这是您唯一需要做的更改,现在更改屏幕就可以正常工作了。
我正在使用 LibGDX 为 Android 开发游戏。我已经创建了几个屏幕,如果我似乎还没有访问过它们,我就可以成功访问它们。例如,我可以从 StartScreen
到 HomeScreen
再到 LoginScreen
再到 MainMenuScreen
就好了。但是,当我尝试通过单击注销按钮从我的 MainMenuScreen
切换到我的应用程序的 StartScreen
时,我得到一个 NPE:
Exception in thread "LWJGL Application" java.lang.NullPointerException
at com.mathsvszombies2.game.Screens.MainMenuScreen.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.run(LwjglApplication.java:126)
点击注册 button
后尝试从 SignUpScreen
转到 LoginScreen
时,我遇到了同样的错误,但是,我认为这不是错误与 button
相关,因为正如我之前提到的,使用 button
点击进入各种 screens
最初效果很好(例如 HomeScreen
到 LoginScreen
使用 Login
button
)。因此,我相信我的应用程序中有一个常见的 error
。让我们关注 MainMenuScreen
到 StartScreen
单击 logout button
时的错误。
我首先在 MainMenuScreen
class:
Game
变量
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 class - 我首先在 StartScreen 的顶部声明我的游戏变量 class:
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);
}
我该如何解决这个问题?
简单地说,您所要做的就是在您拥有的任何屏幕 class 的构造函数方法中添加这行代码:
this.game = game;
这是说这个对象是游戏的一个实例。没有它,当您说 game.setScreen(new StartScreen(game));
时将 "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);
}
这是您唯一需要做的更改,现在更改屏幕就可以正常工作了。