martes, 15 de octubre de 2013

Preferencias

Preferencias

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.







7 comentarios:

  1. Hola,
    estoy siguiendo tus tutoriales pero éste de aquí no lo pillo, podrías poner en qué lugar se ha de crear esto de preferencias, si es una clase o no, y podrias poner un ejemplo de cómo quedaría, esque lo estoi aciendo y el eclipse me marca errores por todos los lados
    Lo estoi aciendo en una nueva clase implementada de Preferences.
    gracias, ansio tu respuesta

    ResponderEliminar
  2. Saludos, cuando vuelva de vacaciones te responderé en condiciones, de momento te adelanto que no hace falta implementar nada, solo tienes que crear el objeto preferences en la clase aparte y luego crear el objeto de tu clase creada en la clase principal de nuestro proyecto. Para el domingo te escribo la clase que con el móvil es un follón! Suerte y espero que lo entiendas!

    ResponderEliminar
  3. hey amigo deveras muchas gracias por esta ayuda tan util.. sigue asi porfa es un tuto muy completo y detallado gracias mil gracias ... :D

    ResponderEliminar
  4. Soy el anónimo del comentario, gracias por la respuesta, ya lo he entendido y he podido llegar hasta el final del blog hasta la fecha de hoy.
    Espero que sigas, que me ha venido muy bien para un proyecto que he de hacer para el bachiller, gracias por este maravilloso blog

    ResponderEliminar
  5. Maestro como hago para salir de un render. Por ejemplo un game over y hacer que el juego salte a otra pantalla, por ejemplo a las estadisticas.... Gracias...

    ResponderEliminar
  6. Supongo que ya sabrás como crear varias pantallas, solo tienes que comprobar las condiciones de game over en el render la pantalla de juego, y cuando se cumplan llamar a tu clase principal game y usar el método game.setScreen(game.gameOverScreen); por ejemplo, en caso de que tengas creada esa pantalla. En ésta entrada tienes la manera de crear pantallas. http://libgdxspain.blogspot.com.es/2013/10/screens-y-spawners.html

    ResponderEliminar
  7. Tengo un problema hago flush cada vez que modifico pero cuando recupero coge esos valores por defecto pero este fallo es solo en android pero en desktop funciona perfecto.

    ResponderEliminar