LIBGDX AssetManager

De MediaWiki
Ir a la navegación Ir a la búsqueda

UNIDADE 3: AssetManager

Introdución

Nota: Esta explicación está relacionada cos gráficos.




Información na wiki: https://github.com/libgdx/libgdx/wiki/Managing-your-assets


O obxectivo desta clase:

  • Impedir que o dispositivo móbil dea un Not Responding. Isto se pode producir se temos unha cantidade de gráficos moi alta e os cargamos como ata o de agora. A carga dos gráficos se fai no fío principal da aplicación.
  • Pode realizar unha carga asíncrona dos gráficos. Desta forma podemos ter unha pantalla de carga cunha barra de progreso para facer o xogo máis amigable.


Esta clase só debería usarse cando o tamaño conxuntos de todos os gráficos sexa elevado.

Pasos para utilizar a clase AssetManager

  • Primeiro debemos crear o obxecto AssetManager:
1 private AssetManager assetManager;
2 ..........
3 
4 assetManager = new AssetManager();


  • Despois temos que indicarlle o que queremos cargar.
Isto se fai chamando ó método load.
		assetManager.load("LIBGDX_asset_mapa1.png", Texture.class);
- O primeiro parámetro é o nome do gráfico a cargar.
- O segundo parámetro é a clase de gráfico a cargar. Entre estas temos:
TextureAtlas.class
BitmapFont.class
Music.class
Este método está sobrecargado e podemos enviarlle como terceiro parámetro información extra como o tipo de algoritmo de compresión para os elementos gráficos.
  • Indicamos o tipo de carga que queremos:
  • Carga asíncrona: Neste intre a carga se fai asincronamente de tal forma que no método render da clase que está cargando o asset podemos comprobar o progreso da carga chamando ó método update.
Dito método devolve false no caso de que aínda estean cargando os gráficos.


Neste caso (devolve false, polo tanto estamos a cargar os gráficos) podemos chamar ó método getProgress() que nos vai devolver un número entre 0-1 indicando o grado de progreso da carga (0 empeza ; 1 rematou de cargar).


  • Carga síncrona: Se queremos que a carga se faga sincronamente, é dicir, que non continúe coa execución ata que remate de cargar, teremos que chamar ó método finishLoading().
	assetManager.finishLoading();



  • Unha vez cargados os gráficos temos que referencialos para poder ser usados polo noso xogo.
	private Texture mapa1;
        ............

		mapa1 = assetManager.get("LIBGDX_asset_mapa1.png",Texture.class);


  • Unha vez os temos referenciados xa podemos usalos como ata o de agora.
	batch.draw(mapa1,0,0,100,100);


  • Unha vez que xa non os queremos utilizar temos varias opcións:
Chamar ó método unLoad(String nomearquivo): se o gráfico está referenciado por outro assetmanager ou cargado manualmente non o libera.
Chamar ó método clear(): desta forma se liberan todos os recursos gráficos cargados polo assetmanager, pero a diferenza do método dispose podo volver a usar o assetmanager para cargar outros gráficos.
Chamar ó método dispose(): libera os gráficos e destrúe o assetmanager.
		assetManager.dispose();


Exemplo de código

  • Descargade e descomprimide o arquivo seguinte. Copialo ó cartafol assets do proxecto Android.

Media:LIBGDX_assetmanager.zip

Dito arquivo ten 3 mapas de proba, cunha resolución de 2400x4000 pixeles de resolución. Para que vos deades unha idea, unha versión reducida do que levades comprimido é isto:

LIBGDX asset mapa mini.png
O que se va na parte superior esquerda é o gráfico que estades a utiliza no voso xogo...


  • Crear unha nova clase.

Deberedes de cambiar a clase co que inician as diferentes plataformas pola seguinte:

Versión asíncrona

