所以我不确定自己做错了什么,而且我已经被困在这一点上已经有一段时间了。我正试图为一个小游戏制作一个花哨的加载屏幕。 (虽然不需要,但我仍在练习,决定继续添加一个。)
以下是问题的相关代码:
//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;但它根本不加载背景?它只是黑色。
我不知道我做错了什么。有什么想法吗?
答案 0 :(得分:1)
assetManager.finishLoading()阻塞,直到加载完所有内容。这意味着在加载所有资源之前,show()方法将无法完成。
您应该在render方法中调用assetManager.update(),而不是调用finishLoading()。这允许加载您的资产,但也不会阻止,因此您的渲染方法可以执行您想要的操作。
如果要加载更多资源,update()将返回false,并且在加载完所有内容时返回true。因此,您需要检查每次调用update()的结果并相应地继续。