2014-05-01 70 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的引用)的引用。我不喜歡這個解決方案,但如果我想保持我的代碼清潔,這是必要的。我想在資產類中做到這一點,但這是不可能的... –