【问题标题】:Libgdx, button onclick event crashesLibgdx,按钮 onclick 事件崩溃
【发布时间】:2020-07-01 02:15:07
【问题描述】:

我正在尝试使用带有 Titlescreen 的 libgdx 创建一个 android 游戏,您只需按下开始,您的游戏就会开始。但是我很难让这些按钮工作。标题屏幕有效,但只要我按下“开始游戏”,游戏就会崩溃并出现错误:

线程“LWJGL 应用程序”中的异常 java.lang.NullPointerException 在 com.dinab.onepiecev2.TitleScreen$1.clicked(TitleScreen.java:47) 在 com.badlogic.gdx.scenes.scene2d.utils.ClickListener.touchUp(ClickListener.java:88) 在 com.badlogic.gdx.scenes.scene2d.InputListener.handle(InputListener.java:59) 在 com.badlogic.gdx.scenes.scene2d.Stage.touchUp(Stage.java:351) 在 com.badlogic.gdx.backends.lwjgl.LwjglInput.processEvents(LwjglInput.java:360) 在 com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:221) 在 com.badlogic.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 () {
    }
}

标题画面

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

游戏画面

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

【问题讨论】:

    标签: java android android-studio libgdx


    【解决方案1】:

    从崩溃日志看来,问题出在您的TitleScreen 中,您在其中添加了点击侦听器。我指的是以下行。

    game.setScreen(new GameScreen(game));
    

    看起来game 对象之前没有初始化,因此你得到一个NullPointerException

    【讨论】:

    • 谢谢!!添加this.game = aGame; 行后,它起作用了!
    猜你喜欢
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多