搜索之后,我发现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();
这是正确的方法吗?提前谢谢!
答案 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。