是的,我知道,之前已经问过这个问题。我已经阅读this和其他一些答案,但仍然无法找到正确的方法。
我有一个小型游戏应用程序,我们说,两个屏幕 - MainMenu和GameScreen。皮肤是在主类(我的MainGameClass)中从头开始创建的。然后我将对主类的引用传递给每个屏幕,并使用 getSkin 引用。在MenuScreen中,在backPress上我执行 Gdx.app.exit()处理皮肤,一切正常。问题是如果我在GameScreen中使用主页按钮,它应该用一块电路板加载游戏内容并且电路板上有一些图像。重新启动游戏后,所有纹理看起来都很糟糕。
好。我做了什么? 首先,我有一个带有非静态皮肤的单一SkinManager。坏。
然后我试图在每个班级只放置所需的皮肤部分。结果相同。
现在我在屏幕中的每个 hide()方法中调用 dispose(),以便在每次更改屏幕时清除对皮肤/纹理的所有引用。每次我打电话给 getSkin()我都会在创建之前处理它,但仍然无效。
MainClass:
public Skin getSkin() {
skin.dispose();
createSkin();
return skin;
}
@Override
public void dispose() {
skin.dispose();
}
的MainMenu:
Gdx.input.setCatchBackKey(true);
InputProcessor backProcessor = new InputAdapter() {
@Override
public boolean keyDown(int keycode) {
if ((keycode == Keys.ESCAPE) || (keycode == Keys.BACK) ) {
dispose();
Gdx.app.exit();
}
return false;
}
};
然后:
@Override
public void hide() {
dispose();
}
@Override
public void dispose() {
skin.dispose();
stage.dispose();
}
GameScreen:
@Override
public void resume() {
skin = ((MainClass) game).getSkin();
}
@Override
public void hide() {
dispose();
}
@Override
public void dispose() {
board.dispose();
skin.dispose();
stage.dispose();
}
当我再次尝试切换到MainMenu时,我无法调用dispose,这会抛出这样的异常:
java.lang.IllegalArgumentException: buffer not allocated with newUnsafeByteBuffer or already disposed
at com.badlogic.gdx.utils.BufferUtils.disposeUnsafeByteBuffer(BufferUtils.java:278)
at com.badlogic.gdx.graphics.glutils.VertexArray.dispose(VertexArray.java:71)
at com.badlogic.gdx.graphics.Mesh.dispose(Mesh.java:673)
at com.badlogic.gdx.graphics.g2d.SpriteBatch.dispose(SpriteBatch.java:1099)
at com.badlogic.gdx.scenes.scene2d.Stage.dispose(Stage.java:715)
at com.xxx.yyy.screens.GameScreen.dispose(GameScreen.java:315)
和第315行是 stage.dispose()在dispose方法中,所以我对它进行了评论。
在我的Board课程中,我创建了这样的dispose方法:
public void dispose() {
boardSkin.dispose();
for (int i = 0; i < boardSize; i++) {
for (int j = 0; j < boardSize; j++) {
// dispose the skin references for every object and texture objects on the board
}
}
}
我做得不好?怎么做才能避免纹理乱码?我真的需要帮助。
谢谢。
答案 0 :(得分:0)
好吧,我会解释我是如何做到的,以及对我有用的东西。可能这不是最好的方法,但这不会给我带来太多问题。
首先 - skin,public和static,在我的Main应用程序类中创建,并在简历中重新创建:
public class MainClass{
public static Skin skin;
@Override
public void create() {
...
createSkin();
...
}
...
@Override
public void dispose() {
skin.dispose();
}
@Override
public void resume() {
createSkin();
}
public static void createSkin() {
skin = new Skin();
// all the textures from images:
Texture texture1 = new Texture(Gdx.files.internal("data/texture1.img"));
skin.add("texture1", texture1);
...
}
}
在我的屏幕中,皮肤可通过以下方式访问:
MainClass.skin.bla-bla-bla;
在android活动中,在重启时重新创建皮肤:
public class MainActivity extends AndroidApplication {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
}
@Override
protected void onRestart() {
super.onRestart();
MainClass.createSkin();
}
}
正如我所说,不是很优雅,可能有更好的方法,但这很有效。