martes, 1 de marzo de 2016

Android app - Snake 2000: Classic Nokia game (1997)

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.

viernes, 29 de enero de 2016

#01 Programación Java - Introducción: Instalación y "Hola Mundo"

En este primer capítulo del tutorial de programación básica en Java vamos a aprender lo mínimo que un programador debe saber para hacer compilar una aplicación en Java:

  • Instalar el entorno de programación donde escribiremos nuestro código Java.
  • Crear nuestra primera aplicación en NetBeans.


Instalación de NeatBeans: entorno de programación Java


Una vez estamos listos para aprender a programar en Java desde cero es el momento de instalar el entorno de programación donde vamos a escribir nuestro código. Este, NetBeans en nuestro caso, viene a ser un programa muy parecido a un editor de textos como el bloc de notas o Word (de Microsoft), pero especialmente diseñado para escribir código, ya que nos marcará las palabras de un color u otro dependiendo de si son de un tipo o de otro. El principal objetivo de utilizar un entorno de programación es agilizar el trabajo y facilitar la búsqueda de fallos en el código.

Haciendo click en la página oficial de NetBeans llegaremos a la sección de descargas. Una vez allí, pulsaremos el botón download bajo la opción Java SE.

IDE Java
Descarga de Netbeans para Java

Después de descargar el programa abrir el ejecutable, aceptar los términos y condiciones y elegir una carpeta destino, habremos instalado NetBeans y ya estaremos listos para empezar a programar.


Crear un proyecto Java en NetBeans


Una vez tengamos el programa instalado lo abriremos y pulsaremos sobre la pestaña File > New proyect o pulsaremos Ctrl + Mayús + N para crear un nuevo proyecto.

nuevo proyecto netbeans
Pulsamos en File > New Proyect

En la ventana que aparece seleccionaremos la categoría Java y dentro de esta indicaremos que se trata de un proyecto Java Application.

aplicacion java netbeans
Elegimos la categoría Java y el proyecto Java Application

Después de seleccionar un nombre para el proyecto (que será el de la aplicación) y la ruta de la carpeta en la que va a permanecer el código dejaremos marcada la opción Create Main Class (explicaremos para qué sirve más tarde) y pulsaremos en Finish para terminar con el proceso de creación del proyecto.

opciones del proyecto java
Escribimos un nombre y una carpeta para el proyecto. Dejamos la casilla Create Main Class seleccionada.


 Estructura de un proyecto Java en NetBeans


Junto con el nuevo proyecto han aparecido otros elementos en la ventana de NetBeans que conviene aclarar para saber dónde nos encontramos:

estructura netbeans
1. Contenido de la clase; 2. Carpeta del proyecto; 3. Herramientas de compilación y ejecución

  1. En la primera ventana observamos las primera líneas de código de nuestra aplicación. Estas no son ni más ni menos que el contenido de la clase 'MiPrimeraAplicación.java'. Para el que no conozco la sintaxis de Java, las partes del texto entre '/**' y '*/' o seguidas de  doble barra '//' son comentarios y NetBeans los escribe en gris para crear la sensación de que son menos importantes que el resto del código (en parte es así, un comentario es una anotación del programador para recordar cómo funcionaba una un método o algoritmo. Aunque no hay mucho que entender, es normal que nos asuste el código si es la primera vez que lo vemos. En los siguientes capítulos iremos explicándolo por partes.
  2. El apartado marcado con un dos en la imagen anterior hace referencia a la carpeta del proyecto y nos muestra los diferentes archivos que en él se encuentran. En esta primera mirada a NetBeans basta con saber que un proyecto es un conjunto de clases (cada una con su propio código). Podemos observar que al crear un proyecto solo se crea una clase con el mismo nombre que la aplicación, en este caso 'MiPrimeraAplicación.java'.
  3. En tercer lugar encontramos la barra de herramientas de compilado. El botón más importante es el de 'play' que compila y ejecuta nuestro código si no tiene ningún error. En caso de contar con algún fallo tendremos que localizarlo en entre las líneas de nuestras clases y corregirlo. El resto de botones de la esta barra tienen funciones similares: construir la aplicación como ejecutable, construir el ejecutable y depurar, etc.


Tu primera aplicación Java: "Hola Mundo"


En capítulos posteriores seguiremos explicando los detalles del código que se ha generado automáticamente en nuestra clase 'MiPrimeraAplicación.java' al crear el proyecto, pero de momento vamos a escribir nosotros algo de código para hacer funcional la aplicación y daremos por terminada la primera parte del tutorial.

Hasta ahora tenemos:

  • Un nuevo proyecto 'MiPrimeraAplicación' que solo contiene la clase 'MiPrimeraAplicación.java' (que a su vez contiene el código que hemos visto anteriormente).
  • Dentro de 'MiPrimeraAplicación.java' encontramos la línea public static void main (String[] args) que encierra un comentario entre dos llaves (que delimita su dominio o scope).
public class MiPrimeraAplicación {
    /**
    * @param args the command line arguments
    */
    public static void main(String[] args) {
        // TODO code application logic here
    }
}
  • Como veremos en el capítulo siguiente, las clases tienen métodos que pueden ser públicos o privados, static o no, etc (como main en este caso), que son funciones que realizan una tarea determinada. Si ponemos atención en el código que se encuentra entre las llaves del método main veremos que sólo es un comentario (línea 6), pues está precedido de una doble barra, y por tanto es una función vacía. En este punto, podemos pulsar el botón de Play de la barra de herramientas de NetBeans las veces que queramos, pero nada sucederá, pues aunque la aplicación ya está creada, la función que se ejecuta, el método main, está vacío (recordamos que los comentarios son anotaciones del programador y una función con solo comentarios no lleva a cabo ninguna acción).
  • A continuación vamos a borrar el comentario y a añadir una línea en su lugar que imprimirá por pantalla el mensaje "¡Hola mundo!". La instrucción para mostrar un mensaje por pantalla es System.out.println("MENSAJE") y el código de la clase 'MiPrimeraAplicación.java' quedaría de la siguiente manera:
public class MiPrimeraAplicación {
    /**
    * @param args the command line arguments
    */
    public static void main(String[] args) {
        System.out.println("¡Hola mundo!");
    }
}
Si nos fijamos en el código anterior, hemos entrecomillado el mensaje que queríamos escribir por pantalla y terminado la instrucción con un punto y coma. Todo esto es debido a las reglas en la sintaxis de Java. Cada lenguaje de programación tiene las suyas, pero gran parte de ellos guardan puntos en común: las instrucciones terminan con punto y coma, las cadenas de texto (Strings) se escriben entre comillas, etc.

Si finalmente pulsamos el botón de ejecutar la aplicación (triángulo verde de Play) en la barra de herramientas de NetBeans, veremos que todo funciona correctamente y que tras compilarse aparece el mensaje ¡Hola mundo! por pantalla e inmediatamente termina la ejecución, pues no hay más instrucciones que leer dentro del método main de la clase 'MiPrimeraAplicación.java'.

primera aplicación java hola mundo
El mensaje se muestra por la consola de NetBeans

Quizá esta no era la forma de la que esperabais que se mostrara el mensaje, pero una aplicación sin componentes gráficos también es una aplicación y es muy importante tener los conceptos básicos claros para seguir adelante en el curso sin problemas de entendimiento.

En el próximo capítulo veremos qué son las clases, objetos y funciones en Java y construiremos una aplicación que tiene más de un objeto, así como para estudiar su interacción. Espero que la explicación haya valido la pena y todo el mundo sepa ahora cómo crear un nuevo proyecto Java en NetBeans (el entorno de programación).