2016-08-16 69 views
1

我遇到了libGDX的问题,当我退出后按钮后恢复应用程序时,我只能看到一个白色屏幕。libGDX按下后退按钮后的Android白屏

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

我已阅读,保持对纹理的静态引用可能会导致此问题,但我不这样做。

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

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重新创建时,闪屏被重新打开(如白色),并且AssetManager更新,直到所有的资产被重新加载(约需2秒钟)。

所以当应用程序重新打开时,新的AssetManager正在加载所有必要的纹理,但由于某些原因,一切仍然是白色的。

它可能与我如何从我的UI和游戏类访问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

如果你向我们展示splashscreen class,那会很好。你不使用暂停和恢复事件吗? –

+0

@DenizYılmaz我会添加。我使用暂停和恢复事件,但不是任何与资产有关的事情。在这些事件中应该与资产有关吗?我将添加SplashScreen类。 – grimrader22

+0

你正在讨论恢复应用程序,所以我很确定你必须使用简历事件。另外你提到你创建新的assetmanager,但是我没有在任何assetmanager教程中看到。 我想你可以使用 this.assets;而不是 ((GdxGame)Gdx.app.getApplicationListener())。assets; –

回答

1

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

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

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

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