viernes, 28 de octubre de 2011

Como usar las clases Screen y Game

import com.badlogic.gdx.Game;
import com.badlogic.gdx.Screen;

Puede ser que hayas tenido problemas con estas clases porque el proyecto SuperJumper tiene implementadas estas dos clases. Entonces cuando intentamos
usarlas en el ejemplo anterior, el entorno las coge de alli en vez de las clases
de la libreria libGDX. Tambien es posible que falle porque en el ejemplo de como
configurar un proyecto para usar libGDX que he hecho antes de creea una clase llamada
Game que es diferente de la que viene en  com.badlogic.gdx.Game

Cuando se empieza a desarrollar una aplicacion libGDX y montamos el proyecto
para Escritorio/Android estos inician un ApplicationListener. El ApplicationListener
se pueden manejar mediante las clase Game y Screen.

com.badlogic.gdx.Game
        Creamos una clase que deriva de Game que implementa ApplicationListener, esta será
        la clase principal "Main" del proyecto  libGDX.
        El método create() está aquí y una vez es ejecutado se pasa a las pantallas donde se
        pinta. Para cambiar de pantalla, lo que hay que hacer es llamar a game.setScreen(screen);

com.badlogic.gdx.Screen
        Es un interface que funciona como si fuera un mini ApplicationListener. ¿Y que es un ApplicationListener?
        Para saberlo hay que ver como esta estructurada una aplicacion libGDX y como se puede desplegar en diferentes
        plataformas.

#####################################################################
La Aplicación "Application"
Este es el punto de entrada de cualquier  proyecto libGDX . La Aplicación determina en que plataforma se va a desplegar
y el motor grafico que usará. El interface de la Aplicacion nos da los metodos para acceder a los Graficos, Audio e I/O así como al módulo de Loggin que funciona en todas las plataformas.

Para crear una aplicacion libGDX se ha de implementar el ApplicationListener primero.

La implementación del escuchador es la responsable de iniciar la Aplicación, actualizar el estado del juego, pintar las imagenes en pantalla, pausar el juego, grabar el estado y liberar recursos cuando finaliza la aplicación.
Tambien se gestionan aqui los eventos asociados al ciclo de vida de applicacion.

La Aplicación es responsable del ciclo de juego y el ApplicationListener es el sitio donde se implementa la lógica del juego.
#####################################################################

public interface ApplicationListener
Un ApplicationListener es llamado cuando la Aplicación es creada, reanudada, pintando,pausada o destruida. Todos
los métodos son llamados en un hilo que tiene el contexto OpenGL. Por lo que se pueden manipular recursos gráficos tranquilamente.

El interface ApplicationListener sigue el standard de el ciclo de vida de una Aplicacion Android y en el Escritorio esta emulado.



Cuando se crea una clase que  implementa el interface Screen se usa como un ApplicationListeners.
Tiene los métodos render(), pause(), resume(), and resize(), y adicionalmente  hide() and show(). Estos son llamados cuando se llamarian en un ApplicationListener.
Cuando se llama a  setScreen(screen), se llama al método  hide() de la pantalla actual.La nueva
pantalla se convierte en la pantalla actual y se llama a su método show() entonces se llama a su método render() cada frame.
Sólo se pinta un pantalla a la vez.
El método Screen.dispose() nunca se llama automaticamentecuando el  ApplicationListenerse llama al método dispose(),
Game llama a  screen.hide()

Es conveniente mantener una sola instancia de cada pantalla para toda la vida del juego. Y no crear un nuevo objeto cada vez que se cambia de pantalla para evitar la recolección de basura.
Cada Screen deberia tener una referencia a Game para poder cambiar de una pantalla a otra.

jueves, 27 de octubre de 2011

Configuracion del proyecto android + libGDX


Como configurar Eclipse para desarrollar para escritorio y dispositivos android.
Viene todo explicado aqui:
    http://code.google.com/p/libgdx/wiki/ProjectSetup
La libreria se baja de aquí:
    http://libgdx.l33tlabs.org/

En general, siguiendo paso a paso lo que pone en esta web tenemos la basico para empezar a programar algo.
Proyecto

