viernes, 17 de octubre de 2014

Comunicación entre tu móvil Android y tu PC con Linux (ADB)

En algunas de mis anteriores entradas hablaba sobre la conexión entre tu dispositivo móvil y el ordenador para poder comprobar en tiempo real todos tus progresos en el desarrollo de tus aplicaciones Android. Hoy intentaré entrar en detalle en los entresijos de este proceso para Linux.

La principal herramienta de comunicación entre ambos dispositivos es ADB (Android Debug Bridge) que permite lanzar comandos y gestionar archivos o aplicaciones en tu móvil. Esta herramienta se encuentra normalmente disponible dentro de los repositorios de las principales distribuciones Linux. Sin embargo, os aconsejo que la descargueis manualmente como parte del sistema de desarrollo de Android (Android SDK) para tener un mayor control y evitar problemas de comunicación con tu dispositivo1.

1. ¿Cumplimos los requisitos?

Lo primero de todo es asegurarnos de tener instalado en nuestro sistema JDK (Java Development Kit). También puedes probar si funciona OpenJDK, aunque no está soportado oficialmente para el desarrollo de Android.

Para instalar JDK tendrás que asegurarte de que las listas de tus repositorios incluyan los “non-free”. Puedes comprobarlo en tu gestor de paquetes (Synaptic, Aptitude, etc.) o hacerlo mediante consola editando el archivo sources.list. Para Debian:
su
gedit /etc/apt/sources.list

Esto abrirá el archivo "sources.list" con tu editor de texto (en este caso gedit). Ahora, añade esta línea al final:
deb http://http.us.debian.org/debian stable main contrib non-free

Guarda el archivo y ejecuta los siguientes comandos para actualizar la lista de repositorios e instalar JDK:
apt-get update
apt-get install sun-java6-jdk

Más adelante, al ejecutar la herramienta SDK de Android, comprobaremos si existe algún problema de dependencias con las librerías de 32 bits en nuestro sistema. En caso afirmativo, será cuestión de identificarlas e instalarlas con nuestro gestor de paquetes.

2. ¿Cómo instalar la herramienta de desarrollo de Android?

Una vez se haya completado la descarga de Android SDK, procederemos a descomprimir los archivos y almacenarlos en tu directorio de trabajo (o en tu “home” si lo prefieres). Dentro de la carpeta “tools” comprobamos que el archivo “Android” tenga los permisos adecuados para poder ser lanzado (Pulsamos con el botón secundario y en la opción “Permisos” activamos “permitir ejecutar el archivo como un programa”).

Ahora, abre una terminal dentro de la carpeta donde se encuentra el ejecutable y  ejecuta:  
./Android
Al ejecutarlo a través de una terminal podemos comprobar si existe algún fallo o problema de dependencias. Si es así, toma nota de las librerías que te faltan e instálalas.
Una vez abierto, seleccionaremos a la opción “Available Packages” e instalaremos los paquetes que se encuentran seleccionados para actualizar tras aceptar sus correspondientes licencias. Cierra el programa una vez finalicen las actualizaciones.

3. ¿Cómo reconoce el PC a nuestro dispositivo móvil?

A continuación, vamos a establecer unas “reglas” para que el sistema reconozca nuestro dispositivo conectado mediante un cable USB2. Para ello, primero crearemos un archivo llamado “51-android.rules” con permisos de superusuario (su o sudo):
su
gedit /etc/udev/rules.d/51-android.rules

Con esto se crearía ese archivo y se abriría el editor de texto Gedit para editarlo. Si utilizáis cualquier otro editor de texto, cambiar “gedit” por el nombre de vuestro editor de texto (nano, vim, kate, etc.). Ahora añade la siguiente línea, aunque no cierres tu editor todavía, ya que toca personalizarla en función de tu modelo de móvil y usuario de sistema:
SUBSYSTEM==”usb”, ENV{DEVTYPE}==”usb_device”, ATTRS{idVendor}==”0bb4″, MODE=”0666″

El atributo “idVendor” es distinto para cada fabricante de móviles, así que debes utilizar el que se corresponda a tu dispositivo según la tabla que aparece al final de esta página. Si el fabricante de tu móvil no se encuentra en ella, puedes averiguarlo mediante el comando “lsusb” que nos proporciona un listado de los dispositivos usb conectados en tu ordenador. Localiza la línea que corresponda a tu dispositivo y en el apartado ID tienes dos cuartetos de números: el primero corresponde al “idVendor” y el segundo al modelo:
lsusb
Bus 003 Device 005: ID 0bb4:0c03 HTC (High Tech Computer Corp.)

