sábado, 22 de julio de 2017

Sliding Puzzles: Lost Blocks (Android App)

Después de más de un año desde que estrené mi primer título para Android, Snake II, termino de publicar mi segundo juego en el que he invertido una buena cantidad de tiempo en capacitación para diseño de interfaces y combinación de colores (diseño en general) de una aplicación de estas características. Además, es mi primera convergencia con profesionales de otros campos dentro del lanzamiento de un proyecto.

Se trata de Sliding Puzzles: Lost Blocks, un juego que nos permite resolver puzzles deslizando las piezas sobre el tablero hasta formar el patrón que se intenta reconstruir, ya sea una imagen o una serie de símbolos. En esta versión del clásico sliding puzzles, deberemos resolver el rompecabezas en el menor tiempo posible, así como realizando los mínimos movimientos necesarios para reordenar las piezas. Sin olvidar que contaremos con la ayuda de objetos que deberemos utilizar estrategicamente para limar nuestros récords.

Sliding Puzzles: Lost Blocks para Android


  • Programado en Unity3D utilizando únicamente C# como lenguaje de programación y las librerías GoogleMobileAds (para implementar la publicidad) y GooglePlayServices para ofrecer un ranking global y un sistema de logros vinculado a la cuenta Google Games del jugador.
  • Proyecto pensado para ser escalado con un modo multiplayer que enfrenta a dos jugadores en una carrera de resolución de sliding puzzles.
  • Disfruta del diseño original de la interfaz del juego y de los efectos visuales como transiciones y sistemas de partículas empleados para ambientar cada escena.
  • Es posible seleccionar entre diferentes categorías de puzzles.
  • Podremos elegir entre tres dificultades (3x3, 4x4 o 5x5, según el número de piezas) a la hora de resolver un puzzle.

Colaboraciones

Para llevara cabo este proyecto he contado con la ayuda de:

  • Música/efectos de sonido: Mauricio Nicolás Diéguez Oviedo


Podéis descargar la aplicación para Android de forma gratuita desde la Play Store de Google:

martes, 1 de marzo de 2016

Snake 2000: Classic Nokia game (Android App)

Después de unos meses de inmersión en el mundo de los videojuegos he conseguido dar a luz a mi primera aplicación móvil, a mi primer videojuego con Unity3D y también a mi primer proyecto "serio" con un principio y con un fin, aunque seguiré actualizando el juego al menos durante un tiempo. Este no es otro que el clásico Snake II al que todos estuvimos enganchados en los teléfonos Nokia de hace unos años.

El motivo de haber escogido este juego es muy sencillo, y es que si tengo que introducirme en la industria de los videojuegos lo voy a hacer con cabeza. Embarcarse en proyectos 3D sin entender la estructura del código de un videojuego (aunque sea en dos dimensiones) solo puede terminar en tragedia y este clásico de Nokia siempre me había gustado. En cualquier caso, y aunque parezca raro, también sufrí mi primer problema con la eficiencia de una aplicación. Programar videojuegos para móviles (al menos para Android) y mantener los FPS a un nivel jugable es bastante difícil utilizando un engine como Unity3D, de tan alto nivel.


Classic Nokia Snake II (1997) para Android


  • Programado en Unity3D utilizando únicamente C# como lenguaje de programación y las librerías GoogleMobileAds (para implementar la publicidad) y GooglePlayServices para ofrecer un ranking global y un sistema de logros vinculado a la cuenta Google Games del jugador.
  • Disfruta de la clásica interfaz verdosa de los antiguos teléfonos Nokia: se han conservado elementos visuales exactamente iguales que en la versión original de Snake II.
  • Cuenta con un apartado de opciones para seleccionar la velocidad de la serpiente (a mayor velocidad más puntos ganaremos jugando) y cambiar el sistema de control del juego.

Podéis descargar la aplicación para Android de forma gratuita desde la Play Store de Google:



sábado, 30 de enero de 2016