Android y libGDX

Desde aquí:
http://libgdx.badlogicgames.com/documentation.php
Intento bajarme con el Egit que viene instalado con el Eclipse, no lo consigo.
Me bajo el Tortoise SVN, creo un directorio en el directorio Workspace del eclipse que estoy
usando.Instala El Tortoise y la traduccion al español, boton derecho sobre el directorio que he creado.
Intento importar el repositorio de aqui:
http://libgdx.googlecode.com/svn/trunk
No lo consigo me da un error y resulta que hay que exportarlo...
Me baja un huevo de cosas al directorio.
En el eclipse me voy a File->Import->General->Existing Projects into Workspace y elijo el directorio.
Me carga un monton de proyectos y me salen estos errores:
    [2011-10-27 09:35:43 - gdx-twl-tests-android] Unable to resolve target 'android-4'
    [2011-10-27 09:37:25 - very-angry-robots-android] Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead. Please use Android Tools > Fix Project Properties.
    [2011-10-27 09:37:31 - very-angry-robots-android] Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead. Please use Android Tools > Fix Project Properties.
    [2011-10-27 09:37:33 - cuboc-android] Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead. Please use Android Tools > Fix Project Properties.
    [2011-10-27 09:37:34 - model-loaders-android] Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead. Please use Android Tools > Fix Project Properties.

   
    Voy a Android SDK Manager pongo a bajar Android1.6 (API 4) a ver si es eso. Tarda un huevo la Google API

Cargadores


Método para cargar datos asincronicamente en  una actividad o fragmento.
Estan disponibles para todas las actividades y fragmentos.
Estan "vivos", monitorean constantenmente su fuente de datos.
Se reconectan automaticamente al ultimo curosr del cargador cuando son recreados despues de un cambio de configuracion.
Motivo por el cual no hace falta volver a pedir los datos que ofrecen.

Fragmentos


Los fragmentos representan comportamientos o una parte de la interfaz de una actividad. 
Se pueden ver como modulos que se unen para formar la interfaz de usuario de la actividad. Si la actividad fuera un Form serian componentes Panel.
Es útil usar varios fragmentos para evitar cambios de actividad.
Tienen su propio ciclo de vida,estado y pila LIFO "back stack"
Requieren API Level "Honeycomb" como mínimo.
Pueden haber fragmentos invisbles que no tengan interfaz gráfica.

Imagen de fragmento de actividad:



miércoles, 26 de octubre de 2011

Actividades



Una actividad es un componente de una aplicacion que da una pantalla para interactuar o mostrar algo. Cada actividad tiene una ventana que puede estar en pantalla completa o no. Vamos vendría a ser como un Form de windows. Lo normal es que una aplicacion posea varias actividades una de las cuales el la principal, la "main".
Una actividad puede llamar a otra auqnue sea de otra aplicación.
Entonces la actividad llamada viene al frente y la que llamó se para, se guarda su estado y se hace PUSH a la pila de actividades "back stack" que es una pila LIFO.
Cuando se va hacia atrás en la pila la actividad "actual" se destruye y se muestra la anterior en la pila LIFO.



Una de estas pilas de actividades sería una tarea "task"
Se pueden tener varias de estas tareas en marcha dandole al boton Inicio "HOME"

Las actividades se pueden instanciar mas de una vez.

Android y libGDX

Esta entrada esta anticuada puedes mirar aquí a ver lo que hay:
https://github.com/libgdx/libgdx/tree/master/gdx
ó en
https://code.google.com/p/libgdx/downloads/list
ó
http://www.badlogicgames.com/wordpress/?p=274

Probando el primer ejemplo
(ojo, el link siguiente ya no existe, es añejo)
http://code.google.com/p/libgdx/downloads/detail?name=gdx-helloworld-0.9.2.zip

Lo descomprimo y no me aclaro a abrir el proyecto. No soy el único que viene de Visual Studio al que le ha pasado esto.

Este hombre me lo soluciona
http://cirovladimir.wordpress.com/2009/07/20/eclipse-abrir-un-proyecto-existente/
Basta con “Importar” la carpeta de nuestro proyecto mediante File->Import->Existing Project
y seleccionar la carpeta del proyecto.