En este ejemplo el idVendor es 0bb4 que corresponde a un HTC (o también Jiayu).

En el caso de Debian te tocará configurar dos cositas más:

Duplica el archivo “51-android.rules” y renombra el duplicado por “99-android.rules” (conserva ambos):
su
cp /etc/udev/rules.d/51-android.rules /etc/udev/rules.d/99-android.rules

Además, tendrás que configurar también el siguiente archivo en /lib/udev/rules.d/91-permissions.rules. Para ello:
su
gedit  /lib/udev/rules.d/91-permissions.rules 

Busca la siguiente línea de texto:
# usbfs-like devices 
SUBSYSTEM==”usb”, ENV{DEVTYPE}==”usb_device”, \ MODE=”0664″ 

Cambia el valor MODE a 0666 para que quede como abajo:
# usbfs-like devices 
SUBSYSTEM==”usb”, ENV{DEVTYPE}==”usb_device”, \ MODE=”0666″

Si has terminado de configurar estos archivos, guárdalos, ciérralos y, a continuación, reinicia el gestor de dispositivos (“udev”):
/etc/init.d/udev restart

4. ¿Qué debemos configurar en nuestro móvil?

Para que todo funcione, antes de conectar el móvil al ordenador has de activar la “Depuración USB” en tu dispositivo android. Para ello, entra en Ajustes > Opciones de Desarrollo.

Además, también debes activar la opción “Permitir la instalación de aplicaciones de origen desconocido” dentro del apartado Ajustes > Seguridad. Con esto, permitiremos que nuestra plataforma de desarrollo (Eclipse o JMonkey) cree e instale los archivos necesarios cuando construyamos y ejecutemos nuestra aplicación.

5. ¿Funciona?

Por fin podemos comprobar si nuestro esfuerzo ha valido la pena:
Enchufa tu teléfono móvil a un puerto USB. Localiza la carpeta que descomprimiste con SDK Android e ingresa en el directorio “platform-tools”. Por último, abre un terminal y ejecuta:
su ./adb devices
Recuerda que debes ejecutarlo como superusuario.

Como respuesta debemos obtener algo como esto:
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached
0123456789ABCDEF device

Si es así, ADB está correctamente configurado y funcionando. Sin embargo, si en lugar de números aparecen interrogantes primero comprueba que estés ejecutando la herramienta ADB como superusuario. Si el problema persiste, algo debe haber ido mal al definir nuestras reglas (dispositivo incorrecto) o falta alguno de los archivos de configuración:
List of devices attached
???????????? no permissions

Revisa la configuración de los archivos del punto 3 y prueba a lanzar de nuevo ADB asegurándote de hacerlo como root:
su
adb kill-server
/etc/init.d/udev restart
adb start-server
adb devices

6. ¿Cómo veo mi aplicación corriendo en el móvil?

Si todo ha ido bien y ya tienes funcionando ADB, abre cualquiera de tus plataformas de desarrollo y ponlo a prueba.

A) Eclipse:
- Haz clic con el botón secundario sobre la carpeta de tu proyecto en la ventana lateral izquierda.
- A continuación, selecciona “Run as > Android Application”.

B) JMonkeyEngine: 
- Haz clic sobre el botón secundario en la carpeta del proyecto en la ventana lateral izquierda y abre “Properties”.
- Desactiva “Compile on Save” dentro de las preferencias de tu proyecto.
- En el apartado “Application>Mobile” habilita la opción “Enable Android Deployment” y selecciona en “Android Target” la versión del dispositivo en la que vas a trabajar.
- En el apartado “Run” selecciona tu dispositivo android (“Android Device”) y ejecuta tu aplicación .

Ahora ya podrías ejecutar la aplicación con el botón “Play” de la barra de herramientas. Para finalizar el testeo, haz clic en el botón “x” que se encuentra al lado de la situación de estado en la parte inferior derecha.

Espero que dentro de lo aparentemente complejo de este tema, hayas conseguido salir indemne y con tu aplicación corriendo en tu móvil.

