3

我正在使用 LibGDX 为 Android 开发游戏。我已经创建了几个屏幕,如果我似乎还没有访问过它们,我可以成功地访问它们。例如,我可以从StartScreenHomeScreenLoginScreenMainMenuScreen就好了。但是,当我尝试通过单击注销按钮从我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)

当我在单击 Sign Up 后尝试从我转到时,我得到了同样的错误SignUpScreen,但是,我不认为这是一个错误,因为正如我之前提到的,使用点击(例如至于使用)。因此,我相信我的应用程序中有一个共同点。让我们关注我的点击错误。LoginScreenbuttonbuttonscreensbuttonHomeScreenLoginScreenLogin buttonerrorMainMenuScreenStartScreenlogout 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);
}

我怎样才能解决这个问题?

4

1 回答 1

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);
}

这是您必须进行的唯一更改,并且更改屏幕现在可以正常工作。

于 2018-03-07T06:19:20.783 回答