Bienvenidos sean a este post, en el post de hoy veremos como agregar la puntuacion a nuestro juego y la posibilidad de almacenarlo para ello recapitulemos un poco sobre una interfaz creada hacia un tiempo atras:

package com.tinchicus.asteroides;

import java.util.Vector;

public interface AlmacenPuntuaciones {
    void guardarPuntuacion(int puntos, String nombre,
                          long fecha);

    Vector<String> listaPuntuaciones(int cantidad);
}

Como podemos ver declaramos dos metodos, uno para guardar la puntuacion (guardarPuntuacion) y otro para listar las mismas (listasPuntuaciones), en el primer caso tendremos tres datos que enviar y estos son:

  • Puntos
  • Nombre
  • Fecha

Si vamos a la clase MainActivity veremos la siguiente linea:

public static AlmacenPuntuaciones almacen = new AlmacenPuntuacionesArray();

Este es un objeto creado de la clase AlmacenPuntuaciones llamado almacen la cual se encargara de almacenar las puntuaciones por medio de AlmacenPuntuacionesArray, a su vez nosotros tenemos la actividad llamada Puntuaciones la cual se encarga de mostrar el listado de las puntuaciones cargadas por medio de AlmacenPuntuacionesArray, nuestro objetivo ahora sera por medio de almacen poder empezar a subir las puntuaciones y almacenarlas para ello debemos ir a VistaJuego donde agregaremos la siguiente linea:

private int puntuacion = 0;

Esta linea iniciara la variable que almacenara nuestros puntos, nuestra siguiente modificacion sera en el metodo destruyeAsteroide() donde agregaremos la siguiente linea:

puntuacion += 1000;

Esta linea incremetara en 1000 por cada asteroide que destruyamos, nuestra siguiente modificacion sera en MainActivity, primero deberemos agrear la siguiente linea al principio de la clase:

private int puntuacion = 0;

Nuestra siguiente modificacion sera en el metodo lanzarJuego() donde modificaremos el codigo actual:

    public void lanzarJuego(View view){
        Intent i = new Intent(this, Juego.class);
        startActivity(i);
    }

Por este bloque:

    public void lanzarJuego(View view){
        Intent i = new Intent(this, Juego.class);
        startActivityForResult(i,1234);
    }

Si iniciamos la actividad de esta forma le diremos que no solamente debe iniciar la actividad sino a su vez enviara una referencia (1234) que nos servira para poder intercambiar informacion entre dos actividades distintas, para ello debemos agregar el siguiente metodo en la clase MainActivity:

    @Override
    protected void onActivityResult(int requestCode, int resultCode,
                                    Intent datos){
        super.onActivityResult(requestCode, resultCode, datos);
        if(requestCode == 1234 && resultCode == RESULT_OK && datos!=null) {
            puntuacion = datos.getExtras().getInt("puntuacion");
            final EditText a_nombre = new EditText(this);
            a_nombre.setInputType(InputType.TYPE_CLASS_TEXT);
            new AlertDialog.Builder(this)
                    .setTitle("Puntuacion alcanzada")
                    .setMessage("Ingresa tu nombre")
                    .setView(a_nombre)
                    .setPositiveButton("Ok", new DialogInterface
                            .OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogo, int i) {
                            nombre = a_nombre.getText().toString();
                            almacen.guardarPuntuacion(puntuacion,nombre, System
                                    .currentTimeMillis());
                            lanzarPuntuaciones(null);
                        }
                    })
                    .setNegativeButton("Cancelar", new DialogInterface
                            .OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogo, int i) {
                            nombre = "AAA";
                            almacen.guardarPuntuacion(puntuacion,nombre, System
                                    .currentTimeMillis());
                            lanzarPuntuaciones(null);
                        }
                    })
                    .show();
        }
    }