NOTA 1: Incluyo "su" en cada bloque de comandos para recordar que se han de ejecutar como superusuario. Evidentemente, si lo estás haciendo todo desde una misma ventana del terminal sólo hará falta que accedas como "su" la primera vez.
NOTA 2: Si tu sistema es MacOS, puedes saltarte el punto 3 en el que se configuran los archivos de reglas. Además, la instalación del paquete JDK que se explica en el punto 1 puedes hacerla de manera normal. El resto de comandos para lanzar las aplicaciones (./adb devices) es exactamente igual pero sin ingresar como superusuario. Recuerda que tienes la terminal del sistema en: Aplicaciones > Utilidades > Terminal.
_____________________
1. Un posible error es tener varias instancias de ADB en el sistema y que se encuentre en ejecución la inadecuada. Así, aunque tu dispositivo esté conectado, no será visible para la plataforma desde la que estés desarrollando tu aplicación (Eclipse, JMonkey, etc.). Para evitar problemas, el proceso de ADB que esté ejecutándose debe formar parte del SDK que se encuentra enlazado dentro de estas plataformas.
2. También puedes conectar tu dispositivo a través de Wifi. Para ello, sigue las instrucciones que se explican en DesdeLinux.

domingo, 28 de septiembre de 2014

Mars Colonial (Videojuego 3D)



Sinopsis:
Tras muchos esfuerzos y años de exploración espacial, finalmente los seres humanos hemos establecido una colonia en Marte para poder explotar sus recursos. Este anhelado sueño también nos ha revelado una inquietante pesadilla: no estamos solos en el Universo. Una sonda Von-Neumann también ha establecido su base en Marte. Este eficiente astillero automatizado es capaz de crear miles de robots ‘arácnidos’ cuya único objetivo es minar el planeta y autoreplicarse, acabando con cualquier obstáculo que se encuentre en su camino.
Marte es sólo el comienzo, todo nuestro Sistema Solar se encuentra en grave riesgo si consigue los recursos necesarios para conseguir su fin…


Descripción del juego:
Desde un punto de vista más prosaico, este juego sigue los esquemas de los clásicos juegos arcade de destruir ‘marcianos’. La mayor diferencia con éstos, es que toda la acción transcurre en un mundo infinito que simula ser Marte con modelos y escenas en 3D. Cuantos más enemigos destruyes, más aumenta tu nivel. Esto implica que pueden aparecer nuevos tipos de adversario (de momento sólo existen dos), además de que éstos irán creciendo en número y velocidad.
Existen una serie de recursos que se consumen conforme avanza la acción: munición, energía y salud. Los dos primeros se guardan automáticamente cuando acabas la partida para que dispongas de ellos al comenzar de nuevo. Estos recursos pueden reponerse en el transcurso del juego recogiendo las distintas cajas que aparecen en cuanto empiezas a carecer de alguno de ellos.
Otro de los valores que se conservan es el nivel alcanzado durante la partida, además de configuraciones como el idioma, sonido y filtros (dof y bloom).
La IA de los enemigos es bastante básica. Algunos te persiguen de manera constante provocando daños mediante el contacto con sus afiladas patas. Otros se sitúan a cierta distancia y disparan a placer. Los primeros pueden ser exterminados de un solo disparo, mientras que los segundos requieren un poco más de esfuerzo para ser derribados (tres disparos).


Algunas capturas de pantalla con el juego en funcionamiento

¿Qué herramientas se han empleado?
Este juego ha sido desarrollado básicamente con JMonkeyEngine (JME), Blender, Gimp e Inkscape.
JMonkeyEngine es un motor de juegos de código abierto y libre diseñado en Java que permite crear juegos 3D mediante ese lenguaje de programación.

Si sois lectores habituales del blog, sobre Blender, Gimp e Inkscape no tengo mucho más que añadir. El primero ha sido utilizado para crear los modelos y sus animaciones, mientras que tanto Gimp como Inkscape, se han empleado para la creación y edición de imágenes (texturas, fondos, interfaz, etc.).

