按下后退按钮后的libGDX And​​roid白屏

时间:2016-08-16 17:49:05

标签: java android opengl-es libgdx assets

我遇到了libGDX的问题,当我退出后退按钮退出应用程序后,我只得到一个白色的屏幕。

实际的应用程序运行,接受触摸输入,并播放声音,但屏幕只是白色。

我已经读过保持对Textures的静态引用可能会导致这个问题,但我不这样做。

以下是我的资产代码如何运作的简化版本。

public class GdxGame extends Game {

    private Assets assets;

    @Override
    public void onCreate() {
        assets = new Asstes();
        assets.startLoading();

        /*
         *Within SplashScreen, GdxGame.getAssets() is accessed, and 
         *manager.update() is called
        */
        setScreen(new SplashScreen());
    }

    @Override
    public void dispose() {
        assets.dispose();
        assets = null;
    }

    //Perhaps a problem??
    public static Assets getAssets() {
        return ((GdxGame) Gdx.app.getApplicationListener()).assets;
    }
}

public class Assets implements Disposable{

    private AssetManager manager;

    public Assets() {
        manager = new AssetManager();
    }

    public void startLoading() {
        manager.load(....);
    }

    @Override
    public void dispose() {
        manager.dispose();
    }
}

在按下后退按钮后返回应用程序后,将重新创建AssetManager,重新打开SplashScreen(为白色),并且AssetManager将更新,直到重新加载所有资源(大约需要2秒)。

因此,当重新打开应用程序时,新的AssetManager将加载所有必需的纹理,但由于某些原因,所有纹理仍为白色。

它可能与我从UI和Game类访问AssetManager的方式有关吗?

//In GdxGame
public Assets getAssets() {
    return ((GdxGame) Gdx.app.getApplicationListener()).assets;
}

这是我唯一能看到出错的地方,但即便如此,我也不明白这可能是什么问题。

非常感谢任何帮助。

编辑:

这是SplashScreen类。这使问题更加令人困惑。在SplashScreen类中,我为徽标加载,绘制和处理新的纹理。与AssetManager无关。按下后退按钮后返回,此新纹理也不会出现。

public class SplashScreen extends Screen {
    private Texture logo;
    private Assets assets;

    @Override
    public void show() {
        assets = GdxGame.getAssets();

        logo = new Texture(Gdx.files.internal("data/logo.png"));
    }

    @Override
    public void render(float delta) {
        super.render(float delta);

        if(assets.load()) {
            //Switch screens
        }

        //getBatch() is the same form as getAssets() ((GdxGame) Gdx.app.getApplicationListener()).batch)
        GdxGame.getBatch().draw(logo, 100, 100, 250, 250);
    }

    @Override
    public void hide() {
        super.hide();
        logo.dispose();
    }
}

1 个答案:

答案 0 :(得分:1)

事实证明问题与我如何管理屏幕有关。我在GdxGame类中有一个方便的方法,允许我根据ScreenType枚举切换屏幕。

在enum中,我会在枚举构造函数中给出屏幕的类,用反射创建一个新的屏幕。

问题是我将屏幕存储在枚举中,并且只创建了一次。这意味着我在按下后返回时保留并使用旧环境中的屏幕。

要解决这个问题,我只需要更改它,以便每次访问枚举时都会创建一个新屏幕,而不是在开始时存储一个。