我遇到了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();
}
}
答案 0 :(得分:1)
事实证明问题与我如何管理屏幕有关。我在GdxGame类中有一个方便的方法,允许我根据ScreenType
枚举切换屏幕。
在enum中,我会在枚举构造函数中给出屏幕的类,用反射创建一个新的屏幕。
问题是我将屏幕存储在枚举中,并且只创建了一次。这意味着我在按下后返回时保留并使用旧环境中的屏幕。
要解决这个问题,我只需要更改它,以便每次访问枚举时都会创建一个新屏幕,而不是在开始时存储一个。