java - Assets 在处置和重新加载后不会被渲染

标签 java libgdx assets

在我的游戏中,我当前有两个屏幕。 MenuScreenGameScreen。通过菜单中的“播放”选项,玩家可以切换到游戏屏幕并开始游戏,然后使用“退出”可以返回到菜单屏幕。当我在 hide() 方法中切换到另一个屏幕时,我会处理使用过的资源,并在我切换到的屏幕的构造函数中加载新屏幕所需的资源。问题是当我切换回来时,纹理和声音效果不会渲染/播放。 例如,当我在 MenuScreen 中启动游戏,然后切换到 GameScreen 时,一切都很好。但是,当我切换回 MenuScreen 时,MenuScreen 只是一个黑色窗口。当我再次切换到 GameScreen 时,除了 BitmapFont 之外,它也是黑色的。 也许我处理这件事的方式存在根本性缺陷。我试图从我在这里发布的代码中删除尽可能多不必要的东西,但我担心它仍然太多了。

资源加载器类:

public class RessourceLoader {

    public static AssetManager manager;


    public static void create() {
        manager = new AssetManager();
    }

    public static void loadMenuScreen() {
        manager.load("gfx/menuBackground.png", Texture.class);
    }

    public static void getMenuScreen() {
        menuBackground = manager.get("gfx/menuBackground.png", Texture.class);
    }

    public static void disposeMenuScreen() {
        menuBackground.dispose();
    }

    public static void loadGameScreen() {
        // load GameScreen Assets through AssetManager
    }

    public static void getGameScreen() {
        // get GameScreen Assets through AssetManager
    }

    public static void disposeGameScreen() {
        // dispose all GameScreen Assets
    }

    public static void dispose() {
        manager.dispose();
    }
}

菜单屏幕类:

public class MenuScreen implements Screen {

    // Game starts in the MenuScreen

    // Instance of game
    private PHGame game;
    // Orthographic camera
    private OrthographicCamera cam;

    public MenuScreen(PHGame phGame) {
        game = phGame;      
        RessourceLoader.loadMenuScreen();
        RessourceLoader.manager.finishLoading();
        RessourceLoader.getMenuScreen();

        cam = new OrthographicCamera();
        cam.setToOrtho(true, 640, 480);

        game.batcher.setProjectionMatrix(cam.combined);
    }

    @Override
    public void render(float delta) {

        // Fills background with black to avoid flickering
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        // Begin Drawing
        game.batcher.begin();      

        // Draw Menu

        // Stop drawing
        game.batcher.end();

        // Pressing Space confirms currently selected menu item
        if (GameKeys.isPressed(GameKeys.SPACE)) {
            game.setScreen(new GameScreen(game));
        }

        // Update Key Presses
        GameKeys.update();
    }

    @Override
    public void hide() {
        dispose();
    }

    @Override
    public void dispose() {
        RessourceLoader.disposeMenuScreen();
    }
}

游戏屏幕类:

public class GameScreen implements Screen {

    // Instance of game
    private PHGame game;

    private GameWorld world;
    private GameRenderer renderer;
    private float runTime;


    public GameScreen(PHGame phGame) {
        game = phGame;
        RessourceLoader.loadGameScreen();
        RessourceLoader.manager.finishLoading();
        RessourceLoader.getGameScreen();
        world = new GameWorld(game, this);
        renderer = new GameRenderer(world, game);
    }

    @Override
    public void render(float delta) {
        // runTime is the amount of time the game is running
        runTime += delta;
        // Updates the Game World
        world.update(delta);
        // Renders everything
        renderer.render(runTime);
        // Update Key Presses
        GameKeys.update();
    }

    @Override
    public void hide() {
        dispose();
    }

    @Override
    public void dispose() {
        RessourceLoader.disposeGameScreen();
    }
}

GameRenderer 类:

public class GameRenderer {

    // Instance of PHGame
    PHGame game;
    // Instance of Game World
    private GameWorld world;
    // Orthographic Camera
    private OrthographicCamera cam;

    // If true hitbox's will be shown
    private boolean showHitbox;

    // Game Objects
    private Player player;

    public GameRenderer(GameWorld world, PHGame game) {
        this.game = game;
        this.world = world;
        player = world.getPlayer();
        cam = new OrthographicCamera();
        cam.setToOrtho(true, 640, 480);
        showHitbox = false;

        game.batcher.setProjectionMatrix(cam.combined);
    }

    public void render(float runTime) {
        // draw objects and hud      
    }
}

如果对我的问题有任何疑问,我会尽力回答。

最佳答案

请参阅 github 文章“管理您的 Assets ”。 AssetManager 不应该是静态的。 “这通常会导致黑色/缺失纹理或不正确的资源。”

在您处置 Assets 管理器后,它就无法再使用。而是使用 manager.unload 卸载 Assets 。 manager.unload("gfx/menuBackground.png");

编辑:

我也没有看到任何重写的 show() 方法。如果您希望恢复 Assets ,则每次都需要在屏幕的显示方法中加载 Assets 。

关于java - Assets 在处置和重新加载后不会被渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32800735/

相关文章:

java - LibGDX - Scene2D 平移

java - 控制 Sprite 旋转(它疯狂地旋转)

android - libgdx如何让图像占据整个屏幕?

ios - xcode 中的全屏图像大小和命名

image - Symfony 2 Assets 图片

CakePHP:处理 Assets 缩小/组合的最佳方法?

java - java中如何在字符串中填充空格?

java - JSP页面无法从资源文件夹获取Bootstrap文件-IntelliJ

java - Apache beam Dataflow SDK 错误示例

java - 如何将有界任务流渲染到弹出窗口中