Paso a Flash Lite 2.1

30 12 2006
Por Marcos

Si bien hace ya un tiempo que Flash Lite 2.1 ha visto la luz, para todos aquellos que tengan un movil que lo soporta y aun no han dado el paso para cambiar, esta nota técnica en el blog de Alessandro Pace en el site de Nokia merece una reseña, ya que aclara el panorama de cómo actualizarse, que móviles lo soportan y que versión hemos de instalar (en funcion de la version y feature pack de nuestro nokia).

Ir a la nota técnica



Visor Videos 3gpp en Flash Lite 2

27 12 2006
Por Marcos

Una de las nuevas características soportadas por Flash Lite 2.x es la reproducción de video de dispositivo. ¿Qué quiere decir esto de video de dispositivo? La respuesta a esta pregunta la veremos en detalle en este tutorial sobre cómo montar una aplicación standalone en Flash Lite para visualizar videos.

Soporte de video en Flash Lite 2.x

En Flash Lite 1.1 no disponíamos de la capacidad para reproducir videos en los dispositivos móviles. Con la llegada de Flash Lite 2.0 los desarrolladores contamos con esta posibilidad a través de la carga (local o remota) de video de dispositivo.

Cuando decimos video de dispositivo nos referimos a aquellos formatos que nuestro dispositivo es capaz de reproducir de forma independiente. Es decir, todo aquel formato de video que el dispositivo donde correrá la aplicacion Flash Lite soporte, también es soportado por Flash Lite. Esta característica que en un principio puede parecer todo bondades, no lo es tanto, ya que la misma capacidad que nos brinda para soportar videos 3GPP o MPEG-4 (en función del dispositivo) nos limita en otros aspectos, como la capacidad de controlar dicha reproducción o soportar otros formatos habituales en flash como FLV.

Para conocer que formatos de video son soportados por nuestro dispositivo disponemos de la propiedad System.capabilities.videoMIMETypes y en general para conocer los tipos de archivos soportados por el dispositivo disponemos de System.capabilities.MIMETypes. A partir de lo que nos devuelve esta propiedad (por ejemplo en un nokia 6670 podría ser algo como esto: video/3gpp,video/mp4,video/mov) podemos decidir si lanzar la carga de los archivos de video o no.

Como punto final a esta introducción sobre el uso de video en Flash Lite, es importante destacar que Flash Lite no asume por si mismo la reproducción de video, sino que lo cede al propio dispositivo para que sea este el que mediante su aplicación de reproducción lo muestre por pantalla. Esta es la causa de que podamos cargar los formatos de movil (tales como 3gpp) y no los habituales en flash (como flv), y esta causa tambien es la que hace que no tengamos el mismo control sobre el video que pudieramos tener en una aplicacion Flash Player 7. Realmente Flash Lite lo que hace es crear una instancia de la aplicación de reproducción de video del dispositivo y mostrarla en primer plano, encima de cualquier elemento de nuestro swf, permitiéndonos actuar sobre el en las acciones básicas tales como: pausa, cierre y reproducción. La manera de crear esta instancia en nuestro swf es generar un nuevo elemento en la biblioteca de tipo Video, como aprenderemos a lo largo de este tutorial.

La aplicación

Nuestra aplicación tendrá almacenada la lista de videos a cargar en un array, sobre todo por pereza, ya que cargar la lista de un XML no aportaría más que ventajas ... :-) y dispondrá de tres pantallas para interactuar con el usuario: una de bienvenida, una que contenga el menu de selección de video y otra para la visualización de los videos.

A partir de ahora comenzamos con la parte interesante... iremos viendo cada una de estas pantallas de forma práctica y el código que desarrollaremos para controlarlas de forma adecuada, ¡comenzamos!

Nuestro archivo de pruebas

Para seguir este tutorial crearemos un fla con las siguientes características:

  • Dimensiones: las de la pantalla de nuestro dispositivo móvil, en mi caso nokia 6670 con 176x208 pixels.
  • Configuración de Publicacion: Flash Lite 2.0 y ActionScript 2.0
  • Configuración de dispositivo: Nokia 6670
  • FPS: 12

Esta configuración se puede hacer desde el panel propiedades de nuestro documento, o bien agilizarlo con las plantillas de las que dispondremos si nos hemos bajado el update de Flash Lite 2 para Flash 8 (acceder al update)