#02 Programación Java - Clases, objetos y funciones

Antes de pasar al desarrollo de la siguiente aplicación del tutorial de programación en java tenemos que introducir el concepto de Programación Orientada a Objetos (POO) y los subsiguientes: clases, objetos y funciones.

Volvamos a la teoría. Java es un lenguaje de programación orientado a objetos, lo que significa que una aplicación Java está compuesta de objetos de diferentes clases interrelacionándose en un método principal (la función 'main'). Vamos a entender los conceptos de clases y objetos con una analogía de forma muy sencilla:


POO: Programación Java: clases y objetos


  • Las clases: Incidiendo en la analogía, entenderemos las clases como la representación de todos los objetos de un tipo determinado. Tenemos así las clases 'animal', 'mueble', 'persona' o también más específicas como 'gato', 'silla' y 'estudiante'. Podemos hacer una clase casi de cualquier 'cosa' y esta representará a todo el colectivo de esas 'cosas'. En Java, crearemos las clases de las que vayamos a necesitar un objeto. De la misma forma que en la aplicación del capítulo anterior ("Tu primera aplicación en Java") solo necesitábamos un objeto de la clase MiPrimeraAplicación.java y por ello solo trabajamos con esa clase.Vamos a abordar más a fondo el concepto de clase con un ejemplo práctico:
Si queremos desarrollar un videojuego en el que los protagonistas (objetos) son personas (las clases son la respuesta a la pregunta: "¿qué son?" dirigida al personaje/objeto.) deberemos crear la clase persona, que será el patrón que seguirán todas las personas del juego.


Aplicación java: dos personajes peleando


Para empezar a diseñar nuestra segunda aplicación necesitaremos crear un nuevo proyecto (recuerda cómo hacerlo en el capítulo anterior del tutorial de programación java) y titularlo esta vez JuegoDePeleas.java (la carpeta destino es a vuestra elección). Recuerda dejar activa la casilla de 'create main class' para que se genere automáticamente el código de la función principal de la aplicación. En este momento, tendremos algo parecido a la imagen siguiente en nuestro monitor:

programacion java
Aplicación JuegoDePeleas creada

Bien, ya tenemos una de las dos clases que necesitaremos para crear el JuegoDePeleas, puesto que además de un objeto de la clase 'JuegoDePeleas.java' (ya que la aplicación también es un objeto que además tiene la función 'main', las demás clases no la tienen) debemos crear la clase Persona y a partir de ella dos objetos de esa clase (dos personas) para que se peleen.

Para crear otra clase (otro archivo .java) además de la principal (la que se llama como la aplicación y tiene el método 'main') seguiremos los siguientes pasos:

clase objeto java
1. (Click derecho > new > Java class...) 2. Nombre de la clase: Persona 3. Guardamos la clase Persona en la carpeta juegodepeleas.

  1. Hacemos click derecho sobre el proyecto para crear una nueva clase (new > Java class...).
  2. Nos aparecerá una ventana como la de la imagen anterior y tendremos que rellenar el hueco que pone 'Class Name' escribiendo Persona, que es en este caso el nombre de nuestra clase.
  3. Para terminar, elegiremos como carpeta contenedora de nuestra clase Persona la misma (juegodepeleas) que la que contiene a la otra clase que tenemos, JuegoDePeleas.java.

Ya hemos creado las dos clases que necesitamos para desarrollar la aplicación que simula un juego de peleas entre dos personas y este debe ser ahora mismo el aspecto de nuestra pantalla:

