【问题标题】:libgdx: asset manager block screen uilibgdx:资产管理器块屏幕用户界面
【发布时间】:2014-10-29 15:00:58
【问题描述】:

我使用AssetManager 加载游戏中的所有资源。 我在显示加载进度时遇到问题,或者我尝试在 LoadingScreen 渲染方法中使用此代码仅设置背景颜色。

    Gdx.gl.glClearColor(0.431f, 0.792f, 0.808f, 0xff / 255.0f);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

Everiting 加载良好,但是在加载时我得到黑屏,而不是 glClearColor 中设置的颜色。在实现类似this 示例的加载栏时也会发生同样的情况

这里是Assests类的一部分

    public class Assets implements Disposable, AssetErrorListener {

        public static final Assets instance = new Assets();
      .
      .
        public void init (AssetManager assetManager) {
            this.assetManager = assetManager;
        // set asset manager error handler
        assetManager.setErrorListener(this);
        // load texture atlas
        assetManager.load(Constants.TEXTURE_ATLAS_OBJECTS, TextureAtlas.class);
     .
     .
        TextureAtlas atlas = assetManager.get(Constants.TEXTURE_ATLAS_OBJECTS);
     .


   }  
     .


}

这是我LoadingScreen的简单代码:

    @Override
    public void show() {
        manager = new AssetManager();

        Assets.instance.init(manager);
   }

    public void render(float deltaTime) {
        Gdx.gl.glClearColor(0.431f, 0.792f, 0.808f, 0xff / 255.0f);//light blue
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        if (manager.update()) {
            ScreenTransition transition = ScreenTransitionFade.init(0.5f);
            game.setScreen(new HomeScreen(game), transition);
        }
}

在这里,我预计在加载资产时会显示浅蓝色空屏,但我得到了黑屏。

我猜有些代码会阻塞主线程,但我不知道如何解决这个问题。

感谢您的帮助

【问题讨论】:

  • “清理”部分没问题,可能问题出在其他地方。如果您在清洁部分工作后删除代码[您是否有非黑屏? ] ?
  • Assets.instance.init(manager); 阻止了我的 UI。如果我在清理部分后删除代码相同(加载时黑屏)。有什么建议吗?

标签: android libgdx


【解决方案1】:

确保您知道何时调用 Screen.show()Screen.render(float delta)

Screen.show():当你调用Game.setScreen()时被调用。

Screen.render(float delta)Screen.show()完成后连续调用。因此,在加载过程中Screen.show() 尚未完成,并显示默认背景(黑色)。

为了避免单独的线程会很好。 AssetManager 来了,它异步加载东西。现在我们只有正确使用它了:

打电话给AssetManager.load(<your assets>)你打电话给Game.setScreen(<Loading Screen>)。然后直接调用LoadingScreen.render(float delta) 并查看您的背景。要检查加载是否完成,您可以使用AssetManager.update(),如果完成则返回 true,否则返回 false。

【讨论】:

  • 谢谢,我在public class MyGame extends DirectedGame {} 中致电setScreen(LoadingScreen)。如果我在 MyGame 类的`create()` 上调用Assets.instance.init(manager);,在哪里检查资产是否已加载(update())?在 LoadingScreen update() 方法中?我尝试了这个但没有再次工作,不是我认为MyGame类中显示黑屏
  • 在我的实现中,我在LoadingScreeen.render() 中检查AssetManager.update(),如果所有加载完成,则切换到新屏幕。
  • 你在哪里打电话给Assets.instance.init(manager);?在加载屏幕中? tnx
  • 我会在 setScreen(loadingScreen) 之前调用.init()。我想我知道你的问题是什么:assetManager.load() 异步加载你的东西。但是.init() 方法的其余部分需要加载这些东西,因此要等到加载完成。我建议您重新构建您的 init() 方法,使其仅包含异步加载内容。然后在您的渲染方法中检查assetManager.update(),直到加载完成,然后分配您的TextureAtlas。详细分析需要看完整的.init()方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 2015-02-03
  • 2016-09-12
  • 1970-01-01
相关资源
最近更新 更多