【发布时间】:2016-08-16 17:49:05
【问题描述】:
我在使用 libGDX 时遇到问题,当我使用后退按钮退出后恢复应用程序时,我只看到一个白屏。
实际的应用程序运行,接受触摸输入,并播放声音,但屏幕只是白色的。
我已经读过保持对纹理的静态引用可能会导致这个问题,但我没有这样做。
以下是我的资产代码工作原理的简化版本。
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();
}
}
【问题讨论】:
-
如果您向我们展示闪屏类会很棒。而且您不使用暂停和恢复事件吗?
-
@DenizYılmaz 我会添加它。我确实使用暂停和恢复事件,但与资产无关。这些事件中是否应该与资产有关?我将添加 SplashScreen 类。
-
您正在谈论恢复应用程序,所以我很确定您必须使用恢复事件。您还提到您创建了新的资产管理器,但我在任何资产管理器教程中都没有看到。我想你可以使用 this.assets;而不是 ((GdxGame) Gdx.app.getApplicationListener()).assets;
-
@DenizYılmaz 好吧,一个新的 AssetManager 被创建,因为 GdxGame.onCreate() 被生命周期再次调用,所以它重新执行整个过程。我不能使用 this.assets 因为 getAssets() 是一个静态方法,所以这不起作用。整个 getApplicationListener() 演员阵容本质上是一样的。
-
你确定在恢复时调用 oncreate() 吗?因为当你按下后退按钮时,我的 libgdx 游戏并没有完全关闭它实际上只是暂停。当我看到 onCreate 时,我感到很惊讶。不是安卓方法吗?
标签: java android opengl-es libgdx assets