y la lista de perfiles disponibles desde adobe (Perfiles para móviles).

Una vez que tenemos el documento preparado, pasaremos a estructurar el mismo para albergar nuestro sistema de pantallas. Para ello vamos a disponer de la siguiente estructura en nuestra linea de tiempo (ver imagen 1):

Como se puede apreciar en la imagen tenemos una serie de capas de las que iremos conociendo más a lo largo del tutorial, y además disponemos de una capa denominada etiquetas, que contendra los siguientes labels en los frames 1, 2 y 3 prespectivamente: INTRO, MENU y VIDEO. De esta forma podemos añadir posteriormente frames intermedios sin que dejen de funcionar nuestras instrucciones gotoAndStop.

Además del fla tendremos a su mismo nivel una carpeta denominada "3gp" donde tendremos los vídeos que queremos cargar de forma externa.

Funciones y métodos que emplearemos

El código de Flash Lite 2 está basado en su mayoría en ActionScript 2.0, con lo que para los desarrolladres Flash no habrá muchos cambios salvo las características propias de los dispositivos. A continuación indicamos de forma resumida que elementos especiales nos encontraremos en este ejemplo:

System.capabilities.videoMIMETypes

El objeto no es desconocido, aunque si la propiedad que se empla. Como se mencionó anteriormente, esta propiedad nos devuelve en formato String la lista de formatos de video soportados por el dispositivo en el que corre el swf. Esto es fundamental para saber si vamos a poder reproducir el formato de video de nuestra aplicación o si debemos mostrar un aviso al respecto.

fscomnmand2()

Esta función permite acceder a los fscommand para Flash Lite 2.x, es el equivalente de fscommand para la versión de escritorio. Unos de los más empleados en las aplicaciones que iremos viendo serán: fullscreen, setSoftKeys, setQuality, ...

ExtendedKey

Esta clase permite acceder a teclas especiales (softKeys) de los dispositivos móviles. Su uso es totalmente similar a la de la clase Key habitualmente empleada en las aplicaciones flash tradicionales. Antes de poder emplear el acceso a las softKeys (por ejemplo mediante ExtendedKey.SOFT1) es necesario usar el comando fscommand2 con setSoftKeys.

Objeto Video

Como se ha comentado antes en este tutorial, el video integrado en Flash Lite 2.x funciona creando una instancia de la aplicación nativa del dispositivo para ese tipo de archivos sobre el flash player. Esto implica que no se puede crear ni emplear componentes habituales de Flash 8 para la reproducción de video. Para poder incrustar video en una aplicación Flash Lite, se ha de crear un objeto de video en la biblioteca. Esto se puede hacer abriendo el menu de la biblioteca (ver imagen 2) y eligiendo "New video". Debemos darle un nombre al símbolo que se creará en la biblioteca, en nuestro caso "videoPlayer", y en este ejemplo marcaremos la casilla "Video - ActionScript controlled".

Con esto ya tenemos todo lo necesario para comenzar la codificación de nuestro reproductor de video. A partir de este punto veremos fotograma por fortograma como ir creando las pantallas (una pantalla en este ejemplo equivale a un fotograma de la linea de tiempo principal) y qué código hemos de dar para que cumplan su función.

Fotograma INTRO

En el primer fotograma aprovecharemos para crear la pantalla de bienvenida a nuestra aplicación y de paso comenzar con un ejemplo básico del uso de las softKeys. La pantalla de entrada constará de una imagen que tenga la bienvenida a la aplicación y un texto que nos indique cómo proceder, o bien para entrar a la aplicación o bien para salir de la misma.

El hecho de usar una imagen en vez de trazo vectorial, es que por norma general, el uso de imagenes conlleva menos uso de procesador, que en el caso de un móvil es un factor crítico. Aunque esto sea así, para formas básicas (rectángulos por ejemplo) el uso de trazo vectorial permitiría un ahorro en peso de la película (también un factor importante) y no conllevaría un gasto de procesador elevado. Como nuestra bienvenida tiene más detalle que un mero rectángulo, usaremos una imagen PNG.

A continuación vamos a la capa codigo e introducimos el siguiente script:

