【问题标题】:libGDX Android white screen after back button pressed按下后退按钮后 libGDX And​​roid 白屏
【发布时间】: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


【解决方案1】:

原来问题与我管理屏幕的方式有关。我的 GdxGame 类中有一个方便的方法,它允许我根据 ScreenType 枚举切换屏幕。

在枚举中,根据枚举构造函数中的屏幕类,我将创建一个带有反射的新屏幕。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多