programacion juegos java
1. Tenemos dos clases en nuestro proyecto; 2. Solo la clase JuegoDePeleas tiene método main; 3. La clase persona también pertenece a la carpeta juegodepeleas

  1. Como podemos observar en el primer punto de la imagen anterior, ya tenemos las dos clases que necesitamos para programar nuestra aplicación en la misma carpeta (juegodepeleas).
  2. La clase Persona no tiene método 'main' cuando la creamos, ya que sólo la primera clase que creamos con el proyecto (JuegoDePeleas en este caso), la que tiene el mismo nombre que la aplicación es a la que denominamos 'clase principal' y la  que tiene el método 'main' que hace de escenario de la aplicación: allí es donde pelearán nuestras personas cuando las creemos (también allí).
  3. La clase Persona.java, al igual que la JuegoDePeleas.java se encuentran en la carpeta (o package) 'juegodepeleas'.

Atributos de las clases en programación Java


Antes de crear dos objetos de la clase Persona para que se peleen en el método principal deberemos modificar la clase Persona para añadir atributos como pueden ser los puntos de salud de los combatientes, su nombre o la fuerza con la que golpean a sus enemigos. Además, deberemos registrar las acciones que son capaces de desempeñar (métodos de Persona).

Vamos a añadir el nombre, los puntos de salud y de fuerza a la clase Persona para que así todas las personas que creemos a partir de ese patrón tengan también un nombre personalizado y unos puntos de salud y fuerza determinados (que no tienen por qué ser iguales de una persona a otra). Modificamos a continuación la clase Persona añadiendo unas líneas que después explicaremos:

poo programacion java
1. Atributo Strig nombre que tienen las personas 2. Atributos enteros de salud y fuerza de las personas
  1. Como podemos observar, hemos añadido los atributos nombre, salud y fuerza a la clase Persona. A partir de ahora, todas las personas que instanciemos de esa clase también tendrán esas características. En el punto uno señalamos el nombre, precedido por las palabras 'private' y 'String'. Adelantamos ya que todos los atributos de las clases son 'private' en condiciones normales y es la primera palabra que escribimos, seguida del tipo de dato ('Stringen este caso, pues el nombre es una cadena de texto). La palabra que aparece en verde, nombre, es el identificador que hemos elegido y podemos escogerlo a nuestro gusto, pero se suelen coger palabras que doten de sentido coherente a la clase.
  2. En el punto 2, observamos que la palabra 'Stringse ha sustituido por 'int(viene de 'Integer'), pues los puntos de salud y la fuerza son números enteros (sin decimales) en lugar de cadenas de texto. Al ser atributos siguen siendo privados (escribimos 'private').
Existen muchos tipos de datos además de las cadenas de texto (String) y números enteros (int), pero los veremos en mayor profundidad en el siguiente capítulo del tutorial de programación en Java.


El constructor y los métodos de una clase en Java


Hemos conseguido que nuestros objetos de la clase Persona tengan un nombre (en texto), puntos de salud (número entero) y de fuerza (número entero), pero, ¿Cómo asignamos un nombre o cantidad de puntos de salud y fuerza a una persona? ¿Cómo creamos un objeto de la clase Persona? En primer lugar vamos a añadir un poco más de código a nuestra clase Persona y a explicarlo:

public class Persona {
    private String nombre;
    private int salud;
    private int fuerza;
    
    /**
     * Constructor de la clase Persona con tres parámetros
     * @param nom El nombre con el que se crea la Persona
     * @param sal La salud con la que se crea la Persona
     * @param fue La fuerza con la que se crea la Persona
     */
    public Persona(String nom, int sal, int fue){
        nombre = nom;
        salud = sal;
        fuerza = fue;
    }
}

Acabamos de escribir un método público de la clase Persona llamado a su vez Persona. Nos encontramos ante uno de los constructores de la clase. El constructor de la clase es el método encargado de inicializar los atributos del objeto de la clase en el momento de su creación (construcción).  Sé que avanzamos un poco rápido, pero esa es la sintaxis de Java y os dejará de parecer extraña con el tiempo, no os agobiéis.

A diferencia de los atributos (nombre, salud y fuerza) que hemos declarado al principio de la clase Persona, los métodos van acompañados de un paréntesis en el que se incluyen los argumentos, valores con los que se van a inicializar cada uno de los atributos. Ahora que conocemos el concepto de constructor, vamos a utilizarlo para 'construir' un objeto Persona a partir del patrón (la clase) en el método 'main' de la aplicación:

public class JuegoDePeleas {
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Persona persona1, persona2; //Declaramos a las personas
        
        persona1 = new Persona("Carlos", 50, 25); //Creamos a Carlos
        persona2 = new Persona("Javier", 100, 25); //Creamos a Javier
        
    }
    
}