Actionscript:
  1. _focusrect = false;
  2. fscommand2("SetQuality", "high");
  3. fscommand2("Fullscreen", "true");
  4.  
  5. // Evaluamos si 3gpp es un formato soportado por el dispositivo
  6. var soportado:Boolean = false;
  7. for (valor in System.capabilities.videoMIMETypes)
  8. {
  9. if (System.capabilities.videoMIMETypes[valor]=="video/3gpp")
  10. {
  11. soportado = true;
  12. }
  13. }
  14.  
  15. // Preparamos las softKeys para permitir acceder al menú
  16. // o salir de la aplicación.
  17. Key.removeListener(tecladoListener);
  18. var tecladoListener:Object = new Object();
  19.  
  20. if (soportado)
  21. {
  22. entrada_txt.text = "Bienvenido al visor de videos Flash Lite 2 para movil BlocketPC.";
  23. fscommand2("SetSoftKeys", "Menu", "Salir");
  24. softKeyIzq.text = "Menu";
  25. softKeyDch.text = "Salir";
  26. tecladoListener.onKeyDown = function()
  27. {
  28. var keyCode:Number = Key.getCode();
  29. if (keyCode == ExtendedKey.SOFT1)
  30. {
  31. gotoAndStop("MENU");
  32. }
  33. else if (keyCode == ExtendedKey.SOFT2)
  34. {
  35. fscommand2("quit");
  36. }
  37. }
  38. }
  39. else
  40. {
  41. entrada_txt.text = "El dispositivo no soporta el formato de video 3gp, no podrá visualizar ningun video, pulse salir para cerrar la aplicación.";
  42. fscommand2("SetSoftKeys", "", "Salir");
  43. softKeyIzq.text = "";
  44. softKeyDch.text = "Salir";
  45. tecladoListener.onKeyDown = function()
  46. {
  47. var keyCode:Number = Key.getCode();
  48. if (keyCode == ExtendedKey.SOFT2)
  49. {
  50. fscommand2("quit");
  51. }
  52. }
  53. }
  54.  
  55. Key.addListener(tecladoListener);
  56.  
  57. stop();

En este ejemplo, el inicio de la aplicación está en el fotograma etiquetado como “INTRO” en la línea de tiempo principal, que es el primer fotograma de la película.

La idea fundamental es detectar si el dispositivo soporta el formato de video de la aplicacion (3gpp) y si lo soporta dar acceso mediante la softkey izquierda al menu de la aplicación y mediante la softkey derecha permitir salir de la aplicación.

Fotograma MENU

En este fotograma de nuestra película contenemos el menú de selección de video. El sistema es muy sencillo, y principalmente se trabaja sobre la clase Selection para poder mostrar al usuario dónde se encuentra al moverse con las teclas de dirección. Además se da la funcionalidad añadida, y muy recomendable de acceder a las opciones del menú de forma directa mediente las teclas numéricas.

En nuestro menú contamos con 4 clips dispuestos en el escenario, con nombres de instancia: opcion_0_mc, opcion_1_mc, opcion_2_mc y opcion_3_mc. Estos clips tiene un estado OUT y OVER en su interior, para simular la funcionalidad de un boton y los eventos onRollOver y onRollOut.

Sobre el código que se detalla a continuación comentamos como parte fundamental, el proceso por el que se da contenido a dicho menú y también su funcionalidad, de tal manera que cuando seleccionemos una de las entradas, nos permita ir al fotograma VIDEO donde se reproducirá el video seleccionado.

