2016-09-09 28 views
0

所以我不確定我在做什麼錯誤,並且我一直在這一點上停留了很長時間。我在爲一個小型遊戲設計一個花哨的加載屏幕而混亂。 (雖然是不需要的,但因爲我還在練決定先走,並添加一個反正)無法在libGDX中繪製加載屏幕

下面是相關代碼的問題:

//Game states 
    private enum STATE 
    { 
     LOADING, START_MENU, PLAYING, PAUSE, GAME_OVER 
    } 
    private STATE state = STATE.LOADING; 

這些都是gamestates,所以它從LOADING開始,因此它可以在渲染方法中運行LOADING案例。

public void show() 
    { 
//Setting up AssetManager 
     startMenuBackground = new Texture(Gdx.files.internal("startMenuBackground.png")); 
     startMenuBackgroundSplit = new TextureRegion(startMenuBackground).split(32, 32); 
     assetManager = new AssetManager(); 
     for(int appleImage = 0; appleImage < apple.length; appleImage++) 
     { 
      assetManager.load("bits/" + appleImage + ".png", Texture.class); 
     } 
     for(int bodyImage = 0; bodyImage < snakeBody.length; bodyImage++) 
     { 
      assetManager.load("body/" + bodyImage + ".png", Texture.class); 
     } 
     for(int backgroundImage = 0; backgroundImage < background.length; backgroundImage++) 
     { 
      assetManager.load("background/" + backgroundImage + ".png", Texture.class); 
     } 
     assetManager.load("KappaMan.png", Texture.class); 
     assetManager.load("playButton/0.png", Texture.class); 
     assetManager.load("playButton/1.png", Texture.class); 
     assetManager.load("title.png", Texture.class); 
     assetManager.load("AmenoSandstorm.mp3", Music.class); 
     assetManager.load("beMad.mp3", Music.class); 
     assetManager.load("collide.mp3", Music.class); 
     assetManager.finishLoading(); 

所以,這是顯示方法的啓動,它加載了我的所有遊戲資源。

startMenuBackgroundSplit = new TextureRegion(startMenuBackground).split(32, 32); 

這部分對這個問題特別重要,因爲它是我如何顯示遊戲加載的進度。 (這是不工作的一部分,我得到一個黑色的屏幕。)

case LOADING: 
      { 
       if(assetManager.update()) 
       { 
        state = STATE.START_MENU; 
       } 
       else 
       { 
        progress = assetManager.getProgress(); 
        tilesToLoad = 576 * progress; 
        tilesY = (int)tilesToLoad/32; 
        tilesX = (int)tilesToLoad % 32; 
       } 
       break; 
      } 

現在我開始加載所有資產進行遊戲,而它運行負荷。所以如果它是真的,它會去START_MENU,如果不是,那麼它會檢查進度。 tilesY是我需要加載startMenuBackground的行數,tilesX是我需要在startMenuBackgroundSplit的最後一行進行加載的tile的數量。

if(state == STATE.LOADING) 
     { 
      for(int tilesYLoad = 0; tilesYLoad < tilesY; tilesYLoad++) 
      { 
       if(tilesYLoad != tilesY - 1) 
       { 
        for(int tilesXLoad = 0; tilesXLoad < 32; tilesXLoad++) 
        { 
         batch.draw(startMenuBackgroundSplit[tilesXLoad][tilesYLoad], tilesXLoad * 32, tilesYLoad * 32); 
        } 
       } 
       else 
       { 
        for(int tilesXLoad = 0; tilesXLoad < tilesX; tilesXLoad++) 
        { 
         batch.draw(startMenuBackgroundSplit[tilesXLoad][tilesYLoad], tilesXLoad * 32, tilesYLoad * 32); 
        } 
       } 
      } 
     } 

終於在batch.begin()之後的render方法中; 我有這個代碼,將根據加載所有資產的進度繪製所有相關的瓷磚。

if(state == STATE.LOADING) 
     { 
      layout.setText(loadingFont, LOADING_TEXT); 
      loadingFont.draw(batch, LOADING_TEXT, 0, layout.height); 
     } 

還有這個在左下方寫加載。

現在我已經做出了將gamestate更改爲START_MENU的部分,如果進度完成了評論。所以我知道遊戲何時啓動,在去START_MENU之前,它會加載文本。 「Loading ...」,但它根本不加載背景?它只是黑色。

我不知道我做錯了什麼。有任何想法嗎?

回答

1

assetManager.finishLoading()阻塞,直到加載所有內容。這意味着你的show()方法不會完成,直到你的所有資產都被加載完畢。

而不是調用finishLoading(),您應該在render方法中調用assetManager.update()。這可以讓你的資產加載,但也不會阻塞,所以你的渲染方法可以做你想做的。

如果需要加載更多資源,則update()將返回false,並且在加載完成時都返回true。所以你需要檢查每次調用的結果update()並相應地繼續。

+0

謝謝!這有幫助,雖然在做之前,如你所說,我不得不做一個新的方法,我叫assignAssets(),在show方法我知道加載所有資產!當assetManager.update()返回true時,在轉到START_MENU之前,它會分配所有資產。 :) –