Saludos de nuevo, en ésta nueva entrada vamos a tocar el tema de las preferencias, las preferencias son datos permanentes que se alojan en la memoria del dispositivo, pc, etc... Las preferencias nos serán muy útiles para guardar los datos de usuario más comunes, el volumen que quiere en la aplicación, los records personales de nuestro arcade, partidas jugadas, y cualquier cosa que necesitemos que se mantenga en memoria una vez se cierre nuestro juego.
Instanciando el objeto Preferences
Para guardar nuestras preferencias primero deberemos instanciar la clase Preferences de libgdx, recomiendo usar una clase aparte, donde escribir todos los métodos y llamarlos desde cualquier sitio.
//Creo Atributo Preferences
private Preferences prefes;
//También creo una instancia de game, por si necesito acceder a alguna variable general del juego.
LibgdxSpain game;
//Metodo Constructor
public Prefer(LibgdxSpain game){
this.game = game;
}
//Aqui instancio mi atributo preferences, basta con acceder a Gdx.app.getPreferences("nombre")
//El nombre puede ser cualquiera, aunque es recomendable usar el mismo nombre de tu aplicacion.
public void GetPreferences(){
prefes = Gdx.app.getPreferences("libgdxspain");
}
//Aqui se añaden los métodos de Guardar o Traerse datos.
}
Ésta clase la instanciaremos en nuestra clase principal, y únicamente llamaremos a métodos de la clase Prefer para añadir y traernos los datos, así mantenemos la gestión de las preferencias únicamente en la clase de preferencias.
Guardando datos en las preferencias.
Bien, ya teniendo el objeto Preferences creado podemos llamar a varios métodos para guardar los datos.
prefes.putFloat("Musica",0.6f);
prefes.putBoolean("Inicial", true);
prefes.putInteger("Niveles",2);
prefes.putString("Nombre","Firedark");
prefes.putLong("Tiempo",100000000);
prefes.flush();
public void setName(){
String name = prefes.setString("Nombre","Paco");
prefes.flush();
}
Como vereís, podemos guardar Floats, Booleanos, integers, cadenas de texto, valores long, tenemos que darle la "clave" que representaria el "nombre de variable" dentro de las preferencias, luego en el 2º parámetro añadimos el valor del mismo tipo que método hayamos llamado.Como vereís existe otro método, el flush(), éste es usado para guardar las preferencias en el archivo externo correspondiente, digamos que es el método que guarda las preferencias.
Leyendo datos de las preferencias.
Para leer datos usaremos el mismo objeto, y es muy similar a guardarlas.
float musica = prefes.getFloat("Musica");
boolean valorinicial = prefes.getBoolean("Inicial");
integer nivel = prefes.getInteger("Niveles");
Ejemplo de Metodos:
public String getName(){
String name = prefes.getString("Nombre");
return name;
}
public boolean getInicial(){
Boolean bool = prefes.getBoolean("Inicial");
return bool;
}
Indudablemente es igual para cada tipo de dato, para traernoslo a una variable, únicamente debemos llamar al método de prefes que trae ese tipo de dato, junto con la "clave" que hemos usado para guardarla.Problemas y Consejos
Hay algunos problemas a tener en cuenta usando preferencias:
1º ) Si en pleno juego, guardaís una preferencia, el juego posiblemente se atontará un segundo o menos, al estar guardando un archivo externo y ejecutando un render no le sentará muy bien.
2º ) El proyecto Desktop se enterará de todos los cambios que hayas hecho al modificar las preferencias sin guardarlas el proyecto android no, es decir:
Desktop
prefes.setBoolean("Boleano", false);
boolean A = True;
//Actualmente para Desktop la preferencia Boleano es false y la variable A es true.
prefes.setBoolean("Boleano" , A);
//Sin usar flush(), desktop ya sabe que la preferencia Boleano es A, por tanto es true.
prefes.flush(), desktop guarda en su archivo de preferencias el valor de A en la clave Boleano.
Android
prefes.setBoolean("Boleano", false);
boolean A = True;
//Actualmente para Android la preferencia Boleano es false y la variable A es true.
prefes.setBoolean("Boleano" , A);
//Sin usar flush(), Android sigue leyendo que la preferencia "Boleano" es false, no le importa que la hayas seteado.
prefes.flush(), A partir de aqui Android ya leerá la variable A en la clave "Boleano"
Ésto es importante ya que no puedes guardar los datos en medio del juego, pero tampoco puedes usar las lecturas de preferencia sin guardarlas previamente, por lo tanto necesitarás guardarlas en memoria temporal en atributos y guardarlas cuando el juego acabe, en el método Hide() de una pantalla, cuando hagas GameOver, etc, así el usuario no notará la lentitud de guardar el archivo.
Ésta semana a sido corta pero para la próxima nos meteremos de lleno en Scene2D y necesitaremos estar descansados porque se complicará un poco más la estructura, como siempre se agradecen comentarios, algún video de algún juego que esteís implementando, +1 de Google, etc...
Muchas gracias a todos y nos vemos la próxima semana.