Actionscript:
  1. // DEFINICION DE VARIABLES
  2. var videoSeleccionado:Number = -1;
  3. var elementoSeleccionado:MovieClip;
  4.  
  5. fscommand2("setSoftKeys","Inicio","Salir");
  6. softKeyIzq.text = "Inicio";
  7. softKeyDch.text = "Salir";
  8.  
  9. Key.removeListener(tecladoListener);
  10. var tecladoListener:Object = new Object();
  11. tecladoListener.onKeyDown = function()
  12. {
  13. var keyCode:Number = Key.getCode();
  14. switch (keyCode)
  15. {
  16. // Control de SOFTKEYS
  17. case ExtendedKey.SOFT1:
  18. _root.gotoAndStop("INTRO");
  19. break;
  20. case ExtendedKey.SOFT2:
  21. fscommand2("Quit");
  22. break;
  23.  
  24. // Control de teclas de acceso rápido
  25. case 49:
  26. marcarOpcion(0);    // tecla 1
  27. break;
  28. case 50:
  29. marcarOpcion(1);    // tecla 2
  30. break;
  31. case 51:
  32. marcarOpcion(2);    // tecla 3
  33. break;
  34. case 52:
  35. marcarOpcion(3);    // tecla 4
  36. break;
  37. }
  38. }
  39. Key.addListener(tecladoListener);
  40.  
  41.  
  42. marcarOpcion = function(op:Number)
  43. /*
  44. * Función que nos marca la opcion del menu que recibe y que
  45. * envía la cabeza lectora al fotograma VIDEO para poder
  46. * visualizarlo
  47. */
  48. {
  49. videoSeleccionado = op;
  50. elementoSeleccionado = this["opcion_"+op+"_mc"];
  51. Selection.setFocus(elementoSeleccionado);
  52. this.gotoAndStop("VIDEO");
  53. }
  54.  
  55. // Programamos el comportamiento del menu
  56. // Montamos el array de videos
  57. var listaEtiquetas:Array = ["01. Video Primero","02. Video Segundo","03. Video Tercero","04. Video Cuarto"];
  58. var listaVideos:Array = ["video_0.3gp","video_1.3gp","video_2.3gp","video_3.3gp"];
  59. var itemMenu_btn = null;
  60. for (var i:Number = 0; i<listaVideos.length; i++)
  61. {
  62. itemMenu_mc = this["opcion_"+i+"_mc"];
  63. itemMenu_mc.etiqueta_txt.text = listaEtiquetas[i];
  64. itemMenu_mc.indice = i;
  65. itemMenu_mc.onRollOver = function()
  66. {
  67. this.gotoAndStop("OVER");
  68. }
  69. itemMenu_mc.onRollOut = function()
  70. {
  71. this.gotoAndStop("OUT");
  72. }
  73. itemMenu_mc.onPress = function()
  74. {
  75. this._parent.marcarOpcion(this.indice);
  76. }
  77. }
  78.  
  79. // Foco del menu al entrar en la pantalla, si no
  80. // lo tenemos definido porque es la primera vez que entramos
  81. // en el, lo posicionamos en la primera opcion, sino, en la
  82. // opcion que habíamos marcado previamente.
  83. if (elementoSeleccionado == undefined)
  84. {
  85. Selection.setFocus(this.opcion_0_mc);
  86. }
  87. else
  88. {
  89. Selection.setFocus(elementoSeleccionado);
  90. }
  91.  
  92. stop();

El resto del código sigue el criterio visto en el primer fotograma para registrar las pulsaciones de softKeys con el añadido de las teclas numéricas.

Fotograma VIDEO

En este fotograma programamos el objeto video, que hemos colocado en el escenario y que tiene como nombre de instancia "bpcVideo". Para tener algo de control sobre la reproducción vamos a programar tambien las softKeys de tal manera que una nos sirva para regresar al menú y la otra para pausar o relanzar la reproducción del vídeo.

El código que permite este funcionamiento se detalla a continuación:

Actionscript:
  1. // DEFINICION DE VARIABLES
  2. var reproduciendo:Boolean;
  3. var path:String = "3gpp/";
  4.  
  5. fscommand2("setSoftKeys","Volver","Pausa");
  6. softKeyIzq.text = "Volver";
  7. softkeyDch.text = "Pausa";
  8.  
  9. Key.removeListener(tecladoListener);
  10. var tecladoListener:Object = new Object();
  11. tecladoListener.onKeyDown = function()
  12. {
  13. var keyCode:Number = Key.getCode();
  14. if (keyCode == ExtendedKey.SOFT1)
  15. {
  16. gotoAndStop("MENU");
  17. }
  18. else if (keyCode == ExtendedKey.SOFT2)
  19. {
  20. if (reproduciendo)
  21. {
  22. bpcVideo.pause();
  23. reproduciendo = false;
  24. softkeyDch.text = "Play";
  25. }
  26. else
  27. {
  28. bpcVideo.resume();
  29. reproduciendo = true;
  30. softkeyDch.text = "Pausa";
  31. }
  32. }
  33. }
  34. Key.addListener(tecladoListener);
  35.  
  36. bpcVideo._width = 176;
  37. bpcVideo._height = 144;
  38. reproduciendo = true;
  39. bpcVideo.play(path+listaVideos[videoSeleccionado]);

Los videos que vamos a reproducir tienen unas medidas de 176x144 con lo que dotamos a la instacia de videoPlayer de dichas medidas mediante programación. Posteriormente hacemos reproducir el video indicado desde el menú anterior.

