java - 无法在 libGDX 中绘制加载屏幕

标签 java libgdx textures loading asset-management

我目前正在尝试实现游戏的加载屏幕。

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时加载游戏的所有资源。因此,如果为 true,它将转到 START_MENU,如果不是,则会检查进度。 tilesY 是我需要加载 startMenuBackground 的行数,tilesX 是我需要加载的图 block 数量底行显示 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);
        }
    }
}

我有这段代码,它将根据加载所有资源的进度绘制所有相关的图 block 。

if (state == STATE.LOADING) {
    layout.setText(loadingFont, LOADING_TEXT);
    loadingFont.draw(batch, LOADING_TEXT, 0, layout.height);
}

左下角还有这个写加载。

我已经注释掉了 START_MENU 状态,因此我可以在正常情况下将用户转发到 START_MENU 屏幕时看到后台的状态。它显示文本。 正在加载...,但它根本不显示背景。

我不知道我做错了什么。能给我指导吗?

最佳答案

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

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

如果有更多资源需要加载,update() 将返回 false,当所有内容加载完成时,update() 将返回 true。因此,您需要检查每次调用 update() 的结果并进行相应操作。

关于java - 无法在 libGDX 中绘制加载屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39417107/

相关文章:

java - jqGrid不显示来自java的Json数据

java - Spring Maven 项目 commons-logging LogFactory NoClassDefFoundError

java - 纹理区域 2D 数组 - 为什么我的 Sprite 画得这么小?

libgdx - 输入处理器空指针异常

image - 在 html5 中绘制图像/纹理

java - 如何修复此错误 : java. lang.NoSuchMethodError: 'java.lang.AutoCloseable org.mockito.MockitoAnnotations.openMocks(java.lang.Object)'

java - 为什么可以在 Kotlin 的类之外编写函数?

java - 如何将 Chartboost 依赖项添加到我的 LibGDX 项目?

Three.js 将纹理设置为内联 svg

opengl - 为什么我的纹理在使用 Sampler2D 将其渲染到表面上后进行插值