novedades en Flash CS5

flash_iphone.jpg

 

Novedad de Flash CS5

Este es un resumen de las cosas más importantes que se escucharon el pasado lunes 9 de noviembre en el Flash Latin Tour en Buenos Aires, Argentina, donde expusieron Lee Bremelow y Enrique Duvos las novedades de Flash CS5 (a cargo de Lee) y de Flash Catalyst (a cargo de Enrique).

Soporte para iPhone.

Quizas sea la novedad que todos esperan. Brimelow, de excelente y legible inglés, dejó en claro que para poder desarrollar exportar para iPhone (formato .ipa), en primer lugar, hace falta una licencia de unos módicos uSd100. Esta licencia corre por cuenta de Apple y no de Adobe. En segundo lugar, se encargó de aclarar que si lo que uno quiere es desarrollar enormes aplicaciones, emplear gráficos 3D, etc, piense en utilizar el lenguaje C y no Flash. Lo que viene a hacer Flash de algún modo es poner a disponibilidad de los desarrolladores un modo sencillo e intuitivo de crear aplicaciones para iPhone. De todos modos, no se necesita de entornos 3D para crear grandes aplicaciones; los que cuentan son las ideas, así que como primer paso de Flash para acercarse al iphone, está bien.
A su vez, se encargó de remarcar lo que de algún modo intuíamos; si bien Flash permitirá desarrollar aplicaciones para iPhone, esto no quiere decir que el iphone vaya a soportar el formato swf. Luego de un proceso, lo que se hace es crear el formato nativo de aplicaciones para iPhone (.ipa). iPhone NO va a soportar fomato SWF.

Flash Player 10.1 y Flash Lite.

Definitivamente, en esta versión, Flash se está volcando a los dispositivos móviles. El nuevo FP viene con grandes mejores en lo que hace a rendimiento, y Flash Lite (versión para dispositivos móviles) va a estar disponible prácticamente para cualquier soporte (Palms, Balckberry, etc). Se hizo una gran apuesta en la mejora de Flash Lite, su rendimiento y su llegada a los dispositivos.

Texto TLF en Flash (Text Layout Framework)

Se cambió el motor de manejos de texto, y flash contará con soporte para lo que se conoce como texto TLF. Este modo ofrece muchísimas ventajas sobre el motor anterior, asemejándose a la edición de texto en programas como el Illustrator o el InDesign. Dentro de sus principales características, se puede modificar la dirección del texto (lectura de derecha a izquierda, por ejemplo) permitiendo el desarrollo de cajas de texto para aquellas lenguas en las cuales la lectura es en dirección contraria a la nuestra (hebreo, chino, etc). A su vez, se pueden aplicar columnas tipográficas de forma clara y sencilla. Si bien se podían obtener resultados similares implementando AS3, nada tiene que ver con esta nueva modalidad, sumamente intuitiva. Se pueden crear cuantas columnas uno desee y manejarlas de forma sumamente sencilla.

Adobe AIR 2.0

Lo único que llegamos a ver respecto a este formato que nos permite crear aplicaciones de escritorio, fue realmente interesante. En AIR 2.0 se puede grabar audio, e incluso acceder a la información del mismo. Lee Brimelow mostró dos sencillas aplicaciones donde en una de ellas accedía a la intensidad de la frecuencia del audio (grababa un mensaje con su voz, y luego al reproducirlo, un muñeco movía la boca a la par del audio), y en otra, utilizó Adobe AIR para grabar desde su micrófono un archivo .wav y guardarlo en el escritorio. Muy interesante.

Editor de Código Mejorado y Snippets:

El editor de código de Flash reconoce los métodos, propiedades y métodos de las clases, incluso las propias. Seguramente esto mejore de manera considerable la fluidez en el desarrollo. Si bien muchos prefieren trabajar directamente con clases, es cierto que muchas veces los requisitos no lo justifican y es más sencillo y útil programar desde la IDE. Por suerte, veremos varias mejores.

Incorporación de Flash Builder:

Para el desarrollo de clases, ahora también contaremos con Flash Builder; desde el panel de Propiedades, podemos decidir utilizar la vista clásica, o bien FB. Básicamente se trata de un editor de código externo a Flash, más potente, con mejoras y más opciones, desde el cual podemos manejar el código de nuestros desarrollos. Si bien durante la charla se evidenciaron algunas falencias, se trata de una versión beta de esta nueva versión. Seguramente encontremos grandes mejoras en la versión final y una enorme utilidad en él.

Mejoras en edición de videos y en la herramienta Decco:

En cuanto a los videos, los mismos se podrán reproducir en tiempo de edición desde la IDE de Flash, sin necesidad de exportar la película. De este modo, se puede visualizar el video mientras uno edita sus propiedades del mismo (x, y, width, height, etc).

En cuanto a la herramienta Decco, si alguien hace uso de la misma, se incorporaron mejoras y nuevos patrones. De todos modos, durante la charla, quedó en clara evidencia que pocos en el mundo Flash emplean esta herramienta.