Instalación en el dispositivo

Para la instalación en el dispositivo, no necesitamos mas que copiar los archivos (con la estructura de directorios que hemos marcado para los videos) a la memoria principal del teléfono o a la tarjeta auxiliar mediante el programa que corresponda (en nuestro caso el Nokia PC Suite).

Para los usuarios que dispongan ya de Flash Lite 2.1 en sus dispositivos, es necesario tener en cuenta que para poder reproducir el ejemplo necesitan situarlo obligatoriamente en la carpeta Others de la memoria principal del teléfono, ya que esta versión d eplayer no tiene la aplicación que reconoce los archivos swf mediante un gestor de archivos como puede ser el file manager o el FExplorer. Para poder ejecutarlo debe lanzar Flash y una vez en Flash abrir el archivo desde su correspondiente menú.

Los usuarios de Flash Lite 2.0 pueden colocarlo en cualquier ubicación ya que lo reconocerá y al tratarse de video no tienen la necesidad de situarlo en ninguna carpeta concreta o abrirlo con el FExplorer. (en Flash Lite la carga de contenidos externos, shared objects etc se ve afectada si colocamos nuestra aplicación en cualquier ubicación y lo abrimos con el file manager del dispositivo, cosa que se soluciona abriendo el swf principal con el FExplorer).

Más información sobre este tema en esta entrada del foro de Adobe:

Discusión sobre problemas de carga con Flash Lite

Consideraciones finales

Uno de los aspectos importantes cuando realizamos una aplicación para flash lite es de dotar al usuario de la capacidad de salir de la aplicación mediante fscommand2("quit") ya que sino la aplicación queda residente en memoria, y si no se cierra explícitamente, al volver a abrirla conservaremos el estado en el que estábamos. Por tanto si no dotamos a la aplicación de esta funcionalidad, para poder resetearla por completo necesitaremos de reiniciar el dispositivo.

Por otro lado es importante recordar que la reproducción de video se hace desde la aplicación incluida en el dispositivo para ese fin, y que el control del que disponemos desde Flash Lite es realmente mínimo. Esta característica hace que la carga de videos funcione correctamente si probamos nuestra película desde el File Manager aunque tengamos colocada la aplicación en una carpeta diferente a la denominada "Others" y que es donde se habrían de situar en principio nuestras pelicualas flash.

La carga de videos también podría hacerse de forma remota sobre un servidor, tomando los videos albergados en él.

Muchos dispositivos no tienen un control directo sobre el volumen (solo cuando estamos en medio de una llamada o reproduciendo un video desde una aplicación, por ejemplo), con lo que puede ocurrir que si el nivel de audio del vídeo es muy elevado, distorsione sin poder actuar sobre dicho volumen mediante action script para solucionarlo. Sobre este tema cabe destacar que cuando arrancamos flash directamente, disponemos de una opción en el menú donde podemos configurar el volumen general del player.

Podeís descargaros el paquete del FLA de ejemplo junto el tutorial en PDF en el siguiente enlace:
Descargar Tutorial y archivos Fuente



Clase para controlar los SharedObjects en Flash Lite 2.0

15 12 2006
Por Raul Jimenez

Todos aquellos que hayáis utilizado un poco los SharedObjects de Flash Lite 2.0 habréis notado que son realmente incómodos a la hora de trabajar con ellos, así que he creado una clase que funciona con addEventListener. Se podría pulir mucho más, así que se aceptan sugerencias en el código.

La clase cuenta con tres métodos públicos.

init(nombre_del_archivo:String)
Inicializa el objeto SharedObject y devuelve un evento onInitSO que nos dice si el objeto existe o no.

loadSO()
Carga el objeto SharedObject.

saveSO(objeto)
Graba el objeto SharedObject. Hay que pasarle un objeto Flash con todos los valores dentro y la clase se encarga de parsear el objeto.

Código de la clase

