miércoles, 18 de abril de 2012

Nueva versión libGDX

Desde principios de abril esta disponible la versión 0.9.3 de libGDX entre cuyas novedades se encuentran:

  • Mejoras en el rendimiento de OpenGL ES 2.0.
  • Eliminado el límite de memoria para la carga de recursos locales.
  • Renderizado no continuo.
  • PixmapPacker, que permite empaquetar imágenes.
  • Soporte para HTML5 mediante GWT.
  • Soporte de carga de ficheros locales.
  • Generación de BitmapFonts a partir de caracteres Unicode y ficheros TTF

Podéis descargaros la nueva versión desde aquí. Además desde el blog de Badlogic Games han avanzado que se encuentran trabajando para incorporar el motor de físicas Bullet Phisics y las librerías libjpeg/libpng/libgif.

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.