使用资产管理器的空点对象

时间:2019-10-17 22:38:46

标签: android libgdx

@Override
public void show()
{
    main = new MainClass();

    texture = main.manager.get("ball.png");

    mainActor = new MainActor(world, texture, new Vector2(1,2));
    stage.addActor(mainActor);
}

尝试在空对象引用上调用虚拟方法'java.lang.Object com.badlogic.gdx.assets.AssetManager.get(java.lang.String)'

如何解决?

“经理”是在我的MainClass上创建的AssetManager

我的MainClass

public class MainClass extends Game
{
   protected AssetManager manager;

    @Override
    public void create()
    {

        manager = new AssetManager();

        manager.load("ball.png", Texture.class);
        manager.finishLoading();


        setScreen(new MainScreen(this));
    }

}

2 个答案:

答案 0 :(得分:0)

您正在create()方法内创建管理器对象,但是您没有在调用该方法。 create()方法不是构造函数-不会自动调用。我不知道Game类的构造函数在做什么,但很可能不是在不调用create(),而是在其他情况下调用了该方法。

答案 1 :(得分:0)

我假设您的第一段代码来自MainScreen类中。您的MainScreen创建新的MainClass Game实例是没有意义的。既然如此,您引用的是一个从未调用过create()的MainClass实例,因此它的manager为空。

由于我可以看到您的MainScreen类已经采用了MainClass的一个实例,因此您只需要确保它已存储了它,就不必实例化一个新的实例。在这种情况下,我将传入的变量声明为final,因此我知道它们将不会更改(并且不可能意外地更改它们)。

public class MainScreen implements Screen {

    final MainClass main;

    public MainScreen(MainClass main){
        this.main = main;
    }

    //...

    @Override
    public void show()
    {
        texture = main.manager.get("ball.png");

        mainActor = new MainActor(world, texture, new Vector2(1,2));
        stage.addActor(mainActor);
    }

    //...

}