miércoles, 29 de mayo de 2013

Gamekit: Crea juegos para Android desde Blender

Si en mi anterior entrada abordaba la realización de juegos y aplicaciones para Android con AppInventor, ahora analizaremos otra herramienta que también tiene un gran potencial y que permite desarrollar juegos para Android desde el propio Blender: Gamekit

Gamekit es un motor básico de videojuegos que integra dentro de Blender a Ogre para la construcción de gráficos (también existe una versión para Irrlicht), Bullet para las físicas y Open AL para el sonido. Esta integración con Blender le permite aprovechar muchos de sus elementos como Materiales, Iluminación o incluso los propios ‘logic bricks’ a la hora de desarrollar el juego.

Además, también permite la integración en otras plataformas como Linux, Windows, OSX o el propio Android mediante Eclipse. Tiene una gran versatilidad en el apartado de programación, ya que la lógica del juego puede realizarse, no sólo con los propios ‘logic bricks’ de Blender, sino también, a través de C++ y Lua.

Instalación:
Para probar GameKit no es necesario instalar nada. Sólo has de descargar el archivo que se corresponda a tu sistema operativo y descomprimirlo. Dentro de la carpeta descomprimida podrás observar una serie de archivos:
- ‘momo_ogre.blend’ es el propio juego hecho con Blender (escena y personajes).
- ‘Ogrekit’ es el ejecutable ya compilado.
- ‘OgreKit.log’ y ‘OgreKitStartup.cfg’ son los archivos de configuración del juego.

Una captura con el archivo de demostración momo_ogre.blend en funcionamiento

Para hacerlo funcionar sólo has de lanzar el ejecutable. De hecho, incluso podrías empezar a hacer pruebas con tus propios archivos sustituyendo el archivo ‘momo_ogre.blend’, aunque conservando ese nombre. Eso sí, primero es conveniente ver cómo funciona este motor a nivel de ‘logic bricks’ y materiales, porque no vale todo y existen ciertas reglas a la hora de desarrollar el juego para que GameKit pueda hacerlo funcionar correctamente.

Integración de GameKit en Blender:
Efectivamente, para que podamos comprobar al momento nuestros avances en el desarrollo, lo realmente cómodo es trabajar con este motor desde dentro del propio Blender. Para ello, lo incorporaremos como un 'Addon' dentro del propio programa.
Dentro del archivo comprimido que has descargado anteriormente deberías tener una carpeta llamada ‘BlenderAddon’. Debes copiar esos archivos en la carpeta donde tengas instalados los AddOn de Blender (archivos y carpetas en sus respectivos directorios) o si lo prefieres instalarlo desde el propio Blender:
- File > User Preferences > Addons > Install from File (localizando esos archivos)
Una vez instalado has de habilitar el plugin en esa misma ventana. Además, debes tener la carpeta de archivos temporales apuntando a una ruta correcta:
- File > User Preferences > File > Temp:'ruta de tu carpeta temporal'
Ahora GameKit debería aparecer en la lista desplegable de los motores de Render, así que cambiamos de ‘Blender Render’ a ‘GameKit’.
En la ventana lateral de ‘Render’ deberíamos ver las opciones de Gamekit. Es muy importante indicar la dirección del ejecutable en ‘Runtime’, porque de lo contrario nos dará un error.

Si todo ha ido bien, ya podemos lanzar Gamekit a través del botón ‘Start Game’, el cual abrirá una nueva ventana con nuestra escena empleando ese motor de juegos en lugar del motor de Blender.

Captura con una vista de Gamekit integrado en Blender

Integración con Eclipse:
Bueno, ya has estado un rato trasteando con él y ves que tiene buena pinta. Aunque de momento no hay rastro de Android por ningún lado... vamos con ello:
En primer lugar necesitas volver a la página de descargas del proyecto para conseguir el archivo ‘GameKit-Android-EclipseProject-v7a-r1119.zip’. Una vez descomprimido verás dos carpetas: una con el plugin para Blender y otra llamada ‘gkAndroid’ que es la que contiene los archivos del proyecto. Recuerda dónde guardas la carpeta ‘Gamekit-Android’ porque luego has de apuntar hacia ella para configurar tu proyecto.
Ahora utilizaremos Eclipse como entorno de desarrollo, así que si todavía no lo tienes instalado, es el momento de hacerlo y comprobar que tenga correctamente instaladas las herramientas para Android (ADT Plugin).
Además, como comentaba en mi anterior entrada, si tienes tu propio Tableta puedes conectarla mediante ‘ADB’ (una vez hayas instalado el SDK de Android) para poder ver al momento los resultados de tus modificaciones. También es posible trabajar a través de un emulador de Android o dispositivo virtual, aunque seguramente puede surgir más de un error con algunas librerías y finalmente no cargar tu juego (además de otras carencias como por ejemplo el acelerómetro).