Este bloque se encarga de recibir el resultado generado por el inicio de actividad antes creado, si se cumple la condicion del codigo de requerimiento (requestCode), el codigo de resultado (resultCode) y los datos son distinto de nulo (null), en puntuacion guardaremos la informacion enviada desde VistaJuego, esto sera por medio del metodo salir() que explicaremos un poco mas adelante, despues crearemos un elemento EditText para poder almacenar el nombre del jugador, y la siguiente linea se encarga de definir el tipo de EditText, luego crearemos el alerta que vamos a mostrar en pantalla, en donde setearemos el titulo (setTitle), el mensaje (setMessage), el campo encargado de ingresar informacion por medio de setView usara el EditText creado anteriormente, despues crearemos al boton Ok (setPositiveButton), el primer campo sera el texto a mostrar y luego crearemos un evento para click donde en caso de ser pulsado, le diremos que almacene la informacion por medio de guardarPuntuacion() y despues usaremos el metodo lanzarPuntuacion() para ver el listado de puntuacion, la siguiente opcion es setNegativeButton() donde es similar al caso anterior pero en este caso a nombre le asignaremos el valor AAA, despues hace exactamente lo mismo al anterior y por ultimo tenemos un show() que se encarga de mostrar el dialogo de alerta.

Nuestra siguiente modificacion sera en la clase VistaJuego donde agregaremos este bloque:

    private static Activity padre;

    public static void setPadre(Activity padre){
        VistaJuego.padre = padre;
    }

Para realizar la respuesta de la actividad es mas sencillo hacerlo desde la clase VistaJuego que de Juego pero como VistaJuego no es una actividad sino una vista debemos crear un objeto de tipo actividad y estatico para poder ser utilizado desde otra clase y que puede ser utilizado como actividad, para ello crearemos el metodo setPadre() donde setearemos al objeto padre de la clase VistaJuego con el informado a la hora de instanciar a este metodo.

Nuestra siguiente modificacion sera el metodo encargado de sacarnos del juego tanto si triunfamos como si fracasamos, para ello deberemos agregar el siguiente metodo dentro de la clase VistaJuego:

    private void salir(){
        Bundle bundle = new Bundle();
        bundle.putInt("puntuacion", puntuacion);
        Intent intento = new Intent();
        padre.setResult(Activity.RESULT_OK,intento);
        padre.finish();
    }

Este metodo creara un bundle donde le ingresara la referencia, puntuacion, y el valor obtenido por medio de la destruccion de los asteroides, luego crearemos la intencion, a padre enviaremos los datos por medio de un serResult() enviara la intencion y la constante RESULT_OK para luego finalizar a padre.

Solo nos resta un par de modificaciones mas para terminar nuestra app, por ahora, la primera va a ser en destruyeAsteroide donde agregaremos el siguiente bloque:

        if(asteroides.isEmpty()){
            salir();
        }

Este bloque se encargara de chequear si todos los asteroides fueron destruidos llamara al metodo salir() para subir la puntuacion, para la proxima modificacion debemos ir a actualizarFisica() donde agregaremos el siguiente bloque:

        for(Grafico asteroide : asteroides){
            if(asteroide.verificaColision(nave))
                salir();
        }

Este bloque verificara si existe una colision entre alguno de los asteroides y nuestra nave, en caso de ser verdadero llama al metodo salir() para subir la puntuacion, nuestra ultima modificacion sera en la clase Juego dentro del metodo onCreate() donde agregaremos la siguiente linea:

VistaJuego.setPadre(this);

Esta modificacion llamara a setPadre para establecer a Juego como la actividad padre y poder trabajar con ella, con todas estas modificaciones realizadas podemos probar nuestra app como se ve en el siguiente video

Como pueden ver en este video como impactamos a los asteroides y se dividen, al ser impactados por uno de ellos nos aparece la opcion de ingresar un nombre y presionar Ok para agregarlo o presionen Cancelar para que lo agregue con el nombre de AAA.

En resumen, hoy hemos visto como crear nuestra primera posibilidad para crear una puntuacion a medida que impactamos cada uno de los asteroides, hemos visto como crear la posibilidad de poder asignar un nombre a esa puntuacion y como lo podemos agregar al listado de puntuaciones pero todavia sin la posibilidad de grabarlo, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios