David Borges
David Borges

Reputation: 28

Error on Java libgdx with AssetsManager

So I start to try to do some game in java with libgdx, and I am trying to use the AssetsManager. but it keeps giving an error. I will put the code (I will try to resume the code) and the output. The game goes through the loading screen fine but when it reaches the game screen it stops and gives an error, I do believe it's because the assets. If someone knows why I am getting this error.

DesktopLauncher.java

public class DesktopLauncher {
    public static void main (String[] arg) {
        LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
        new LwjglApplication(new pressme(), config);
    }
}

pressme.java

public class pressme extends Game {

    LoadingScreen loadingscreen;
    AssetsManager assetsmanager;
    Assets assets;


    @Override
    public void create() {
        assets = new Assets();
        assetsmanager = new AssetsManager();
        assetsmanager.load();
        assets.other();
        loadingscreen = new LoadingScreen(this);
        setScreen(loadingscreen);       
    }
}

LoadingScreen.java

public class LoadingScreen implements Screen {

    Assets assets;
    AssetsManager assetsmanager;
    private final pressme game;
    public GameScreen game_screen;

    public LoadingScreen(final pressme game){

        assets = new Assets();
        assetsmanager = new AssetsManager();
        this.game = game;

    }
    @Override
    public void show() {
        assetsmanager.load();

    }

    private void update(float delta){

        System.out.println(progress);
        if(assetsmanager.manager.update()) {
            game.setScreen(new GameScreen(game));
          }
        progress = assetsmanager.manager.getProgress();     
    }

}

GameScreen.java

public class GameScreen implements Screen {
    pressme game;
    Assets assets;
    AssetsManager assetsmanager;

    public GameScreen(pressme game){
        this.game = game;
        assets = new Assets();
        assetsmanager = new AssetsManager();
    }
    @Override
    public void render(float delta) { 

    Gdx.gl.glClearColor( 0.5F, 0.5F, 0.5F, 0.5F);
        Gdx.gl.glClear( GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT );


        camera.update();
        generalUpdate(touch, camera);

        batch.setProjectionMatrix(camera.combined);
        assets.load();
        batch.begin();
        batch.draw(assets.back, 0, 0);
        batch.end();
   }


 }

Assets.java

public class Assets {

    AssetsManager assetsmanager;

    public Sprite back;

    public void load(){
        assetsmanager = new AssetsManager();
        assetsmanager.load();
        back = new Sprite(assetsmanager.manager.get(assetsmanager.back, Texture.class));
    }
}

AssetsManager.java

public class AssetsManager {

    public AssetManager manager = new AssetManager();

    public String back  = "back.png";

    public void load(){

    manager.load(back, Texture.class);

    }
}

Output

LOADINGGG
0.0 

0.0 

0.015151516 

0.015151516 

0.030303031 

    .
    .
    .
0.969697 

0.9848485 

0.9848485 

Exception in thread "LWJGL Application" java.lang.NullPointerException

     at com.badlogic.gdx.graphics.g2d.SpriteBatch.draw(SpriteBatch.java:586)

     at com.david.pressme.GameScreen.render(GameScreen.java:244)

     at com.badlogic.gdx.Game.render(Game.java:46)

     at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:223)

     at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:124)

EDIT

RC Thank you for the tip

So After I put the "assets.load()" still with some error. I dont know if the "assets.load()" it is on the right place

LOADINGGG
0.0
0.0
0.015151516
0.015151516
0.030303031
.
.
.
0.969697
0.969697
0.9848485
0.9848485
Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: Asset not loaded: back.png
    at com.badlogic.gdx.assets.AssetManager.get(AssetManager.java:144)
    at com.david.pressme.Assets.load(Assets.java:254)
    at com.david.pressme.GameScreen.render(GameScreen.java:172)
    at com.badlogic.gdx.Game.render(Game.java:46)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:223)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:124)

EDIT2

RC, Spylot ty for the tips, it was what you said

So its resolved, i puting

"assets.load" on "public void show()" 

this way when the screen its load he loads the assest on the begin, and i take it off from the

"public void render(){" 

because he was always loading the assests because its a loop (I think so), then on

"Assets.java public load(){" i put "assetsmanager.load();"

Thanks Rc for the tips. Then on the same place I put the

"assetsmanager.manager.finishLoading();"

so it loads all assets before do something. Thank you spylot for the tip.

Thank you all who help or try to help much appreciate.

Upvotes: 1

Views: 164

Answers (1)

Shafiq al-Shaar
Shafiq al-Shaar

Reputation: 1323

You should be aware that when you're loading assets, you cannot use them until you call finishLoading. finishLoading blocks all calls trying to grab onto the asset until they are fully loaded in the memory.

I highly suggest you to read the AssetManager API.

So in short, after each time you use load() call, you should finish it off using manager.finishLoading()

Upvotes: 2

Related Questions