LibGDX NullPointerException при переключении экранов

Я занимаюсь разработкой игры для Android с использованием LibGDX. Я создал несколько экранов, и я могу успешно их посещать, если я их еще не посещал. Например, я могу перейти от 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 с помощью Loginbutton). Таким образом, я считаю, что есть общее 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 - я начинаю с объявления моей переменной Game в верхней части моего класса 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);
}

Как я могу это исправить?

1 ответ

Решение

Просто все, что вам нужно сделать, это добавить эту строку кода в метод конструктора для любого класса экрана:

this.game = game;

Это говорит о том, что этот объект является экземпляром игры. Без этого, передавая "игру" в StartScreen, когда вы говорите, game.setScreen(new StartScreen(game)); не имеет ничего, на что можно ссылаться, и поэтому выдает исключение 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);
}

Это единственное изменение, которое вам нужно сделать, и смена экранов теперь будет работать нормально.

Другие вопросы по тегам