Actionscript:
  1. import utils.*;
  2.  
  3. /**
  4. * @author Raul Jimenez
  5. */
  6. class utils.SharedObjectLite extends MovieClip
  7. {
  8.     private var dispatchEvent:Function;
  9.     public var addEventListener:Function;
  10.     public var removeEventListener:Function;
  11.     public var removeAllEventListeners:Function;
  12.    
  13.     private var object_so:SharedObject;
  14.     private var wait_int:Number;
  15.    
  16.     static var ON_INIT_SO = "onInitSO";
  17.     static var ON_SAVE_SO = "onSaveSO";
  18.     static var ON_LOAD_SO = "onLoadSO";
  19.    
  20.     /**
  21.     * @since 01-nov-2006
  22.     * @author Raul Jimenez
  23.     *
  24.     * @usage
  25.     * Constructor
  26.     */
  27.     public function SharedObjectLite()
  28.     {
  29.         GDispatcher.initialize(this);
  30.        
  31.         object_so = new SharedObject();
  32.        
  33.     }
  34.    
  35.     /**
  36.     * @author Raul Jimenez
  37.     * @since 15-dic-2006
  38.     *
  39.     * @usage
  40.     *
  41.     */
  42.     public function init(name_str:String):Void
  43.     {
  44.         trace("init()");
  45.        
  46.         SharedObject.addListener(name_str, onLoad);
  47.         object_so = SharedObject.getLocal(name_str);
  48.         object_so._scope = this;
  49.     }
  50.    
  51.     /**
  52.     * @author Raul Jimenez
  53.     * @since 15-dic-2006
  54.     *
  55.     * @usage
  56.     *
  57.     */
  58.     private function onLoad(data_so:SharedObject):Void
  59.     {
  60.         trace("onLoad(): " + data_so.getSize());
  61.        
  62.         var exists_bol:Boolean = new Boolean();
  63.        
  64.         if (data_so.getSize() != 0)
  65.         {
  66.             exists_bol =  true;
  67.         }
  68.         else
  69.         {
  70.             exists_bol =  false;
  71.         }
  72.        
  73.         data_so._scope.dispatchEvent({type:ON_INIT_SO, target:exists_bol});
  74.     }
  75.    
  76.     /**
  77.     * @author Raul Jimenez
  78.     * @since 15-dic-2006
  79.     *
  80.     * @usage
  81.     *
  82.     */
  83.     public function loadSO():Void
  84.     {
  85.         trace("loadSO()");
  86.        
  87.         dispatchEvent({type:ON_LOAD_SO, target:object_so});
  88.     }
  89.    
  90.     /**
  91.     * @author Raul Jimenez
  92.     * @since 15-dic-2006
  93.     *
  94.     * @usage
  95.     *
  96.     */
  97.     public function saveSO(data_obj:Object):Void
  98.     {
  99.         trace("saveSO()");
  100.        
  101.         for (var i in data_obj)
  102.         {
  103.             object_so.data[i] = data_obj[i];
  104.         }
  105.        
  106.         object_so.data.initialized = true;
  107.         object_so.flush();
  108.                
  109.        
  110.         dispatchEvent({type:ON_SAVE_SO, target:"ok"});
  111.     }
  112. }

También he creado un ejemplo por si alguien tenía dudas.

Descargar ejemplo de la clase SharedObjectLite



Primer Libro dedicado en Exclusiva a Flash Lite

13 12 2006
Por Marcos

Via Biskero.org nos llega esta noticia, el primer libro dedicado íntegramente al desarrollo de aplicaciones bajo Flash Lite ha visto la luz... haremos todo lo posible para hacernos con el y poder poner una reseña sobre el mismo.

Aqui podéis encontrar más información del libro:
Amazon
Site del libro



Flash Lite 2.1 ya disponible para Symbian y Windows Mobile 5.0

5 12 2006
Por Raul Jimenez

Al fin llegó el día y se puede descargar Flash Lite 2.1 para Symbian y Windows Mobiile 5.0 de forma gratuita desde la página de Adobe.

Flash Lite 2.1 para la Serie 60

Además, han aprovechado y han sacado una actualización de Flash Lite 2.1 para Flash 8, así que yo no sé vosotros pero tengo muchas cosas que instalar.

Un saludo!!



Flash on the beach ‘06

4 12 2006
Por Raul Jimenez

Hoy empiezan las conferencias flasheras que se celebran durante los días 4, 5 y 6 de Diciembre en el Reino Unido. Como siempre cuentan con un cartel de lujo y este año destacaría las conferencias de Richard Leggett sobre Flash Lite 2.X, Erik Natzke que me dejó pasmado en el OFFF de este año y Joey Lott con su diseño de patrones.

Flash on the beach 2006

Más información en la web oficial del evento.

http://www.flashonthebeach.com/

Un saludo!