También se habló de mejoras en el rendimiento en general, la eliminación de algunos bugs (algunos sencillos pero realmente molestos; por ejemplo, al iniciar Flash CS5, podemos abrir cualquier otro programa que el famoso cartel de bienvenida rojo no quedará sobre la pantalla en un primer nivel, permitiendo usar otros programas). En definitiva, así como se viene priorizando algo en particular en cada versión de la plataforma, es evidente que en esta última, el foco está puesto más que nunca en los dispositivos móviles y por ende, en las mejoras en el rendimiento del FP.

 

AS3 - método unloadAndStop();

Hasta la versión 9 de FP, contábamos con el método unload() de la clase Loader para proceder a la descarga de aquellos contenidos que eran cargados por medio del método load() de dicha clase. Ahora bien, el problema surgía cuando se generaba la descarga de una película y:

Si contabas con audio o video, estos continuaban con su reproducción.

Continuaban abiertas aquellas conexiones que no han sido cerradas (netConnection, netStream, localConnection, etc)

Continuaban consumiendo recursos todos aquellos procesos de los cuales prescindimos al descargar la película (listeners que, sería razonable, sean eliminados al descargar la película)

Si bien existen motivos para que esto sea así, indudablemente es una molestia. A pesar de que la optimización de recursos es parte de nuestro desempeño, tratar de eliminar absolutamente todas aquellas referencias innecesarias que están haciendo que el Garbage Collector no las tenga en cuenta, es una actividad por demás engorrosa, molesta y llena de inconvenientes durante el proceso.

Por suerte, desde Flash Player 10, contamos con una solución. Solución parcial y aún con varios ajustes por hacer, pero solución al fin:

El método unloadAndStop();

Por medio del mismo no sólo se procede a la descarga de la película swf, sino que se intenta anular aquellos contenidos secundarios del mismo y detener la ejecución de comandos de dicho archivo, por lo tanto:

Se detienen aquellos sonidos que se estén ejecutando.

Se eliminan los listeners que hayan sido añadidos al escenario.

Se eliminan los eventos enterFrame, frameConstructed, exitFrame, activate y deactivate.

Se detienen los temporizadores.

Se eliminan las instancias de cámara (Camera).

Se eliminan las instancias del mic (Microphone).

Se detienen los clips de película.

En vistas a la optimización de recursos, definitivamente es mucho más ventajoso que el método unload(), y evita en gran parte aquellos malabares que debíamos hacer antes de eliminar una película. De todos modos, si bien este es el camino, considero que aún queda mucho por hacer al respecto; sería mucho más productivo nuestro tiempo, y por ende, más interesantes nuestros desarrollos, si el proceso para mantener optmizadas nuestras películas fuese más transparente de lo que actualmente es. Esperemos se mejore día a día en esta cuestión y encontremos nuevas soluciones en versiones posteriores de FP. Si bien queda mucho por hacer, por suerte, el método unloadAndStop() es un buen indicio de estar yendo por el buen camino…

AS3 - SoundMixer.computeSpectrum();

Les dejo esta pequeña clase donde se hace uso del método computeSpectrum() de la clase SoundMixer en modo FFT (Fast Fourier Transform). Por medio del método computeSpectrum() se puede tomar la onda de un sonido que se está reproduciendo., y lluego almacenarla dentro de un ByteArray. Teniendo acceso al mismo, podemos generar representaciones visuales de dichas ondas. Este es un sencillo ejemplo que desarrollé a modo de clase para que sea personalizable, escalable y reutilizable; verán al descargar los archivos que no es de gran complejidad, y lo más interesante es la sencillez de su implementación; modificando algunos parámetros, podemos lograr distintos gráficos, que con un poco de ingenio e imaginación, se pueden adaptar a cualquier proyecto.

click aca para descargar los archivos!

(eliminé el MP3 del .rar para facilitar la descarga. Para que puedas ver el ejemplo en funcionamiento, mové un mp3 a la carpeta sound, y renombrarlo como song.mp3)

index.fla:

Hay cuatro bloques de código:

En primer lugar, importamos la clase:

import com.FrequencyVisualization;

Luego cargamos de manera externa un sonido:

var soundReq=new URLRequest(”sound/song.mp3″);
var typeSound = new Sound();
typeSound.load(soundReq);
typeSound.play(0);

A continuación, creamos un objeto al cual le vamos a asignar una serie de propiedades, y que usaremos para enviarle a la clase. Las propiedades de dicho objeto se van a tener en cuenta dentro de la clase a la hora de dibujar (y redibujar) los contenidos del espectro de sonidos. Se le pueden agregar unos cuantos parámetros más, pero con estos poquitos a mi me alcanzó (al menos hasta ahora) para poder aplicarlo prácticamente a cualquier desarrollo sin tener que hacer grandes modificaciones: Los parámetros a enviar son el color de las barras del espectro (barFill), la cantidad de barras (barsNumber), el ancho de las mismas y su separación (barWidth y barsSeparation) y por último, un valor alpha (barAlpha). Más abajo hay algunas imágenes para ver como combinando distintos valores para estas propiedades, podemos obtener resultados considerablemente distintos.

