如何在Libgdx中处理精灵?

时间:2016-12-27 17:16:09

标签: android libgdx

搜索之后,我发现Sprite是Libgdx中TextureRegion的子类。 那么如何处置Sprite对象?

public void create() {
    batch = new SpriteBatch();
    sprite = new Sprite(new Texture("pizza.jpg"));


}

@Override
public void render() {
    Gdx.gl.glClearColor(0,0,0,1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    batch.begin();

    batch.end();

}

@Override
public void dispose() {
    batch.dispose();
    sprite.getTexture().dispose();

这是正确的方法吗?提前谢谢!

1 个答案:

答案 0 :(得分:1)

正如你所说,Sprite类本身没有dispose方法,因此你将如何处理Sprite的纹理。

但是,更好的方法是使用AssetManager class加载纹理并处理它。这样做可以让您在一个地方管理所有纹理(因此,如果需要,可以在程序退出时一次性处理它们。)

以下是我正在进行的游戏中的一个示例:

public class Controller extends Game {
    @Override
    public void create () {
        // Some loading stuff ...

        // Initialize the asset manager
        // TODO: Make a snazzy loading bar
        assetManager = new AssetManager();
        assetManager.load(ATLAS_NAME, TextureAtlas.class);
        assetManager.finishLoading();

        // Other loading stuff...
    }

    // Other methods snipped for space reasons...

    @Override
    public void dispose () {
        // I dispose of things not managed by the asset manager...

        // Dispose of any other resources
        assetManager.dispose();
    }

/**
     * Convenience method to safely load textures. If the texture isn't found, a blank one is created and the error is logged.
     * @param imageName The name of the image that is being looked up.
     * @return
     */
    public TextureRegionDrawable getManagedTexture(String imageName) {
        try {
            return new TextureRegionDrawable(assetManager.get(ATLAS_NAME, TextureAtlas.class).findRegion(imageName));
        } catch(Exception e) {
            Gdx.app.error(getClass().getSimpleName(), "Couldn't get managed texture.", e);
            return getEmptyTexture();
        }
    }
    public TextureRegionDrawable getEmptyTexture() {
        return new TextureRegionDrawable(new TextureRegion(new Texture(new Pixmap(1,1, Pixmap.Format.RGBA8888))));
    }
}

不可否认,我创建了一个时髦的方法来包装资产管理器,这样我总能得到一个纹理(即使它是空白的),但资产管理器的正常使用就像这样简单:

Texture tex = assetManager.get("my/texture/name.png", Texture.class);

它也适用于其他类,如Atlases和Skins。