资产在处置和重新加载后不会被渲染
Assets wont get rendered after disposing and reloading them
在我的游戏中,我目前有两个屏幕。 MenuScreen
和 GameScreen
。通过菜单中的 Play 选项,玩家可以切换到 GameScreen 并开始游戏,使用 Escape 他可以返回到 MenuScreen。当我在 hide()
方法中切换到另一个屏幕时,我处理使用过的资产,并在我切换到的屏幕的构造函数中加载新屏幕所需的资产。问题是当我切换回来时,纹理和声音效果不是 rendered/played。
例如当我在 MenuScreen
开始游戏时,然后切换到 GameScreen
一切都很好。但是当我切换回 MenuScreen
时,MenuScreen
只是一个黑色的 window。当我再次切换到 GameScreen
时,它也是黑色的,除了 BitmapFont。
也许我处理这个问题的方式存在根本性缺陷。我试图从我 post 此处的代码中尽可能多地删除不必要的东西,但我担心它仍然太多了。
资源加载器Class:
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();
}
}
菜单屏幕Class:
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();
}
}
游戏画面Class:
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 Class:
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文章'managing your assets'。 AssetManagers 不应该是静态的。 'This typically would cause black/missing textures or incorrect assets.'
资产管理器处理掉后就不能再使用了。而是使用 manager.unload 卸载资产。 manager.unload("gfx/menuBackground.png");
编辑:
我也没有看到任何重写的 show() 方法。如果您想要取回您的资产,则每次都需要在屏幕的显示方法中加载您的资产。
在我的游戏中,我目前有两个屏幕。 MenuScreen
和 GameScreen
。通过菜单中的 Play 选项,玩家可以切换到 GameScreen 并开始游戏,使用 Escape 他可以返回到 MenuScreen。当我在 hide()
方法中切换到另一个屏幕时,我处理使用过的资产,并在我切换到的屏幕的构造函数中加载新屏幕所需的资产。问题是当我切换回来时,纹理和声音效果不是 rendered/played。
例如当我在 MenuScreen
开始游戏时,然后切换到 GameScreen
一切都很好。但是当我切换回 MenuScreen
时,MenuScreen
只是一个黑色的 window。当我再次切换到 GameScreen
时,它也是黑色的,除了 BitmapFont。
也许我处理这个问题的方式存在根本性缺陷。我试图从我 post 此处的代码中尽可能多地删除不必要的东西,但我担心它仍然太多了。
资源加载器Class:
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();
}
}
菜单屏幕Class:
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();
}
}
游戏画面Class:
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 Class:
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文章'managing your assets'。 AssetManagers 不应该是静态的。 'This typically would cause black/missing textures or incorrect assets.'
资产管理器处理掉后就不能再使用了。而是使用 manager.unload 卸载资产。 manager.unload("gfx/menuBackground.png");
编辑:
我也没有看到任何重写的 show() 方法。如果您想要取回您的资产,则每次都需要在屏幕的显示方法中加载您的资产。