Невозможно нарисовать загрузочный экран в libGDX
Так что я не уверен, что я делаю неправильно, и я застрял в этой точке довольно долгое время. Я бездельничаю, пытаясь сделать модный экран загрузки для маленькой игры. (Хотя это и не нужно, но, так как я все еще практикую, решил все равно добавить и добавить.)
Вот соответствующий код к вопросу:
//Game states
private enum STATE
{
LOADING, START_MENU, PLAYING, PAUSE, GAME_OVER
}
private STATE state = STATE.LOADING;
Это игровые состояния, поэтому он начинается с 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();
Итак, это начало метода 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;
}
Теперь я начинаю загружать все ресурсы для игры, пока она запускается ЗАГРУЗКА. Так что, если это правда, он перейдет к START_MENU, если нет, то он проверит прогресс. tileY - это количество строк, которое мне нужно загрузить из startMenuBackground, tileX - это количество плиток, которое мне нужно загрузить в нижнем ряду, каков был прогресс 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);
}
Есть также это, чтобы написать загрузку внизу слева.
Теперь я сделал часть, которая изменила игровое состояние на START_MENU, если прогресс завершен, в комментарии. Итак, я знаю, когда игра запускается, прежде чем перейти к START_MENU, она загружает текст. "Загрузка...", но это не загружает фон вообще? Это просто черный.
Я не могу сказать, что я сделал неправильно. Есть идеи?
1 ответ
assetManager.finishLoading() блокируется, пока все не будет загружено. Это означает, что ваш метод show () не завершится, пока все ваши ресурсы не будут загружены.
Вместо того чтобы вызывать finishLoading (), вы должны вызывать assetManager.update() внутри вашего метода рендеринга. Это позволяет загружать ваши ресурсы, но также не блокирует их, поэтому ваш метод рендеринга может делать то, что вы хотите.
update() вернет false, если есть еще ресурсы для загрузки, и true, когда все будет загружено. Поэтому вам нужно будет проверять результат каждого вызова update() и действовать соответствующим образом.