我正在进行一些测试,发现在我的Nexus 5上,当我按下返回键(或主页键) - 也就是说,当上下文发生改变时 - 并且我回到游戏时,openGL上下文会丢失。
没有纹理了(它们显示为黑色),UI的皮肤也没有了(按钮是白色的)。
我以为这会被libgdx自动管理,对吧?那么为什么会发生这种情况?
我通过TextureAtlas创建纹理,像这样:
代码只是展示纹理的使用,其他部分已被移除。
没有纹理了(它们显示为黑色),UI的皮肤也没有了(按钮是白色的)。
我以为这会被libgdx自动管理,对吧?那么为什么会发生这种情况?
我通过TextureAtlas创建纹理,像这样:
TextureAtlas atlas;
TextureRegion bg;
atlas = new TextureAtlas(Gdx.files.internal("mainMenu.atlas"));
bg = atlas.findRegion("bg");
然后它与batch.draw(bg, x, y, w, h);
一起使用。
我还尝试着创建一个TextureRegion
,直接加载一个纹理而不是TextureAtlas
(只是为了确认这问题是否出在TextureAtlas
),但我得到的结果还是一样的......
有人能解决吗?
编辑:更具体的代码:
屏幕类基础:
public class MainMenuScreen extends ScreenManager.Screen {
private Game game;
private InputMultiplexer inputMultiplexer = new InputMultiplexer();
private MainMenuUi screenUi;
private MainMenuView screenView;
private TextureAtlas atlas;
public MainMenuScreen(ConbiniGame game) {
this.game = game;
atlas = new TextureAtlas(Gdx.files.internal("mainMenu.atlas"));
screenUi = new MainMenuUi(game);
screenView = new MainMenuView(atlas);
inputMultiplexer.addProcessor(screenUi.getInputProcessor());
inputMultiplexer.addProcessor(screenView.getInputProcessor());
Gdx.input.setInputProcessor(inputMultiplexer);
}
// ...
}
在MainMenuView类中,使用了TextureAtlas...
public class MainMenuView {
private Stage stage;
private OrthographicCamera camera;
private Viewport viewport;
private TextureAtlas atlas;
TextureRegion bg;
public MainMenuView(TextureAtlas atlas) {
atlas = atlas;
bg = atlas.findRegion("bg");
camera = new OrthographicCamera();
camera.setToOrtho(false);
viewport = new FitViewport(1080, 1920, camera);
stage = new Stage(viewport);
}
public void update(float delta) {
stage.act(delta);
}
public void render() {
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
stage.getBatch().begin();
stage.getBatch().draw(bg, 0, 0, stage.getCamera().viewportWidth, stage.getCamera().viewportHeight);
stage.getBatch().end();
stage.draw();
}
public InputProcessor getInputProcessor() {
return stage;
}
}
代码只是展示纹理的使用,其他部分已被移除。
resume
方法中,您不需要重新加载资源。更重要的是,仅调用AssetManager#finishLoading()
在resume
方法中将没有任何效果,该调用不会重新加载任何内容。LibGDX 会根据需要为您重新加载它们。但是,当 libGDX 这样做时,您可以显示一个加载屏幕。在这种情况下,您需要调用Texture.setAssetManager
,然后自己处理更新,请参见:https://github.com/libgdx/libgdx/wiki/Managing-your-assets#resuming-with-a-loading-screen - Xoppa