Android上的乱码纹理

时间:2014-06-09 19:06:51

标签: android libgdx

是的,我知道,之前已经问过这个问题。我已经阅读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
            }
        }
    }

我做得不好?怎么做才能避免纹理乱码?我真的需要帮助。

谢谢。

1 个答案:

答案 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();
    }
}

正如我所说,不是很优雅,可能有更好的方法,但这很有效。