我正在使用libgdx为android开发一个游戏。我已经创建了几个屏幕,我能够成功地访问它们,如果我还没有访问他们似乎。例如,我可以从StartScreenHomeScreen再到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最初工作良好(例如使用buttonHomeScreenLoginScreen转到Login)。因此,我相信在我的应用程序中有一个常见的button。让我们把焦点放在单击“我的errorMainMenuScreen错误”上。
我首先在StartScreen类的顶部声明我的logout button变量:
private Game game;

这是我的主屏幕构造函数:
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类的顶部声明我的游戏变量:
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);
}

我该怎么解决?

最佳答案

简单地说,您只需在构造函数方法中为您拥有的任何屏幕类添加这一行代码:

this.game = game;

这是说这个物体是游戏的一个实例。如果没有它,当您说game.setScreen(new StartScreen(game));没有可引用的内容时,将“game”传递到startscreen中,因此会给出一个nullpointerexception。
更新的主屏幕构造函数:
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);
}

这是你必须做的唯一的改变,现在改变屏幕就可以了。

08-05 04:15