Para declarar las dos personas que necesitamos para combatir en la aplicación, escribiremos la clase de la que queremos crear los objetos (Persona) y después los identificadores (el nombre de la variable) separados por coma (persona1, persona2). Hasta ese momento hemos declarado que nuestra intención es utilizar dos personas en nuestra aplicación, pero sus valores todavía están vacíos, debemos 'construir' a las personas y darle valor a sus atributos.

  • Observamos como la persona1 tiene como nombre Carlos (como hemos dicho antes hemos escrito la cadena de texto entre comillas), 50 puntos de salud y 25 de ataque (pues es el orden de los argumentos en el constructor de la clase Persona).
  • La persona2, por otro lado, se llama Javier y tiene 100 puntos de salud, pero la misma fuerza que persona1.
Ya tenemos a los dos personajes creados, cada uno con sus atributos personalizados utilizando el constructor, pero, ¿Cómo hacemos que se peleen? Si ahora pulsamos el botón de ejecutar la aplicación (Play en la barra de herramientas de NetBeans) no ocurrirá nada, pues además de crearse las dos personas en el método main no hay más instrucciones nada.

Ha llegado el momento de escribir un método de la clase Persona que les permita atacarse entre ellas y otro que les permita restar la salud correspondiente al ataque recibido. Recordamos que los métodos o funciones de una clase son las 'acciones' que pueden llevar a cabo y se les da un nombre siempre a favor de la coherencia y analogía con la realidad de la clase. En este caso y si estamos buscando crear un método de Persona que nos permita atacar, lo llamaremos así mismo 'atacar' al igual que 'restar salud' puede ser un buen nombre para el método que se encarga de descontar la fuerza del enemigo en salud del que recibe el ataque:

public class Persona {
    private String nombre;
    private int salud;
    private int fuerza;
    
    /**
     * Constructor de la clase Persona con tres parámetros
     * @param nom El nombre con el que se crea la Persona
     * @param sal La salud con la que se crea la Persona
     * @param fue La fuerza con la que se crea la Persona
     */
    public Persona(String nom, int sal, int fue){
        nombre = nom;
        salud = sal;
        fuerza = fue;
    }
    
    /**
     * Permite atacar a otra persona
     * @param enemigo Persona a la que atacamos
     */
    public void atacar(Persona enemigo){
        enemigo.restarSalud(fuerza);
    }
    
    /**
     * Permite perder salud a las personas
     * @param fuerzaDelEnemigo Fuerza del atacante
     */
    public void restarSalud(int fuerzaDelEnemigo){
        salud = salud - fuerzaDelEnemigo;
    }
}

Hemos añadido los métodos 'atacar' y 'restarSalud' a la clase Persona. El funcionamiento de los mismos es muy sencillo, pero es normal no saber leer el código si es tu primer contacto con la programación. Lo único que puede decirte en ese caso es que es así y pedirte que hagas un esfuerzo en intentar comprender cómo funcionan estos métodos, pues la mayoría de problemas que pueden surgir son incomprensiones de la sintaxis (paréntesis, puntos, etc).

Después de la palabra 'public', que significa que los objetos de la clase podrán utilizar esos métodos en otras funciones (como el método 'main' de la aplicación JuegoDePeleas), encontramos la palabra 'void' en los dos nuevos métodos de la clase Persona. Esta segunda palabra que aparece en la declaración de métodos (en todos menos en el constructor) es el tipo de valor de retorno de la función,  que en este caso no es ninguno (void). Veremos más adelante ejemplos de métodos con valores de retorno de diferentes tipos: int, String, double, etc.