var visObj:Object = new Object();
visObj.barFill = 0xff0066;
visObj.barsNumber=10;
visObj.barWidth = 2;
visObj.barsSeparation = 2;
visObj.barAlpha = 0;

Para concluir, creamos una instancia de la clase FrequencyVisualization, y le pasamos como parámetro el objeto que acabamos de crear:

var eVis:FrequencyVisualization=new FrequencyVisualization(visObj);
eVis.x=250;
eVis.y=stage.stageHeight-30;
stage.addChild(eVis);

Eso es todo :) Los programadores tienen con qué entretenerse dentro de la clase FrequencyVisualization, y quienes no tengan interés en entender códigos ni enredarse en su lógica, tienen un modo sencillo e intuitivo para que en cuatro pasos puedan contar con su ecualizador…

Algunas alternativas:

Modificando los distintos valores de las propiedades que asignamos al objeto que enviamos como parámetro a la clase, obtenemos diversos resultados:

var visObj:Object = new Object();
visObj.barFill = 0xff0066;
visObj.barsNumber=10;
visObj.barWidth = 2;
visObj.barsSeparation = 2;
visObj.barAlpha = 0;

alt11.png

var visObj:Object = new Object();
visObj.barFill = 0xff0066;
visObj.barsNumber=50;
visObj.barWidth = 2;
visObj.barsSeparation = 1;
visObj.barAlpha = 1;

alt22.png

var visObj:Object = new Object();
visObj.barFill = 0×00ff00;
visObj.barsNumber=10;
visObj.barWidth = 2;
visObj.barsSeparation = 2;
visObj.barAlpha = 1;

alt31.png

var visObj:Object = new Object();
visObj.barFill = 0×000000;
visObj.barsNumber=5;
visObj.barWidth = 1;
visObj.barsSeparation = 3;
visObj.barAlpha = 1;

alt41.png

var visObj:Object = new Object();
visObj.barFill = 0xFF9900;
visObj.barsNumber=10;
visObj.barWidth = 10;
visObj.barsSeparation = 2;
visObj.barAlpha = 1;

alt51.png

var visObj:Object = new Object();
visObj.barFill = 0×339999;
visObj.barsNumber=10;
visObj.barWidth = 10;
visObj.barsSeparation = 2;
visObj.barAlpha = 0.2;

alt61.png

NOTA: Al trabajar sobre esta clase, establecí el modo FFT (Fast Fourier Transform) debido al tipo de espectro de sonido que debía representar. El método FFT nos devuelve datos del espectro de frecuencias en lugar de datos de forma de onda. En breve voy a escribir un post con clases y ejemplos de representaciones visuales de datos de forma de onda, en lugar de espectros de frecuencia…veremos que se pueden lograr otras animaciones realmente interesantes.

Saludos!

FlashTracer, Add-on para Firefox

Seguramente muchos conozcan y hagan uso de este add-on, pero para quien sea una novedad, va a encontrar una enorme solución en este pequeño, sencillo y facil de implementar plug-in para Firefox.

Por medio del mismo, podemos visualizar todos los mensajes de salida (outputs generados por la función trace() en Flash) que se ejecuten en un SWF desde la ventana del navegador…

Para que funcione, debemos tener instalada la versión Debug de Flash Player. Se puede hacer la descarga del mismo desde el siguiente link:

http://www.adobe.com/support/flashplayer/downloads.html

Y aquí el link para la descarga del add-on:

https://addons.mozilla.org/en-US/firefox/addon/3469

una vez instalado, lo ejecutamos desde el panel Herramientas de nuestro navegador. Una vez abierta la extensión, en la misma se encuentran las instrucciones para vincularlo correctamente al archivo flashlog.txt (archivo de texto en el cual se almacenan todos los mensajes de salida de Flash al utilizar la versión debug de Flash Player).

Sencillo:

Dentro de nuestro FLA hacemos algún uso de la función trace:

for(var m:uint = 0; m<10; m++){
trace(m, ” - saludos desde as3Hispano.com! :)”);
}

Y al ejecutar nuestra película desde el Firefox y tener abierto Flash Tracer, veremos los mensajes de salida:

trace.png
Y aquí les dejo otro modo de poder visualizar los trace() de Flash desde el navegador; esta vez, por medio de Firebug (gracias NaN!):

 http://labs.findsubstance.com/2008/02/26/firebugs-console-log-flash-debugging-made-easy/ 

Al menos yo prefiero Flash Tracer por su implementación, y porque su uso es más sencillo; Flash Tracer directamente lee los mensajes de salida guardados en el archivo flashlog.txt, y Firebug establece una comunicación por medio de ExternalInterface para posteriormente mostrar el mensaje en la consola de salida.

Si bien uso Firebug, lo prefiero para otro tipo de soluciones…de todos modos, sobre gustos… :)

Saludos! :)