2014-05-01 38 views
1

我正在从事使用libGDX框架的Android游戏,同时学习了他们的wiki和Learning Libgdx Game Development书。本书的作者定义了一个Assets类来使用AssetManager加载游戏资产。每次游戏重新开始时,需要重新加载资源,以便使用对Assets.intance.init(新的AssetManager())的调用来重新加载资源并创建新对象来存储纹理引用。重新加载简历中的资产

当我在我的游戏中执行此操作后,所有我拥有的都是黑盒子,我有很好的纹理,所以我想这里的问题是我使用旧的参考。我把这里的部分从书的代码:

AssetManager#初始化

public void init(AssetManager assetManager) { 

    /* Dispose previous asset manager */ 
    if (this.assetManager != null) { 
     this.assetManager.dispose(); 
    } 

    this.assetManager = assetManager; 

    assetManager.setErrorListener(this); 
    assetManager.load(Constants.TEXTURE_ATLAS, TextureAtlas.class); 

    /* Start loading assets and wait until finished */ 
    assetManager.finishLoading(); 

    Array<String> assetNames = assetManager.getAssetNames(); 
    Gdx.app.debug(TAG, "Assets loaded: " + assetNames.size); 
    for (String assetName : assetNames) { 
     Gdx.app.debug(TAG, "Asset: " + assetName); 
    } 

    TextureAtlas atlas = assetManager.get(Constants.TEXTURE_ATLAS); 

    /* Create game resource objects. Here I get what I need from the atlas */ 
    player = new AssetPlayer(atlas); 
    enemy = new AssetEnemy(atlas); 
} 

当我创建我的游戏我OBJETS使用Assets.instance.player和Assets.instance.enemy存储参考作为本书作者的纹理,这可能是问题所在。事情是,重新阅读这本书后,我看不出他是如何解决这个问题的。

我很确定我能解决游戏对象中改变引用的问题,但所有的东西都变得如此混乱。我真正的问题是,我应该如何在游戏中管理游戏资产?我一直在寻找很多游戏示例,但其中大多数不使用AssetManager,而是将静态变量用于纹理。

我应该在游戏对象中保留纹理的引用吗?真的有必要在简历上重新加载资产?当所有对象都在不知道何时恢复游戏的worldController中时,我怎么能在我的游戏对象中重新加载纹理?

回答

3

就我所知,在这个级别上你做得正确。你确实需要重新加载纹理,因为你的OpenGL上下文丢失了,所有进入OpenGL内部状态的“指针”都是陈旧的。

正如你指出的那样,因为你的AssetManager.player属性指向一个新的对象,缓存一个旧指针的任何东西在重新启动后都是陈旧的,这可能是你的问题的根源。 (虽然很难说肯定)

如果你看看Libgdx SuperJump演示,他们还会将所有资产指针都缓存在静态字段中,但请注意,render调用在每次调用时都会有效地查找纹理。见WorldRenderer.renderBob()。另一种方法是在(重新)加载资产之后通过对象进行传递,让他们“刷新”他们使用的资产的指针。

+0

感谢您的回答。我也有一个世界渲染器,但所有的游戏对象都有一个渲染方法,所以我在他们的类中保留了对它们纹理的引用(我总是需要一个来存储当前的动画)。我必须添加一个刷新方法来获取我的WorldController中的新引用和另一个刷新方法,因为此类存储了所有对我的游戏对象(或WorldRenderer中的引用,因为有对WordController的引用)的引用。我不喜欢这个解决方案,但如果我想保持我的代码清洁,这是必要的。我想在资产类中做到这一点,但这是不可能的... –