无法在 libGDX 中绘制加载屏幕
Unable to draw loading screen in libGDX
我目前正在尝试为游戏实现加载屏幕。
private enum STATE {
LOADING, START_MENU, PLAYING, PAUSE, GAME_OVER
}
private STATE state = STATE.LOADING;
这些是游戏状态,所以它以LOADING
开头,所以它可以运行渲染方法中的LOADING
情况。
public void show() {
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
.
的
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);
}
}
}
我有这段代码,它会根据加载所有资产的进度绘制所有相关的图块。
if (state == STATE.LOADING) {
layout.setText(loadingFont, LOADING_TEXT);
loadingFont.draw(batch, LOADING_TEXT, 0, layout.height);
}
左下角还有这个写loading
我已经注释掉了 START_MENU
状态,这样我就可以看到通常将用户转到 START_MENU
屏幕时的后台状态。它显示文本。 Loading...
,但它根本不显示背景。
我说不出我做错了什么。可以指导一下吗?
assetManager.finishLoading() 会阻塞,直到所有内容都加载完毕。这意味着您的 show() 方法在加载所有资产之前不会完成。
您应该在渲染方法中调用 assetManager.update() 而不是调用 finishLoading()。这允许加载您的资产,但也不会阻塞,因此您的渲染方法可以执行您想要的操作。
如果有更多资产要加载,update() 将 return false,当所有内容加载完成时为 true。所以你需要检查每次调用 update() 的结果并相应地进行。
我目前正在尝试为游戏实现加载屏幕。
private enum STATE {
LOADING, START_MENU, PLAYING, PAUSE, GAME_OVER
}
private STATE state = STATE.LOADING;
这些是游戏状态,所以它以LOADING
开头,所以它可以运行渲染方法中的LOADING
情况。
public void show() {
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
.
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);
}
}
}
我有这段代码,它会根据加载所有资产的进度绘制所有相关的图块。
if (state == STATE.LOADING) {
layout.setText(loadingFont, LOADING_TEXT);
loadingFont.draw(batch, LOADING_TEXT, 0, layout.height);
}
左下角还有这个写loading
我已经注释掉了 START_MENU
状态,这样我就可以看到通常将用户转到 START_MENU
屏幕时的后台状态。它显示文本。 Loading...
,但它根本不显示背景。
我说不出我做错了什么。可以指导一下吗?
assetManager.finishLoading() 会阻塞,直到所有内容都加载完毕。这意味着您的 show() 方法在加载所有资产之前不会完成。
您应该在渲染方法中调用 assetManager.update() 而不是调用 finishLoading()。这允许加载您的资产,但也不会阻塞,因此您的渲染方法可以执行您想要的操作。
如果有更多资产要加载,update() 将 return false,当所有内容加载完成时为 true。所以你需要检查每次调用 update() 的结果并相应地进行。