在我的游戏中,我当前有两个屏幕。 MenuScreen
和 GameScreen
。通过菜单中的“播放”选项,玩家可以切换到游戏屏幕并开始游戏,然后使用“退出”可以返回到菜单屏幕。当我在 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/