lunes, 9 de diciembre de 2013

Assets Manager II



Saludos de nuevo, sé que últimamente no publico entradas todas las semanas, pero tengo mucha faena acumulada y he tenido que reducir el ritmo, así que en cuanto pueda intentaré escribir alguna entrada interesante como la de a continuación.

En la entrada 3 del blog expliqué como crear un "assets manager" para gestionar nuestras imágenes, sonidos, músicas etc... No obstante, y como era normal en la 3era entrada, (1era entrada de código) no iva a ponerme a explicar algo muy difícil para empezar, así que ahora, después de unas cuantas entradas ya estamos preparados para aprender a gestionar nuestros assets de mejor manera, controlando la carga de los mismos, etc. Vamos a ello!

Classe de libGdx AssetManager.

http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/assets/AssetManager.html

 LibGdx tiene una classe ya preparada para gestionar la carga de nuestros assets, para ello vamos a crear una classe aparte, en nuestro proyecto núcleo y voy a llamarla Manager para dentro de ella, instanciarle un objeto AssetManager que lo importaremos de "com.badlogic.gdx.assets.AssetManager"

import com.badlogic.gdx.assets.AssetManager;
//Creamos nuestra classe
public class Manager  {
//Creamos nuestro atributo AssetManager.
    public AssetManager manager;
   
//Creamos un método constructor y instanciamos el objeto con AssetManager();
    public Manager(){
        manager = new AssetManager();
       }

}

Una vez hecho esto vamos a ver como cargar nuestros assets, creamos un método void sencillo y le añadimos el método del objeto AssetManager load(PathdelArchivo,TipoDeClasse);

    public void loadAssets() {
       //Cargo una textura.
        manager.load("data/Images/pez.png",Texture.class);     
        manager.load("data/Images/calamar.png",Texture.class);
       //Cargo un sonido
        manager.load("data/sounds/boom.mp3",Sound.class);
        manager.load("data/Images/moneda.png",Texture.class);
       //Cargo una musica
        manager.load("data/sounds/musicainicial.mp3",Music.class);
    }
   
Una vez creado el método de carga tendremos que llamarlo cuando nos parezca oportuno. En nuestro caso, en la 2ª parte de ésta entrada, vamos a crear una pantalla de carga tipo "Loading" con una barra y demás.

Antes de liarnos con el tutorial práctico, explico como traernos donde necesitamos todos nuestros assets.

Para traernos y usar cualquier asset en el AssetManager, antes de nada tenemos que instanciar nuestra classe "Manager" propia y tenerla accesible en la classe donde vamos a usarla, así que para llevarla de un lado para otro la instanciaré en mi classe principal "Game" de siempre y al pasarme el game a todas nuestras classes siempre podré usar mis assets.

Aqui va un fragmento de mi classe principal:

public class LibgdxSpain extends Game {
//Aqui creo mis atributos, pantallas, preferencias, etc.
//Y como no creo mi atributo Manager
public Manager assets;
..
..
..
//Luego en mi método create, añado el constructor de mi classe Manager.

assets = new Manager();

// Luego seguiría instanciando mis demás classes, cargando pantallas, etc.

//Fijaos que a mi objeto Manager le llamo "assets" y a mi objeto AssetManager de libgdx que //instancio dentro de Manager le llamo manager en minusculas, para acceder a él deberé escribir
//game.assets.manager
..
..
..

Y ahora, empiezo a programar mi mágnifico Mob "Calamar" nuevo y necesito traer mi textura, así que para ello como siempre meto mi classe game en un atributo del actor para acceder desde cualquier método dentro de mi actor y escribo ésto.

public void draw(SpriteBatch batch){
batch.draw((Texture) game.assets.manager.get("data/Images/calamar.png");
}
//De ésta manera me traigo ese asset, y como el método get dentro de AssetManager tiene varios //valores de retorno(salida) posibles, debo indicar a java que lo que me traigo con get, es una textura.
//Para ello escribo (Texture) game.assets.manager.get(XXXXX);
//Puedo hacer perfectamente lo mismo con cualquier asset, siempre y cuando le diga  java de que
//tipo de objeto estamos hablando. Ejemplos:
//(Sound) game.assets.manager.get("data/sounds/boom.mp3");
//(Music) game.assets.manager.get("data/sounds/MusicaInicial.mp3");
Y finalmente para terminar la teorica comento los 3 métodos últimos que hay que conocer de AssetManager, el método .getProgress() que nos devolverá un float del 0 al 1 con el porcentaje de carga, (0 = 0% y 1 = 100%),  el método .dispose() que como ya sabemos quitará de memoria todas los assets cargados, y finalmente el método .update() que lo utilizaremos para "actualizar" los datos internos del AssetManager, útil para actualizar la barra de progresso, etc.



Tutorial Práctico, Barra de Carga.

Una vez creado nuestro AssetManager vamos a crear nuestro actor que nos actuará como una barra de carga, para ello e creado éstas 2 imágenes rapidito.




Una como contenedor y la otra será la barra que estiraremos dependiendo del progreso de la misma. Aqui va el código, como vereís es aplicar muy fácil lo que hemos aprendido hoy.



package com.Firedark.libgdxspain;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.scenes.scene2d.Actor;
//Creamos el actor.
public class BarraDeCarga extends Actor {
    //No usaré el loader para cargar las imagenes de cargado.
    Texture barra,llenado;
    LibgdxSpain game;
//Me traigo el game
    public BarraDeCarga(LibgdxSpain game){
        this.game = game;
//Lo coloco en el centro, yo lo e puesto en cualquier lado.
        setPosition(game.w/2-200,game.h/2);
//Instancio imagenes a la antigua.
        barra = new Texture(Gdx.files.internal("data/Images/barra.png"));
        llenado = new Texture(Gdx.files.internal("data/Images/llenado.png"));
       
    }
    //Método de dibujo
    public void draw(SpriteBatch batch, float parentAlpha){
       
        //Actualizo en mi método draw el manager.
        game.assets.manager.update();
        //Dibujo la barra, mas o menos centrada en el contenedor, y la "Estiro" en X, como el valor
        //del progress va de 0 a 1, la multiplico por 400 así irá de 0 a 400.
        batch.draw(llenado, getX()+50,getY()+25,game.assets.manager.getProgress()*400,64);
        //Dibujo Contenedor.
        batch.draw(barra, getX(),getY());
       
    }

}
//FIN, le puedo añadir letras, números y todo lo que se me ocurra.
Aquí un video de lo que hace:




Y eso es todo por ahora, espero cuanto antes sacar mi siguiente entrada. Gracias a todos y suerte.