Le doy a ejecutar y me tira un error
Android SDK Error: Unable to resolve target 'android-3'

Tambien hay alguien a quien le ha pasado esto
There are few variants of this error message:
Unable to resolve target 'android-3'
Reason: Could not find the proper Android SDK version. If the android SDK is installed correctly the problem is that the platform SDK requested by the "AndroidManifest.xml" android:minSdkVersion is not installed. For example:
Unable to resolve target 'android-3' - install SDK Platform Android 1.5
You can do this using the Android SDK Setup utility:
Option 1: Eclipse -
"Windows" \ "Android SDK and AVD Manager" \ "Available packages"
http://sagistech.blogspot.com/2010/05/android-sdk-error-unable-to-resolve.html

Tarda un huevo en bajarse el SDK :(


Declarando los requerimientos de la aplicación


Configuración de la entrada (input)teclado hardware, trackball, etc
 -se declara con <uses-configuration>
Caracteristicas del dispositivo: Hardware y software. Por ejemplo si tiene camara o no, que versión de OpenGL utiliza...
 -se configura con el elemento <uses-feature>
Versión de la Platforma: El nivel mínimo de plataforma que requiere la aplicación
 -se configura con el elemento<uses-sdk>

Recursos de la aplicación



Son las imagenes los sonidos y en general cualquier cosa relacionada con la parte visual de la aplicación.
El SDK le asigna un identificador en forma de entero único que se puede usar para referenciar  el recurso. La idea de esto es
crear directorios bajo el directorio /res de la aplicacion.Dentro de ese directorio se colocan los recursos a usar. Luego habria que ver
cuando se usan unos recursos u otros.
En ciertos casos como en idioma y la orientacion el nombre del directorio ya esta definido. Ejemplos:
-res/layout/ modo normal vs  res/layout-land/ modo apaisado
res/values modo de las strings por defecto vs res/values-fr/ modo strings en francés

Declarando los requerimientos de la aplicación

Se hace en el fichero de manifiesto "AndroidManifest.xml"
Características del dispositivo a tener en cuenta:
Tamaño y resolución de la pantalla: Estan generalizadas en grupos:
 se usa así <supports-screens
android:resizeable=["true"| "false"]
android:smallScreens=["true" | "false"]
android:normalScreens=["true" | "false"]
android:largeScreens=["true" | "false"]
android:xlargeScreens=["true" | "false"]
android:anyDensity=["true" | "false"]
android:requiresSmallestWidthDp="integer"
android:compatibleWidthLimitDp="integer"
android:largestWidthLimitDp="integer"
/>
Configuración de la entrada:teclado hardware, trackball, etc
se declara con <uses-configuration>
Caracteristicas del dispositivo: Hardware y software. Por ejemplo si tiene camara o no, que versión de OpenGL utiliza...
se configura con el elemento <uses-feature>
Versión de la Platforma: El nivel mínimo de plataforma que requiere la aplicación
se configura con el elemento<uses-sdk>

Declarando las capacidades de los componentes

Se pueden usar intentos "intents" para arrancar actividades, servicios y receptores de banda ancha.
Luego estan los intentos de accionar "intent actions" que consisten en explicar que tipo de acción queremos realizar y lanzar un intento para que el sistema busque algun componente en el sistema que sepa hacerlo.
Para ello en el fichero de manifiesto de cada aplicacion existen los filtros de intentos "intent filters". Contra ellos se compara el intento de accionar para ver si la el componente de la aplicacion es capaz de realizar la accion requerida.Estos filtros son opcionales y se declaran añadiendo un elemento hijo en la declaracion del componente.

martes, 25 de octubre de 2011

Enlaces

Enlaces
    http://developer.android.com/index.html
El clásico Hello World
    http://developer.android.com/guide/tutorials/hello-world.html
Como usar esto con eclipse
    http://developer.android.com/guide/developing/eclipse-adt.html
Tutoriales
    http://developer.android.com/resources/tutorials/views/index.html
La API
    http://developer.android.com/reference/packages.html
Específico juegos
    http://www.rbgrn.net/content/54-getting-started-android-game-development
    http://code.google.com/p/libgdx-users/wiki/AAATopPaaage
Varios
    http://www.warriorpoint.com/blog/
    http://mylifewithandroid.blogspot.com/
    http://smartandroidians.blogspot.com/
    http://blog.pocketjourney.com/
    http://stuffthathappens.com/blog/

El fichero Manifiesto "AndroidManifest.xml"

El Fichero Manifiesto

Para que Android pueda arrancar una aplicación tiene que haber un fichero manifiesto "AndroidManifest.xml ". Este fichero se coloca en el directorio raiz de la aplicacion.
Entre otras cosas contiene:
    - La declaracion de los componentes de la aplicacion, esta es la    función principal del manifiesto.
    - Los permisos de acceso que posee la app.
    - La version minima de API para ejecutarla.
    - Elementos de hardware necesarios para ejecutarla
    - APIS adicionales que utiliza.

Declaring components

Ejemplo de declaración de la actividad de una aplicación en un archivo manifiesto:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:icon="@drawable/app_icon.png" ... >
        <activity android:name="com.example.project.ExampleActivity"
                  android:label="@string/example_label" ... >
        </activity>
        ...
    </application>
</manifest>

Se deben declarar los componentes de las aplicaciones así:

    <activity> elementos para las actividades
    <service> elementos para los servicios
    <receiver> elementos para receptores de banda ancha
    <provider> elementos proveedores de contenido
       
Actividades, servicios, y proveedores de contenido que tengan codigo fuente pero no esten incluidos en el manifiesto no son
visibles para els istema y no se podran ejecutar.
Los receptores de banda ancha pueden ser declarados en el manifiesto o creados en tiempo de ejecucion mediante
"registerReceiver()"

lunes, 24 de octubre de 2011

Componentes de una Aplicacion Android

Componentes de una Aplicacion Android
Actividades: Representan una sola pantalla con un interfaz de usuario.
Servicios: Representan el deseo de una aplicacion de realizar una operacion de larga duración.
Proveedores de contenido:  Se usan para manipular datos. Son útiles  para escribir/leer datos que son privados de la
aplicación. Tambien se pueden usar para que una aplicación puedan acceder a datos de otras aplicación.
Receptores de Banda Ancha: Se usan para enviar y recibir mensajes que se han enviado a todo el sistema
No tienen interfaz grafica pero pueden crear notificaciones de estado.

Una aplicacion Android puede poner en marcha el componente de otra aplicacion.
Cuando se hace esto el componente que ha sido arrancado corre en el proceso de la actividad que ha sido llamada
y no en el de el proceso que la llamó. Las aplicaciones no pueden arrancar otros procesos directamente. Lo que hacen es decirle al
sistema que quieren hacerlo y él lo hace por ellas.

Lo mas básico

Las Aplicaciones para Android se programan en Java, el Sdk de Android compila la aplicacion en un
"Android package" unarchivo con extension .apk. Los archivos .apk son los que los dispositivos Android
usan para instalar la aplicacion.

Una vez la aplicacion esta instalada esta vive en su propio "sand box"
-El sistema operativo Android es un un Linux multiusuario en el que cada
aplicacion es un usuario diferente.
-El sistema asigna permisos para todos los ficheros de una aplicacion para quie solo ella pueda
acceder a ellos.
-Cada proceso tiene su propia maquina virtual para asegurar que este separado de los demas.
-Cada aplicacion corre en su propio proceso de Linux.

¿Como se comunican las aplicaciones entre ellas?
-Dos aplicaciones pueden com,partir el mismo ID de usuario Linux con lo que pueden acceder
a los ficheros de ambas.Asi pueden compartir el mismo proceso de Linux y la misma Maquina Virtual.
-Las aplicacones pueden perdir permiso para acceder a datso del dipositivo al ser instalado.
Por ejemplo a los contactos, a la camara o al bluetooth.

Queda inugurado este pantano

Abro este blog para ir añadiendo informacion que me interesa mientras voy aprendiendo a programar aplicaciones para android.