JMonkeyEngine. Unos breves apuntes:
JME tiene un completo entorno de desarrollo (IDE) que utiliza todas las características de programación de la Plataforma NetBeans (autocompletado de código, herramientas de limpieza, integración VCS) y editores visuales que implementan distintas opciones y herramientas para modelos, terrenos, vehículos, etc. Además, cuenta con un completo conjunto de plugins que permiten complementar aspectos tan importantes como por ejemplo la propia interfaz del juego (Nifty GUI / XML) y que son actualizados automáticamente. Sin embargo, en este caso, he decidido no utilizar Nifty GUI y he partido de cero para implementar toda la  interfaz así como los botones y sus controles.

La incorporación de los activos o modelos digitales (Digital Art Assets) en la construcción del juego es realmente sencilla. Por ejemplo, en el caso de las imágenes basta con arrastrar desde el explorador de archivos a la aplicación. Los modelos en 3D se cargan a través de una herramienta de Importación que previsualiza el modelo, comprueba si existe algún problema y los convierte a un formato compatible llamado .j3o. Una vez importados se almacenan en la carpeta “assets” listos para ser cargados en cualquier visor, en el compositor de la escena (“Scene Composer”) o en el juego a través del “AssetManager”. Ahora tenemos todos los activos, pero ¿cómo se organizan dentro de la Escena?.


JMonkeyEngine en funcionamiento

En JME las escenas organizan todos sus datos jerárquicamente como si fueran un árbol: un padre puede tener múltiples hijos pero cada hijo solo un padre. Así, al actuar sobre el padre (mover, rotar, escalar, anexar, separar de la escena, etc.), el hijo recoge cualquiera de estas transformaciones. Por tanto, es importante planificar el esquema de tu escena desde el nodo principal (rootNode), pasando por cada uno de los nodos que vayas creando. En el último nivel se encontraría la geometría que les permite ser visibles al darles una forma, color, textura, etc.


Diagrama con la organización de la Escena

En cuanto al código, toda la programación en JME se realiza en Java, por lo que si te decides a juguetear con este programa es muy aconsejable que antes hayas adquirido unas nociones básicas en este lenguaje.

Este juego está estructurado en distintas Clases para tener más organizado todos sus elementos (jugador, enemigos, hud, sonido, etc.), separar los controles en algunos casos (p.e. la IA de los enemigos) y tener un mejor acceso y control sobre las distintas pantallas (Start, Main y Float Window). Deben existir cientos de métodos o funciones, y ya no digo de atributos o variables, que he intentado optimizar en la medida de lo posible. Sin embargo, en un proyecto tan vasto existen bastantes cosas que se escapan y que pueden derivar en algún posible bug o falta de rendimiento. Por mi parte intentaré ir mejorando estos problemas si el tiempo y las circunstancias no lo impiden.

Requisitos mínimos del juego:
Sistema operativo
Linux, Windows
Memoria (JVM tamaño de almacenamiento dinámico)
> 10 MB + memoria para los activos digitales (modelos, texturas, sonidos, etc.)
CPU
> 1 GHz
Tarjeta gráfica
AMD/ATI Radeon 9500, NVIDIA GeForce 5 FX, Intel GMA 4500, o superior con soporte para OpenGL 2.0 o superior (las bibliotecas nativas se incluyen en la descarga)
Java (Entorno de ejecución)
Java 5 o superior
Es necesaria una máquina Virtual Java (JVM) para ejecutar los juegos JME.
Normalmente JVM se encuentra preinstalado en la mayoría de equipos, aunque puede obtenerse gratuitamente desde http://www.java.com

Instalación:
El juego puedes descargarlo de manera gratuita desde sourceforge.

•  Linux
Descarga el juego, descomprime la carpeta y ejecuta “MarsColonial.sh”.
Si tienes un sistema basado en Debian, también tienes la opción de instalarlo mediante un paquete “.deb”.

•  Windows
Descarga el juego, descomprime la carpeta y ejecuta “MarsColonial.exe”.

•  MacOSX
Descarga el juego, descomprime la carpeta y ejecuta “MarsColonial.app”.

Controles del juego (Atajos de Teclado):
•  W, S, A, D o teclas de dirección: Movimiento del jugador.
•  Barra espaciadora: Disparo.
•  X: Cambiar la posición de disparo del arma.
•  M: Activar o desactivar el sonido.
•  P: Hacer una pausa o continuar con el juego
•  Esc: Cerrar el juego.

Saludos y espero que paséis algún buen rato con él.

AddThis