无法在libGDX

时间:2016-09-09 17:46:23

标签: java libgdx textures loading asset-management

所以我不确定自己做错了什么,而且我已经被困在这一点上已经有一段时间了。我正试图为一个小游戏制作一个花哨的加载屏幕。 (虽然不需要,但我仍在练习,决定继续添加一个。)

以下是问题的相关代码:

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

这些是游戏状态,所以它从LOADING开始,因此它可以在render方法中运行LOADING case。

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方法的开始,它加载我游戏的所有资产。

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;
            }

现在我开始加载游戏的所有资源,同时运行LOADING。所以如果它是真的,它将转到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);
        }

还可以在左下方写入加载。

现在,如果进展完成,我已经制作了将游戏状态更改为START_MENU的部分。所以我知道游戏何时启动,在转到START_MENU之前,它会加载文本。 &#34;加载中&#34;但它根本不加载背景?它只是黑色。

我不知道我做错了什么。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

assetManager.finishLoading()阻塞,直到加载完所有内容。这意味着在加载所有资源之前,show()方法将无法完成。

您应该在render方法中调用assetManager.update(),而不是调用finishLoading()。这允许加载您的资产,但也不会阻止,因此您的渲染方法可以执行您想要的操作。

如果要加载更多资源,

update()将返回false,并且在加载完所有内容时返回true。因此,您需要检查每次调用update()的结果并相应地继续。