lunes, 14 de noviembre de 2011

Heads Or Tails en el Market

Desde ayer la versión 0.2 de Heads or Tails esta disponible para su descarga desde el Android Market. Podéis acceder a su web en el Market en el siguiente enlace (https://market.android.com/details?id=com.app.headortails). Para cualquier problema o sugerencia no dudéis en comentarlo por aquí.

lunes, 17 de octubre de 2011

Version 0.2

Ya esta disponible la versión 0.2 de Heads or Tails. Entre sus novedades se ha incluido una pantalla de inicio y se ha mejorado la velocidad de carga de las imágenes. Podéis descargarla desde aquí junto como el código fuente que esta disponible en el repositorio.

Entre las tareas para la siguiente versión intentaré incluir alguna moneda nueva y algún interfaz para su selección además en los próximos días trataré de subir la app al Market de Android.

domingo, 2 de octubre de 2011

Código primera versión

Ya esta disponible el código de la primera versión en el repositorio SVN de Google Code. Por supuesto si alguien se anima a mejorar la aplicación, crear nuevas animaciones, sonidos o lo que sea esta invitado a unirse al desarrollo.


viernes, 30 de septiembre de 2011

Primera versión Heads or Tails

Acabo de subir al repositorio del proyecto la primera versión de la app. Aunque muy básica si que cumple con su funcionalidad principal que es mostrar cara o cruz con la animación de una moneda. Podéis descargarla de momento desde aquí aunque trataré de publicarla en el Android Markt a lo largo de las próximas semanas. Por otro lado también subiré el código este fin de semana al repositorio para que cualquiera le pueda echar un ojo. Os dejo una captura de la app en el emulador para Eclipse:


Por supuesto si encontráis algún error o tenéis alguna sugerencia no dudéis en comentar.

miércoles, 28 de septiembre de 2011

Animación de sprites en libGDX

El funcionamiento de la aplicación se basa en que debe mostrar una moneda y como gira una serie aleatoria de veces.

Aunque se podría haber hecho de diferente manera en el caso de la primera versión de esta animación la realizaremos mediante un sprite para lo que en primer lugar debemos contar con una imagen en la que se define cada uno de los frames que definiran esta animación. En el caso de la moneda de Head or Tails es la siguiente imagen:

Para utilizar cualquier imagen en libGDX esta debe tener un tamaño en pixeles múltiplo de potencia de 2 (p.ej. 64x64, 128x256, etc.). Y dentro del proyecto en Eclipse, al igual que para cualquier recurso adicional se deberá poner en la carpeta assets o una subcarpeta en este.

Ahora ya podemos empezar a programar la animación de la moneda. Dentro de la clase ViewCoin que se creo al crear el proyecto se debe implementar los métodos create() y render().

En primer lugar se crean las variables y constantes necesarias:


    // Constantes que definen el número de columnas y filas que definen los frames de la imagen.
    private static final int        FRAME_COLS = 5;
    //Hay que tener en cuenta que en nuestro caso el número de filas real es 4.
    private static final int        FRAME_ROWS = 5;
    // Objeto que define los propiedades de la animación.
    Animation coinAnim;
    // Imagen que contiene la imagen cargada.
    Texture coinSheet;
    // Array con cada uno de los frames definidos en la imagen.
    TextureRegion[] coinFrames;
    // Objeto que se encarga de dibujar la imagen (en nuestro caso región de la imagen (es decir cada frame)).
    SpriteBatch spriteBatch;
    // Frame que se dibuja actualmente en la pantalla.
   
TextureRegion currentFrame;
     // Tiempo transcurrido desde el inicio de la animación.
    float stateTime;

 En el caso del método create(), se carga la imagen y a partir de esta se define cada uno de los frames de la animación teniendo en cuenta que la última fila de la imagen está vacía, lo que se muestra en el siguiente código:

public void create() {
        // Se carga la imagen desde la imgs en la carpeta asstes
        coinSheet = new Texture(Gdx.files.internal("imgs/hot_coin_anim.png"));
        // Se divide primero en un array bidimensional de frames que convertimos a uno unidimesional que es el que puede tratar libGDX.
       
TextureRegion[][] tmp = TextureRegion.split(coinSheet, coinSheet.getWidth()/FRAME_COLS, coinSheet.getHeight()/FRAME_ROWS);
        coinFrames = new TextureRegion[FRAME_COLS * (FRAME_ROWS - 1)];
        int index = 0;
        // !! La última fila no se carga.
        for (int i = 0; i < FRAME_ROWS - 1; i++) {
            for (int j = 0; j < FRAME_COLS; j++) {
                    coinFrames[index++] = tmp[i][j];
            }
        }
        // Se define la animación con un tiempo entre frames de 0.035 segundos y los frames cargados.
        coinAnim = new Animation(0.035f,  coinFrames);
        spriteBatch = new SpriteBatch();
        stateTime = 0f;
    }


Por último en el método render() se define, según el tiempo que haya pasado desde la última transición entre frames, el frame actual y se dibuja en la región de la pantalla deseada:

    public void render() {
                // Se limpia la pantalla.
               
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
                // Se selecciona el frame actual.
                stateTime += Gdx.graphics.getDeltaTime();
                currentFrame = coinAnim.getKeyFrame(stateTime, true);
                // Se dibuja.
                spriteBatch.begin();
                spriteBatch.draw(currentFrame, 50, 50);
                spriteBatch.end();
    }

Si ejecutamos el proyecto nos debería aparecer una moneda que gira constantemente desde que se inicia la aplicación.

lunes, 26 de septiembre de 2011

Primeros pasos con libGDX

Al final me he decidido por utilizar el motor libGDX para desarrollar la app, sobre todo porque, a parte de ser multiplataforma, integra todos los elementos necesarios para aprovechar al 100% las caracteristicas adicionales con la que suele contar un smartphone (compás, acelerometro, etc); además es compatible con Android 1.5 (a excepción de los wrappers para OpenGL 2.0) y está en constante desarrollo.

Lo primero que debemos hacer es descargar libGDX. Para ello, o bien nos podemos bajar el nightly build o la ultima versión oficial (0.9.2 a día de hoy). Después una vez creado el proyecto en el que queremos utilzar libGDX para configurar ecplise tan solo debemos seguir los siguientes pasos:
  • Dentro del proyecto crear la carpeta libs. Copiar en ella los archivos gdx.jar, gdx-sources.jar, gdx-backend-android.jar y los directorios armeabi y armeabi-v7a.
  • Actualizar la carpeta en el proyecto (botón secundario - Refresh).
  • Añadir la librería al proyecto para ello, botón secundario - Properties - Java Build Path - Libraries - Add JARs y seleccionamos los ficheros gdx.jar y gdx-backend-android.jar. 

Con esto ya tenemos el proyecto listo para trabajar con la librería. En primer lugar crearemos la clase a partir del interfaz ApplicationListener (en nuestro caso ViewCoin) que se encarga de manejar el juego y dibujar todos los gráficos necesarios. Si utilizamos el interfaz de creación de clases nuevas de Eclipse nos deberá quedar algo como:


import com.badlogic.gdx.ApplicationListener;



public class ViewCoin implements ApplicationListener {

    public void create() {
        // TODO Auto-generated method stub
    }

    public void dispose() {
        // TODO Auto-generated method stub
    }

    public void pause() {
        // TODO Auto-generated method stub
    }

    public void render() {
        // TODO Auto-generated method stub
    }

    public void resume() {
        // TODO Auto-generated method stub 
    }
}


Para ejecutar este juego (que de momento solo mostrará una pantalla en negro) se debe crear una clase que herede de AndroidApplication y en la que se debe crear una instancia de la clase anterior e iniciar con ella la librería con el método heredado de la siguiente forma:

import com.badlogic.gdx.backends.android.AndroidApplication;

public class HeadsOrTailsApp extends AndroidApplication {
     public void onCreate (android.os.Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
        // Donde el segundo parámetro indica si se quiere trabajar con
        // OpenGL 2.0. (Android 2.0 o superior)
         initialize(new ViewCoin(), false);
     }
}

En la próxima entrada comentaré como dibujar algo (en este caso el spirte de la moneda animada) ya que si ejecutamos el proyecto creado lo único que aparecerá, como ya he comentado es una pantalla en negro. 

viernes, 23 de septiembre de 2011

Motores graficos 2D/3D para Andorid


Para desarrollar Heads or Tails el principal problema es la forma de realizar la animación. Si bien desde la API de Android el cargar una animación es muy fácil, hacerlo de forma que se pueda controlar el número de repeticiones y el frame en el que se encuentra la animación ya no lo es. Por eso y para facilitar las cosas y en el futuro posibilitar un desarrollo gráfico sin demasiadas restricciones voy a basar el desarrollo de la app en un motor gráfico.  Pero antes hay que decidir cual usar ya que la verdad es que la oferta (entre los que son libres) es bastante amplia. Os dejo un pequeño resumen con todos los que siguen más o menos activos en su desarrollo y pueden ser utilizados actualmente en nuestras apps:

  • AndEngine: se trata de un motor 2D con OpenGL libre bajo licencia LGPL desarrollado por Nicolas Gramlich. Entre sus múltiples características se encuentran:
    • Optimización para Android y compatibilidad con la versión 1.6.
    • Modo SpitScreen.
    • Multijugador en red.
    • Texturas vectoriales (en SVG).
    • Live-Wallpapers.
    • Posibilidad de MuiltTouch.
    • Motor de fisicas con Box2D 
    • Posibilidad de implementar relidad aumentada.
    • libGDX: motor gráfico multiplataforma (Linux, OSX, Windows, Android) para 32 y 64 bits y que entre sus principales caractaristicas cunenta con la posibilidad de desarrollar para sistemas de escritorio y después esa misma aplicación es facilmente portada a Android (dicen que con 6 líneas de código adional). Distribuido con licencia Apache 2.0 entre el resto de sus caracteristicas cabe destacar:
      • Shaders, vertex y soporte de OpenGL 1.0, 1.1 y 2.0 (solo en Android 2.0).
      • Sistema de párticulas.
      • Carga de sonido en mp3, OGG y waw.
      • Carga de mapas TMX de MapEditor.
      • Soporte para ratones, teclados y touch.
      • Soporte del compas, acelerometro y vibrador.
      • Soporte de eventos remotos, por ejemplo para interactuar con un pc.
      • Físicas con Box2D.
      • Incluye editor de particulas, generador de fuentes y empaquetador de texturas.
    • jPCT: motor 3D multiplataforma de escritorio que cuenta ademas con una versión específica para Android. Publicado bajo una licencia propia que permite sus redistribucion. Entre sus características:
      • Carga de modelos 3DS, OBJ, MD2, ASC y XML.
      • Animación por frames o por esqueleto.
      • Sistema de iluminación y efectos.
      • Construcción de primitivas.
      • Detección de colisiones.
      • Completo control de cámaras.
    • Forget3D: framework 3D multiplataforma basado en OpenGL ES que permite relizar aplicaciones para Android, Win32, WinCE. Distribuido bajo licencia GNU GPL v2 entre sus características cuenta con:
      • Compatible con Android 2.0.
      • Carga de modelos MS3D, G3D (Glest) y MD2.
      • Texturas de 8 y 24 bits.
      • Manejo de escenas.
      • Control de cámaras.
      • Sistema de iluminación.
      • Soporte de fuentes.
    •  Catcake: motor 3D multiplataforma compatible con Linux, Android y Windows creado con la idea de tener una pequeña curva de aprendizaje y un buen rendimiento. Está publicado bajo licencia MIT. Entre la caracteristicas que destacan de este motor se encuentran:
      • Carga de modelos 3DS.
      • Manejo de transparencias e iluminación.
      • Manejo de fuentes (TTF, TTC, OTF).
      • Monitor de depuración en tiempo real.
      • Creación automática de modelos 3D a partir de imagenes 2D.
      • Detección de colisiones.
    • e3roid: motor 2D basado en OpenGL para Android 2.1 o superior bajo la nueva licencia BSD. Con un ciclo de desarrollo bastate rapido cuenta con las siguientes características:
      • Manejo de capas y sprites.
      • Renderizado de texto.
      • Entrada analogica\digital con soporte para multi touch.
      • Físicas con Box2D.
      • Carga de mapas TMX.
      • Emulación de teclado.
      • Consola de depuración.
      • Incorpora interpretes para scripts en Lua y JavaScript.
      • Manejo de sonidos.
    • Loon: framework basado en OpenGL para la creación de juegos 2D para Andorid.Si bien está en constante desarrollo para poder trabar comodamente con el necesitamos saber algo de chino o depender del traductor de Google que tampoco lo hace tan mal.Publicado bajo licencia Apache 2.0.
    ·