Una vez esté todo listo, necesitarás crear un nuevo proyecto en Eclipse para Android. Para ello:
- Inicia Eclipse
- File > Import > General > Existing Projects into Workspace > Next
- Navega hasta la carpeta ‘gkAndroid’ que has descomprimido antes > Ok
- Selecciona GamekitAndroid > Finish
- Ahora verás en la ventana lateral izquierda una lista con los archivos del proyecto.


Cargando un nuevo proyecto en Eclipse

Para ejecutar el archivo de demostración:
- Haz clic con el botón secundario sobre tu proyecto (en la ventana lateral) > Run as > Android Application.
- Ahora deberías ver a Suzanne saltando en una pequeña escena llena de obstáculos y que puede ser controlada mediante el acelerómetro de tu Tableta.

Para ejecutar tus propios archivos:
- Copia tu archivo ‘.blend’ dentro de la carpeta ‘assets’ y renómbralo como gk_android.blend
- Si lo has hecho desde fuera de Eclipse (el navegador de archivos de tu sistema), tendrás que refrescar los archivos de tu proyecto: clic derecho sobre tu proyecto > Refresh
- Ahora cuando lo ejecutes podrás ver tu propia escena funcionando en la Tableta.

Es bastante aconsejable conservar una copia de todos los archivos originales. Así, podrás observar su estructura y cómo están realizados, ya que dan muchas pistas que pueden ser utilizadas como base para tus propios trabajos.

Conclusiones:
Con todas estas premisas y después de trastear un poco, el resultado ha sido un poco agridulce. En efecto, en los últimos meses parece observarse un descenso en la actividad de desarrollo dentro de ese proyecto. Este parón limita bastante las opciones para realizar algún juego más elaborado, puesto que muchas de las características que ya están reportadas podrían dar un salto cualitativo importante al proyecto. Así las cosas, las limitaciones actuales son un escollo importante si quieres realizar algún juego más elaborado.

Videojuego de prueba desarrollado con Gamekit en Blender para Android

Destacaría algunos inconvenientes detectados durante la realización del juego de prueba (y que deberíais tener en cuenta si os lanzáis a la aventura):
- De momento, no soporta eventos multitáctiles. Problema importante cuando intentas configurar botones de control simultáneos.
- El sonido para  Android no está configurado de serie, ya que existen ciertos problemas de licencia en las librerías OpenAL para Android.
- Las sombras están deshabilitadas en la versión para Android.
- No acaba de soportar de manera correcta las imágenes con mapas de Normales dentro de los Materiales.

Como ventajas destacaría naturalmente la integración con Blender y sus ‘logic bricks’, la posibilidad de utilizar un motor de juegos tan potente como Ogre dentro del propio Blender y, sobretodo, su capacidad multiplataforma a la hora de exportar los juegos.


Algunos enlaces de interés sobre Gamekit:
- Página oficial del proyecto: http://code.google.com/p/gamekit
- Para acceder directamente a todas sus descargas: http://code.google.com/p/gamekit/downloads/list
- Documentos de ayuda en formato .chm
- Foro oficial donde puedes resolver muchas de tus dudas: http://gamekit.org/forum/

_______________________________________________________

ADENDA.
En este apartado iré añadiendo material que ayude a resolver algunas de vuestras dudas que me habéis hecho llegar en vuestros comentarios.

Adenda 1. Sobre eventos de teclado en Blender:
Para simular 'Touch Events' mediante los 'Logic Bricks' de Blender puedes utilizar una combinación de dos sensores tipo 'Mouse':
- 'Left Button' simula el clic.
- 'Mouse Over' determina la posición del cursor sobre el objeto.


Adenda 2. Un modo sencillo de abrir tus modelos de Blender en Android
Desde el siguiente enlace podrás descargar un archivo .apk que permite visualizar tus archivos de Blender en Android (con algunas limitaciones, claro):
http://download.blender.org/demo/android/BlenderPlayer_08_02_12_4.apk