Para que nuestras personas realicen una acción deberemos escribir el nombre de su variable (persona1, persona2, enemigo, etc), un punto pegado al identificador que indica que se va a invocar a un método y el nombre del método seguido de los parámetros necesarios ente paréntesis:

  • public void atacar(Persona enemigo): La persona que invoca el método atacar debe utilizar a su enemigo como parámetro de la función, es decir, a la persona a la que quiere restar vida. Dentro de este método es el enemigo el que se encarga de bajarse su propia vida un número igual a la fuerza del que llamó a la función 'atacar'.
  • public void restarSalud(int fuerzaDelEnemigo): Utilizaremos este método para restar salud a la Persona que lo invoca: si escribimos persona1.restarSalud(20); estaremos diciendo que la persona1 ha perdido 20 puntos de vida.


Combate Java entre dos objetos de la clase Persona


Antes de terminar el segundo capítulo del tutorial de programación en Java vamos a crear un último método de clase Persona que nos permitirá saber cuánta salud le queda a una persona que invoca dicho método:

public class Persona {
    private String nombre;
    private int salud;
    private int fuerza;
    
    /**
     * Constructor de la clase Persona con tres parámetros
     * @param nom El nombre con el que se crea la Persona
     * @param sal La salud con la que se crea la Persona
     * @param fue La fuerza con la que se crea la Persona
     */
    public Persona(String nom, int sal, int fue){
        nombre = nom;
        salud = sal;
        fuerza = fue;
    }
    
    /**
     * Permite atacar a otra persona
     * @param enemigo Persona a la que atacamos
     */
    public void atacar(Persona enemigo){
        enemigo.restarSalud(fuerza);
    }
    
    /**
     * Permite perder salud a las personas
     * @param fuerzaDelEnemigo Fuerza del atacante
     */
    public void restarSalud(int fuerzaDelEnemigo){
        salud = salud - fuerzaDelEnemigo;
    }
    
    /**
     * Permite conocer la salud de una persona
     * @return La salud de la persona
     */
    public int devolverSalud(){
        return salud;
    }
}

La principal diferencia de este método en comparación con los otros que hemos escrito antes es que el valor de retorno de la función (la palabra que viene después de 'public') es de tipo número entero (int). Al utilizar esta función obtendremos los puntos de vida que le quedan a esa persona.

Para terminar el capítulo de programación orientada a objetos de Java haremos que Carlos ataque a Javier en el método main de la aplicación y que se muestre por pantalla la vida que todavía la queda a Javier:

public class JuegoDePeleas {
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Persona persona1, persona2; //Declaramos a las personas
        
        persona1 = new Persona("Carlos", 50, 25); //Creamos a Carlos
        persona2 = new Persona("Javier", 100, 25); //Creamos a Javier
        
        persona1.atacar(persona2); //Carlos ataca a Javier
        
        System.out.println("A Javier le quedan " + persona2.devolverSalud() + " puntos de vida.");
    }
    
}

Si ahora ejecutamos la aplicación descubriremos que a Javier solo le quedan 75 puntos de salud (tenía 100, pero Carlos le ha atacado y tiene 25 de fuerza):

Mensaje que se imprime por pantalla al ejecutar JuegoDePeleas

En este capítulo del tutorial de programación en Java hemos aprendido lo que es una clase, un objeto de una clase y a declarar atributos y métodos para personalizarlas. Además, hemos hecho interactuar a dos objetos de la misma clase dentro del método 'main' de la aplicación.

El siguiente capítulo del tutorial, el tercero, está basado en los tipos de variables que existen en Java además de cadenas de texto y números enteros, que son los que hemos utilizado en esta última aplicación. Aprenderemos además a utilizar las estructuras de datos que nos permiten agrupar atributos que están interrelacionados por su significado.