2016-09-09 7 views
0

그래서 내가 뭘 잘못하고 있는지, 그리고 꽤 오랫동안이 시점에서 붙어 있습니다. 나는 작은 게임을위한 멋진로드 스크린을 만들려고 노력하고있다. 그 때문에, 이들은 gamestates 있습니다libGDX에서 로딩 화면을 그릴 수 없습니다

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

: (.이 필요하지 않습니다하지만 난 아직도 가서 어쨌든 하나를 추가하기로 결정 연습 해요로하지만) 여기

는 관련 질문에 코드입니다 는 LOADING으로 시작하여 render 메소드에서 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(); 

그래서 내 모든 자산을 게임에로드하는 show 메소드가 시작되었습니다.

이 부분은 게임 로딩 진행 상황을 표시하는 방식으로이 질문에 특히 중요합니다. (작동하지 않는 일부입니다, 나는 검은 화면을 얻을.)

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의 진행률을 맨 아래 행에로드해야하는 타일 수입니다.

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(); 모든 자산을로드하는 진행 상황에 따라 모든 관련 타일을 그릴 코드가 있습니다.

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로 이동하기 전에 모든 자산을 할당합니다. :) –