INSTALACIÓN
- Asegúrate que tienes activada la opción de permitir la instalación de aplicaciones de origen desconocido en tu dispositivo Android (Ajustes > Seguridad).
- Copia el archivo .apk que has descargado a tu dispositivo Android e instálalo como una aplicación normal.
- Copia los juegos que quieras ejecutar también en tu dispositivo (Deben tener la extensión .blend).

EJECUTAR JUEGO
- Abre BlenderPlayer (la aplicación que se habrá instalado en tu dispositivo). Selecciona el archivo .blend que contiene tu juego o modelo y haz clic en StartBlenderPlayer.
- También puedes localizar tu archivo .blend con un explorador de archivos > Abrir .blend > Con BlenderPlayer.


25 comentarios:

  1. Muy pero muy buena entrada sobre este motor del cual existe poca documentación al respecto, por cierto has probado compilar la ultima versión del SVN?

    Según he visto en el log han realizado un puñado de cambios sin frecuentemente.

    Me gustaría recomendarte el motor llamado enchantjs el cual esta cobrando una fama enorme dentro de Japón y que hace no mucho esta siendo mostrado a nosotros los del nuevo continente XD

    http://enchantjs.com/es/


    Uno de sus grandes desarrolladores fue conmemorado oficialmente como "genio desarrollador" en Japón! eso me da más confianza en usar este motor jejeje, pero la parte que más me gusta de este prometedor framework es su licencia MIT.

    Puedes probarlo online en esta pagina que funciona como una especie de introducción bastante rápida y efectiva :)

    Saludos

    ResponderEliminar
    Respuestas
    1. Pues lo compilé en su momento (hace un par de meses o así) y tampoco logré solucionar algunos de las carencias que menciono.

      Sin embargo, es cierto que ahora mismo se ve algo más de actividad en el proyecto (de hecho, hay cambios incorporados ayer). Desde luego sería estupendo que este proyecto continuara evolucionando, porque lo de integrarlo en Blender tiene un potencial increible.

      Respecto al motor enchantjs no lo conocía en absoluto, pero tiene muy buena pinta. Le dedicaré un rato a investigarlo y trastearlo... tendré que arañar algo de tiempo :P

      Saludos

      Eliminar
  2. Tiene buena pinta, pero estaria bien que se pudiese crear el juego desde la propia tableta, no digo un movil, pero una tableta con un teclado y conexion HDMI, pues no veo por que no... En fin casi esperare a que funcione el mismo blender.

    ResponderEliminar
    Respuestas
    1. No te digo que dentro de un tiempo se acaben desarrollando juegos desde dentro de la propia tableta o incluso del móvil.

      Sin embargo (llámame anticuado si quieres) todavía veo mucho más cómodo y productivo realizar este tipo de trabajo (al igual que modelar en 3D) en un ordenador de sobremesa.

      Hoy por hoy, podría ser útil en algún retoque esporádico o demostraciones, pero ponerse a picar código o mover vértices con la tableta durante horas lo veo "un poco" duro.

      Respecto a lo de esperar a que Blender acabe dando el paso para su motor en Android. Es cierto que están en ello, pero como tampoco se han fijado plazos, nunca está de más que se desarrollen otras alternativas funcionales. A fin de cuentas, en la variedad está el gusto ;)

      Saludos

      Eliminar
  3. Hola, ¿cómo crees que quedaría tu steampac 3d en android con gamekit?
    ¿has probado esto: http://blenderartists.org/forum/showthread.php?255746-GSoC-2012-Android-Blenderplayer-Port-with-OpenGL-ES-%282-0%29?

    ResponderEliminar
  4. A la primera pregunta: habría que reestructurar el sistema de bloques para adaptarlos al modo de funcionamiento en gamekit. Además, casi con total seguridad, tendría problemas con los bloques de la IA de los enemigos o directamente dejaría de funcionar (los bloques tipo Actuador 'Steering' no iban finos en Gamekit). Como remate, estaría el problema de la implementación del sonido :(
    A la segunda pregunta: lo probé en su momento y no iba del todo mal. Sin embargo, el tamaño de la aplicación era desmesurado para lo que se ve normalmente en la Google Play y eso es un grave contratiempo en dispositivos con pocos recursos.
    Saludos.

    ResponderEliminar
  5. Amigo, gracias por la información. Soy programador de videojuegos (recién iniciado) y estaba buscando precisamente una forma de programar videojuegos en blender (para Android). Un saludo.

    ResponderEliminar
  6. Me alegra que esta entrada pueda resultarte útil ;)

    ResponderEliminar
  7. Angel Sánchez, buenas noches sucede que tengo una tablet y pues su sistema operativo es Andorid y quiero hacer un ejecutable en blender de un modelo simple
    y poderlo ejecutar en la misma, pero por mas que he leido su blog no he podido hacer que funcione.


    Nota: conozco un poco de Eclise y de Blender también, se como hacer un ejecutable. Y tengo entendido que existe un aplicación .apk que se llama blenderplayer para android pero no
    he podido encontrarla en la red...


    Gracias, un saludo y un abrazo desde Colombia.

    ResponderEliminar
  8. Desde el siguiente enlace podrás descargar el archivo .apk de Blender que buscas:
    http://download.blender.org/demo/android/BlenderPlayer_08_02_12_4.apk

    INSTALACIÓN
    - Asegúrate que tienes activada la opción de permitir la instalación de aplicaciones de origen desconocido en tu dispositivo Android (Ajustes > Seguridad).
    - Copia el archivo .apk que has descargado a tu dispositivo Android e instálalo como una aplicación normal.
    - Copia los juegos que quieras ejecutar también en tu dispositivo (Deben tener la extensión .blend).

    EJECUTAR JUEGO
    - Abre BlenderPlayer (la aplicación que se habrá instalado en tu dispositivo). Selecciona el archivo .blend que contiene tu juego o modelo y haz clic en StartBlenderPlayer.
    - También puedes localizar tu archivo .blend con un explorador de archivos > Abrir .blend > Con BlenderPlayer.

    ResponderEliminar
  9. Buenas Noches Angel, que gusto que me diera esa solución y me enviara el BlenderPlayer muchas gracias, es una maravilla.
    Me disculpo porque no me fijé en la ortografía del anterior correo, ahora queda en mi seguir creando en Blender.

    Un abrazo desde Colombia,
    Pablo Felipe Narváez M. Ing Electrónico. Universidad Nacional de Colombia.

    ResponderEliminar
  10. ¿Para que ocurra algo cuando toque la pantalla...se debe poner el evento touch o el evento mouse en el game logic?
    Saludos y muy buen post

    ResponderEliminar
    Respuestas
    1. Hola Frank
      Al final de esta entrada he añadido información sobre la cuestión que planteas: Adenda 1. Sobre eventos de teclado en Blender.
      Espero que te sea de utilidad.

      Eliminar
    2. ah,es verdad
      muchas gracias!!!

      Eliminar
  11. Disculpa Angel,es que cuando hago el paso de Run as... Android Application en Eclipse me aparece el siguiente error en el apartado Console:
    Installation failed due to invalid APK file!
    Please check logcat output for more details.
    Launch canceled!
    Me pasa incluso cuando intento reproducir el archivo de prueba en el emulador.
    ¿A qué se puede deber esto?¿Sabes como podría solucionarlo?¿Quizás me falta algo por instalar?
    Muchas gracias

    ResponderEliminar
    Respuestas
    1. Comprueba que hayas instalado bien el SDK de Android y que no estés utilizando un dispositivo no soportado o demasiado antiguo. Si lo anterior está bien, prueba a limpiar el proyecto y reconstruirlo (Project >Clean > Rebuild).

      Eliminar
    2. He probado a limpiar el proyecto y nada...tengo un smartphone con Android 2.3 y el target de Gamekit es 2.2...no sé que ocurre.
      Cuando conecto el smartphone es reconocido y cuando pincho en Run as ...Android Application sale el error "install_failed_cpu_abi_incompatible"
      ¿Sabes que quiere decir?
      Muchas gracias y disculpas

      Eliminar
    3. Vale, ya vamos acotando el problema: ese error surge al intentar instalar una aplicación Android en un dispositivo con una arquitectura CPU no soportada. Mírate esto y a ver si hay suerte:

      http://blog.iteedee.com/2014/02/android-install_failed_cpu_abi_incompatible-intellj/

      Eliminar
  12. Hola Ángel, gracias por lo del Touch, logre hacerlo funcionar solo con el sensor "Mouseover", ahora esta el dilema del sonido, estoy tratando de agregarle sonido al proyecto con un pequeño escript Lua y pasando los parámetros con el actuator "Message" si tienes algo que aconsejarme lo agradecería mucho. Eso de los problemas de las licencias de OpenAL y android es una mierda jejeje

    en cuanto termine si alguien necesita la prueba de sonido solo pedirlo Saludos desde
    Republica Dominicana.

    ResponderEliminar
    Respuestas
    1. ¿Puedes pasarme el codigo de script lua? Lo intento poner en blender usando logic brick pero no me funciona, y si me puedes darme algun consejo de como debería de funcionar a la primera. Muchas gracias.

      Es la primera vez que escribo en este chat, si pudieras escribirlo directamente aqui sería genial, gracias.

      Eliminar
  13. Hola Angel, buenas noches, sucede que estoy haciendo una miniplataforma para visualizar los objetos que hago en blender en la tablet, el problema que tengo es sobre la asignación de eventos del mouse, hace un tiempo encontré un archivo blender en la web creado en una versión de blender inferior al blender 2.6, he aquí en problema porque este archivo no corre en blender 2.65, he leido mucho y transcribí el código al blender 2.65 pero resulta que me saca un error que habla sobre un 'atribute' que usaron para el código:
    _____________________________________________________________________

    import bge

    Logica=bge.logic
    cont = Logica.getCurrentController()
    object = cont.owner

    #Sensores: Mouse, movimiento y boton izquierdo:

    mousemove = cont.sensors["mousemove"]
    mousebutn = cont.sensors["lmb"]

    if mousebutn.positive == 1:

    if object.first == 1:
    object.first = 2
    if object.first == 0:
    object.init= mousemove.getYPosition()
    object.sa= object.angle / object.sens
    object.first = 1

    nmousex = mousemove.getYPosition() - object.init + object.sa

    a= nmousex * object.sens

    if object.min != object.max:
    if a < object.min:
    a = object.min
    if a > object.max:
    a = object.max

    if a < 0.0 and a < object.min:
    a= a + 360.0
    if a > 360.0 and a > object.max:
    a= a - 360.0

    object.angle= a

    if mousebutn.positive == 0:
    object.first = 0

    _____________________________________________________________________
    El error es el siguiente: AttributeError: 'KX_GameObject'
    object has no attribute 'first'

    La verdad no se que hacer para que funcione en el Blender 2.65?
    En este link donde dejo los archivos el archivo .blend original que funciona en Blender 2.48 y el archivo .blend, llamado Mouse_House que abre con Blender 2.65, este es en el que estoy trabajando.

    https://www.dropbox.com/s/qdqycwomfoz52ab/House.zip

    Un saludo y un abrazo desde Colombia.

    ResponderEliminar
  14. El problema de utilizar códigos realizados para versiones tan antiguas de Blender es que probablemente no funcionarán en versiones más nuevas. Además, como ya estarás comprobando, intentar adaptarlos puede ser un auténtico quebradero de cabeza.
    Hace bastante tiempo que no miro nada de Python, aunque parece que se trata de un código para rotar la vista alrededor de un objeto... yo probaría a intentar implementar algún código más reciente como por ejemplo este para la versión 2.66:
    http://riyuzakisan.weebly.com/mousemove-script.html#download
    En cualquier caso, desmenuza la escena y comprueba que no haya ninguna propiedad suelta que se te haya quedado por definir en los objetos que necesite el código para funcionar.

    ResponderEliminar
  15. En realidad a veces si es necesario instalar DirectX SDK para que funcione AppOgrekit.exe

    ResponderEliminar
  16. Hola, como puedo hacer el script que muestra el marcador (score) gracias

    ResponderEliminar
  17. Hola, gran aporte. Una duda:
    Si mediante scripts en el suzane saltarin lograron obtener valores numericos del acelerómetro del movil para convertirlos en la velicidad de movimiento del suzane, habrá alguna forma de obtener las coordenadas del toque en la pantalla tactil en valores numéricos? Si lograra hacer ese script, seria uno culla finalidad es devolver en dos diccionarios (objeto de python) o cualquier otro tipo de objeto, las coordenadas del ó los toques en valores numéricos para usar esos valores en un script python.

    ResponderEliminar

¡Me gusta conocer tu opinión! Pregunta si tienes alguna duda, sugerencia o encuentras algún error.

AddThis