Libgdx, событие onclick кнопки вылетает - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь создать android игру, используя libgdx с Titlescreen, вы просто нажимаете «Пуск», и ваша игра запускается. Однако я испытываю затруднения, пытаясь заставить эти кнопки работать. Экран заголовка работает, но как только я нажимаю «запустить игру», игра вылетает с ошибкой:

Исключение в теме «Приложение LWJGL» java .lang.NullPointerException на com.dinab .onepiecev2.TitleScreen $ 1.clicked (TitleScreen. java: 47) в com.badlogi c .gdx.scenes.scene2d.utils.ClickListener.touchUp (ClickListener. java: 88) в com.badlogi c .gdx.scenes.scene2d.InputListener.handle (InputListener. java: 59) в com.badlogi c .gdx.scenes.scene2d.Stage.touchUp (Stage. java: 351) в com.badlogi c .gdx.backends.lwjgl.LwjglInput.processEvents (LwjglInput. java: 360) по адресу com.badlogi c .gdx.backends.lwjgl.LwjglApplication.mainL oop (LwjglApplication: 22w1gl1. ) at com.badlogi c .gdx.backends.lwjgl.LwjglApplication $ 1.run (LwjglApplication. java: 128)

Я не понимаю, что я делаю неправильно и проблема в моем TitleScreen. java или в моем GameScreen.java

Это мои коды:

Основной класс

public class Onepiecev2 extends Game {
    static public Skin gameSkin;
    public void create () {
        gameSkin = new Skin(Gdx.files.internal("skin/glassy-ui.json"));
        this.setScreen(new TitleScreen(this));
    }

    public void render () {
        super.render();
    }

    public void dispose () {
    }
}

* 101 8 * TitleScreen

public class TitleScreen implements Screen {

    Stage stage;
    Game game;
    SpriteBatch batch;
    Texture img;
    TextureRegion mainBackground;

    public TitleScreen(Game aGame){
        batch = new SpriteBatch();
        img = new Texture("start_screen.jpg");
        mainBackground = new TextureRegion(img, 0, 0, 1920, 1080);
        stage = new Stage(new ScreenViewport());
        Gdx.input.setInputProcessor(stage);
        Skin mySkin = new Skin(Gdx.files.internal("skin/glassy-ui.json"));

        Button start_btn = new TextButton("START GAME", mySkin);
        start_btn.setSize(Constantes.screenWidth/4, Constantes.screenHeight/12);
        start_btn.setPosition(Constantes.col_width*3,Constantes.row_height/3);
        start_btn.addListener( new ClickListener() {
            @Override
            public void clicked(InputEvent event, float x, float y) {
                game.setScreen( new GameScreen(game) );
            }
        } );

        stage.addActor(start_btn);

    }

    @Override
    public void show() {
        Gdx.input.setInputProcessor(stage);
    }

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        batch.begin();
        batch.draw(mainBackground, 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        batch.end();
        stage.act();
        stage.draw();
    }

    @Override
    public void resize(int width, int height) {

    }

    @Override
    public void pause() {

    }

    @Override
    public void resume() {

    }

    @Override
    public void hide() {

    }

    @Override
    public void dispose() {
        stage.dispose();
        batch.dispose();
        img.dispose();
    }
}

GameScreen

public class GameScreen implements Screen {

    Stage stage;
    Game game;
    SpriteBatch batch;
    Texture img;
    TextureRegion mainBackground;

    public GameScreen(Game aGame){
        batch = new SpriteBatch();
        img = new Texture("start_screen.jpg");
        mainBackground = new TextureRegion(img, 0, 0, 1920, 1080);
        stage = new Stage(new ScreenViewport());
        Gdx.input.setInputProcessor(stage);
        Skin mySkin = new Skin(Gdx.files.internal("skin/glassy-ui.json"));

        Button start_btn = new TextButton("GO BACK", mySkin);
        start_btn.setSize(Constantes.screenWidth/4, Constantes.screenHeight/12);
        start_btn.setPosition(Constantes.col_width*3,Constantes.row_height/3);
        start_btn.addListener( new ClickListener() {
            @Override
            public void clicked(InputEvent event, float x, float y) {
                game.setScreen( new TitleScreen(game));
            }
        } );

        stage.addActor(start_btn);

    }

    @Override
    public void show() {
        Gdx.input.setInputProcessor(stage);
    }

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        batch.begin();
        batch.draw(mainBackground, 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        batch.end();
        stage.act();
        stage.draw();
    }

    @Override
    public void resize(int width, int height) {

    }

    @Override
    public void pause() {

    }

    @Override
    public void resume() {

    }

    @Override
    public void hide() {

    }

    @Override
    public void dispose() {
        stage.dispose();
        batch.dispose();
        img.dispose();
    }
}

1 Ответ

1 голос
/ 20 марта 2020

Из журнала cra sh похоже, что проблема в вашем TitleScreen, где вы добавляете прослушиватель кликов. Я имею в виду следующую строку.

game.setScreen(new GameScreen(game));

Похоже, объект game ранее не инициализировался и, следовательно, вы получаете NullPointerException.

...