Código da clase AssetManagerCarga
Obxectivo: amosar como utilizar a clase AssetManager. Carga ASÍNCRONA

 1 public class AssetManagerCarga  extends ApplicationAdapter {
 2 	SpriteBatch batch;
 3 	
 4 	private AssetManager assetManager;
 5 
 6 	private Texture mapa1;
 7 	private Texture mapa2;
 8 	private Texture mapa3;
 9 	
10    
11 	@Override
12 	public void create () {
13 		batch = new SpriteBatch();
14 
15 		
16 		assetManager = new AssetManager();
17 		
18 		assetManager.load("LIBGDX_asset_mapa1.png", Texture.class);
19 		assetManager.load("LIBGDX_asset_mapa2.png", Texture.class);
20 		assetManager.load("LIBGDX_asset_mapa3.png", Texture.class);
21 		
22 	}
23 
24 	@Override
25 	public void render () {
26 		Gdx.gl.glClearColor(1, 0, 0, 1);
27 		Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
28 		batch.begin();
29 		if (assetManager.update()){
30 			mapa1 = assetManager.get("LIBGDX_asset_mapa1.png",Texture.class);
31 			mapa2 = assetManager.get("LIBGDX_asset_mapa2.png",Texture.class);
32 			mapa3 = assetManager.get("LIBGDX_asset_mapa3.png",Texture.class);
33 			Gdx.app.log("LIBGDX","Rematou de cargar");	// Se esta é unha pantalla de carga agora cambiaríamos a do xogo
34 			Gdx.app.exit();
35 			
36 		}
37 		else {
38 			Gdx.app.log("LIBGDX",String.valueOf(assetManager.getProgress()));
39 		}
40 			
41 
42 		batch.end();
43 		
44 	}
45 	
46 	@Override
47 	public void dispose(){
48 		assetManager.dispose();
49 	}
50 
51 }


Versión síncrona

Código da clase AssetManagerCarga
Obxectivo: amosar como utilizar a clase AssetManager. Carga SÍNCRONA

 1 public class AssetManagerCarga  extends ApplicationAdapter {
 2 	SpriteBatch batch;
 3 	
 4 	private AssetManager assetManager;
 5 
 6 	private Texture mapa1;
 7 	private Texture mapa2;
 8 	private Texture mapa3;
 9 	
10    
11 	@Override
12 	public void create () {
13 		batch = new SpriteBatch();
14 
15 		
16 		assetManager = new AssetManager();
17 		
18 		assetManager.load("LIBGDX_asset_mapa1.png", Texture.class);
19 		assetManager.load("LIBGDX_asset_mapa2.png", Texture.class);
20 		assetManager.load("LIBGDX_asset_mapa3.png", Texture.class);
21 		
22 		// VERSION SINCRONA
23 		assetManager.finishLoading();
24 
25 	        mapa1 = assetManager.get("LIBGDX_asset_mapa1.png",Texture.class);
26 		mapa2 = assetManager.get("LIBGDX_asset_mapa2.png",Texture.class);
27 		mapa3 = assetManager.get("LIBGDX_asset_mapa3.png",Texture.class);
28 		
29 		// Xa cargamos os gráficos. 
30 		// No xogo que estamos a facer, esta parte iría na clase AssetManager
31 		
32 	}
33 
34 	@Override
35 	public void render () {
36 		Gdx.gl.glClearColor(1, 0, 0, 1);
37 		Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
38 		batch.begin();
39 		
40 		// VERSION SINCRONA
41 		batch.draw(mapa1,0,0,Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
42 
43 		batch.end();
44 		
45 	}
46 	
47 	@Override
48 	public void dispose(){
49 		assetManager.dispose();
50 	}
51 
52 }


TAREFA OPTATIVA A FACER






TAREFA OPTATIVA A FACER: Modifica a clase AssetsXogo para cargar os gráficos do xogo utilizando a clase AssetManager.

Nota:

  • Lembra modificar ó método dispose para liberar o assetmanager.
  • Podes aumentar o nivel de dificultade creando unha pantalla de carga cunha barra de desprazamento,



-- Ángel D. Fernández González -- (2015).