引用另一个类时Libgdx屏幕的NullPointerException(Libgdx Screen

2019-10-20 04:55发布

我点击了谷歌的每个结果我能发现可能会帮助我,但没有成功。

我建立了一个游戏,我想实现一个完整的UI。 在我的游戏我有我的精灵单独的类,所以,在做制作屏幕几个教程我想实现的东西,我可以用这些单独的类用于获取纹理,当前帧等

我得到的地方,我可以在两个屏幕之间,如果他们不是指任何身外之物切换点,但每当我尝试引用的游戏画面在我的精灵类,它崩溃,指着我这个在游戏类:

if (screen != null) screen.render(Gdx.graphics.getDeltaTime());

因此,这里是我使用的(即一类的默认减去任何实现的方法或其他的东西)的代码。

Tutorial.java:

public class Tutorial extends Game {
    MainMenuScreen mainMenuScreen ;
    AnotherScreen anotherScreen;
    Player player ;

    @Override
    public void create() {
        mainMenuScreen = new MainMenuScreen(this);
        anotherScreen = new AnotherScreen(this);
        setScreen(mainMenuScreen);
    }
}

MainMenuScreen.java(问题是在这里的批次):

public class MainMenuScreen implements Screen {
    Tutorial game ;
    SpriteBatch batch ;
    Player player ;
    Texture test ;

    public MainMenuScreen(Tutorial game){
        this.game = game;
    }

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);

        batch.begin();
        batch.draw(player.playerTexture, 200, 200); // error points to here
        batch.end();
    }
}

AnotherScreen.java(运行良好):

public class AnotherScreen implements Screen {
    Tutorial game ;
    SpriteBatch batch ;
    Texture test ;

    public AnotherScreen(Tutorial game){
        this.game = game;
    }

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);

        batch.begin();
        batch.draw(test, 0, 200);
        batch.end();
    }

    @Override
    public void show() {
        batch = new SpriteBatch();
        test = new Texture(Gdx.files.internal("badlogic.jpg")); 
    }
}

Player.java:

public class Player {
    Texture playerTexture ;
    Vector2 position;
    String textureLoc;

    public Player(Vector2 position, String textureLoc){
    //What I am trying to get from AnotherScreen.java
        playerTexture = new Texture(Gdx.files.internal("badlogic.jpg")); 
    }
    public Texture getPlayerTexture() {
        return playerTexture;
    }
    public void setPlayerTexture(Texture playerTexture) {
        this.playerTexture = playerTexture;
    }
}

在控制台确切的错误是:

Exception in thread "LWJGL Application" java.lang.NullPointerException
    at com.tutorial.MainMenuScreen.render(MainMenuScreen.java:25)
    at com.badlogic.gdx.Game.render(Game.java:46)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:206)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:114)

我究竟做错了什么? 我已经修改了代码把一切在不同的地方,但我不能得到它的工作。 感谢您的时间!

我发现,如果我打开MainMenuScreen,然后去AnotherScreen并尝试从主得到的纹理中的另一展现,如果我有教程转给另一个之前得到纹理它的工作原理。 这不与球员的工作,虽然...

Answer 1:

AnotherScreen工作,因为你已经在使用它之前实例批次。 然而,在MainMenuScreen,你没有实例化批处理和玩家对象,ERGO,在NPE。 请确保您已实例化的批次和球员质地如下:

public class MainMenuScreen implements Screen {
    Tutorial game ;
    SpriteBatch batch ;
    Player player ;
    Texture test ;

    public MainMenuScreen(Tutorial game){
        this.game = game;
    batch = new SpriteBatch();
    player = new Player(position, textureLoc); //modify arguments
    }

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT);

        batch.begin();
        batch.draw(player.playerTexture, 200, 200); // error points to here
        batch.end();
    }
}


Answer 2:

MainMenuScreen.java你还没有实例化的SpriteBatch 。 做就是了:

batch = new SpriteBatch();

之前使用它,要么在show()或在构造。

编辑:

我还没有看到你的player被实例化的任何地方。



文章来源: Libgdx Screen NullPointerException when referencing another class