feb 22

Muchas veces habrás tenido que gestionar varios idiomas desde tu aplicación, y ya sabrás que es un pelín tedioso.
En su día programé una clase muy simple que usaba en aplicaciones Flash, pero le he modificado un par de detalles para adaptarla a Flex, de tal manera que haga uso de su maravilloso DataBinding. Además he escrito dos ejemplos prácticos para:

  1. Cargar idioma por defecto (mediante flashvars)
  2. Cambio de idioma dinámico en tiempo de ejecución

A continuacíon explico el proceso completo para ponerlo todo en marcha:
Continue reading »

feb 16

xperiaadobe

Parece que por fin nos aseguran que en el 2010 los teléfonos móviles avanzados con s.o. Android, Windows Mobile y Symbian dispondrán de una versión de Flash player 10 similar a la de los ordenadores. Con Apple las negociaciones van por separado, pero está claro que en el mercado español esta noticia tan esperada nos dará por fin la oportunidad de desarrollar aplicaciones compatibles con la mayor parte de los terminales “avanzados” del mercado y los ordenadores, lo cual si es acompañado por una estandarización de mejores tarifas de datos supondrá por fin un salto importante a la creación de un mercado de navegantes multiplataforma.

Un mercado con una población realmente grande como para desarrollar aplicaciones y publicidad al mismo nivel que la que existe en internet para los ordenadores pero con las personas conectadas en todo momento, geoposicionadas y dispuestas a ofrecer contenidos en “vivo” desde el lugar donde se encuentren. Las posibilidades, como ya hemos comentado tantas veces, son espectaculares.

En fin, sólo puedo decir que…, ya era hora.

Vía | Reuters.

feb 09

Este fin de semana , he estado pegándome con la Realidad Aumentada y al final conseguí sacar adelante un ejemplito el cual os quiero enseñar. Este post es el primero de una serie en la que iré explicando y comentando los diferentes aspectos de este tema desde la perspectiva de Flash. Espero que os guste este pequeño ejercicio.

http://www.vimeo.com/3134152
feb 05

Os queria enseñar un nuevo trabajo que acabamos de terminar en mi actual (por poco tiempo) empresa.
Se trata de http://www.viceroy.es/, una web realizada intregramente en ActionScript 3.0 (en cliente) y Coldfusion 8 (servidor).

Es un catálogo de productos y datos sobre la marca con diseño muy sencillo y limpio, sin demasiados efectos ni fuegos artificiales. Simplemente va al grano. Uso masivo de remoting.
Aquí van algunas herramientas que hemos usado a parte de nuestras propias librerías:

- SWF Adress
- SWFFit
- Tweener (caurina)
- Rosa (remoting)
- Flex Builder
- Flash CS3 (generación de assets)

ene 29

Aunque en la mayor parte del resto de Europa y en el resto de países tecnológicamente avanzados disfrutan ya de un ancho de banda que ya no requiere en muchas ocasiones precargadores en España aún tenemos que usarlos en multitud de proyectos. 

En general los perfiles de dirección de arte de las agencias interactivas suelen olvidarse de esta pieza que a mi entender es la encargada de retener al usuario mientras su “lenta” conexión consigue cargar nuestro sensacional website “ajustadísimo de pesos” hasta donde los “creativos” permitieron reducir. Si estáis cansados de hacer siempre el mismo loader y buscáis un sitio interesante donde inspirarse con semejante entuerto os recomiendo (como siempre a los que no lo conozcáis ya) prettyloaded, una extensa recopilación en la que encontraréis todo tipo de creaciones en múltiples estilos.

Personalmente echo muy en falta la posibilidad de navegar entre los ejemplos, poder volver a ver alguno, o comparar varios, así como un link al website al que pertenecen para poder verlo en su contexto. Esperemos que incorporen más funcionalidades y evolucionen el proyecto en futuras versiones.

ene 28

La verdad es que el focusRect (rectángulo amarillo que muestra el foco de los objetos en pantalla cuando pulsamos tabulador) desentona mucho con el diseño del site.
Estaba intentado averiguar la manera de que no apareciera en ningún objeto, pero claro, deshabilitar esto de uno en uno podía ser una tarea infernal. Hasta que miré las propiedades del stage y me encontré con esto:

stage.stageFocusRect = false;

Ala, ya te puedes olvidar del maldito rectangulito

ene 25

Una clase muy útil para manejar eventos. Solo tendrás que cambiar la manera de crear y destruir los eventos, para que se haga a través de esta clase. Se puede utilizar a nivel de aplicación. Luego puedes destruir todos los eventos de un determinado objeto o algunos de ellos mediante filtros. Tendrás otra vez el antiguo “removeAllListeners”.

http://k2xl.com/wordpress/eventmanagerclass/

ene 24

Me ha parecido muy interesante la iniciativa de este programador, con la creación de una librería para poder acceder a un respositorio (de momento públicos) de Subversion. Su nombre es as3svnlib.

De esta manera podremos crear un interfaz a nuestro gusto para mostrar un repo. Supongo que alguien le dará más utilidad pronto. Hace poco me comentaba un compañero de trabajo que usaban las revisiones de svn para controlar el trabajo de cada uno, a parte de un gestor de tareas, etc. Quizá ésto les pudiera servir para crear una vista más amena.

La pega: de momento es de solo lectura, solo sirve para ver las últimas revisiones.

ene 23

Aplicación Flex con pruebas de rendimiento en tiempo real y reflejadas en gráficas de datos comparativas
http://businessintelligence.me/projects/performance_tester/performanceTester.html

Visible vs alpha vs removeChild()
Ventajas y desventajas de cada uno de los métodos, y situaciones prácticas de cada uno
http://www.insideria.com/2008/11/visible-false-versus-removechi.html

Caracteres “\n” y “\r” en un String de ActionScript
http://www.moock.org/blog/archives/000281.html

Descarga (unload) de contenidos cargados en Flash Player.
A veces es un infierno. Aquí entendereis el por qué y cómo solventarlo
http://www.moock.org/blog/archives/000279.html

Más sobre descarga de contenidos
http://www.gskinner.com/blog/archives/2008/04/failure_to_unlo.html

La manera más rápida de copiar un array
http://agit8.turbulent.ca/bwp/2008/08/04/flash-as3-optimization-fastest-way-to-copy-an-array/

Operaciones matemáticas más rápidas. Optimización mediante operadores de bit
http://lab.polygonal.de/2007/05/10/bitwise-gems-fast-integer-math/

Comparativa de rendimiento de los distintos loops de AS3
http://lab.polygonal.de/2006/10/08/as3-loops-performance-comparison/

Comparativa de rendimiento entre Flash Player Debugg y Flash Player Release
http://lab.polygonal.de/2006/10/08/as3-loops-performance-comparison/

Optimización de operaciones con seno y coseno
http://lab.polygonal.de/2007/07/18/fast-and-accurate-sinecosine-approximation/

Optimización de cálculo
http://rockonflash.wordpress.com/2007/08/11/optimizations-for-as3-calculations/

Técnicas generales de optimización. Pdf muy completo
http://je2050.joa-ebert.com/files/misc/as3opt.pdf

Optimización de operaciones de cálcula básicas y uso de la clase Math
http://osflash.org/as3_speed_optimizations

Comparativa entre métodos “manuales” y la clase Math
http://www.calypso88.com/?cat=7

Loops y variables. Un ejemplo muy concreto
http://www.bit-101.com/blog/?p=1271

Int, uint, Number
http://www.gskinner.com/blog/archives/2006/06/types_in_as3_in.html

ene 23


25lines.com es un concurso en el que cualquiera puede participar (ejem, cualquiera… es mucho decir). El requisito principal es usar puro y llano código (ActionScript). Nada de assets de librería, nada de cargas externas, solo código.

Ver para creer… es alucinante como la gente consigue “comprimir” su ingenio en 25 lineas. Todo un reto y una auténtica muestra de capacidad y creación.

Podréis ver desde un juego tipo “space invaders” hasta un paisaje 3D en movimiento, pasando por efectos de webcam muy currados.

Todavía puedes votar el que más te guste en esta página (previo registro)

ene 23

Explicación esquemática sobre el uso de matrices (matrix) aplicadas a Flash para la manipulación de bitmaps y lo que se deriva de ello: deformación, manejo del color, filtros, operaciones con píxeles, etc.

ene 14

Hace unos días se dió a conocer este motor de física para entornos 3D con Flash, orginalmente pensado para Papervision3D, pero que rápido la comunidad ha portado a Sandy 3D engine y Away3D.
En realidad esta librería es una traducción a ActionScript de la libería original escrita en C++.
Los que conozcan WoW engine , Bolt3D y sus limitaciones creo que verán la luz al ver los ejemplos de esta nueva librería. Por los ejemplos que he visto y las clases del proyecto, creo que será bastante sencillo su uso. Os paso unos enlances con ejemplos, casi todos son lo mismo, pero desde diferentes engines. Ahora los suyo sería que hagamos nuestras propias pruebas un poquito más originales.
Yo de momento solo he intentado llegar a ver qué rendimiento puede alcanzar con muchos elementos en pantalla. Para eso hice esta prueba en la que puedes ir agregando “cuerpos” con la tecla enter. Al pasar de 20 la cosa empieza a ir muy lenta. Pero este japo con el away3D, como se ve, le rinde muchísimo más. Habrá que hacer más pruebas

Home del proyecto

Ejemplo con Away3D 1

Ejemplo con Away3D 2
Ejemplo con Away3D 3
Ejemplo con Sandy3D
Ejemplo con Papervision3D 1
Ejemplo con Papervision3D 2 (una prueba mía)
Ejemplo con Papervision3D 3 (del autor)
Ejemplo con Papervision3D 4 (del autor)

Podéis descargar el código fuente del proyecto mediante un cliente de subversion desde este link:
http://jiglibflash.googlecode.com/svn/trunk/
Según afirma uno de sus autores, el proyecto acaba de empezar y todavía está en una fase muy temprana, por lo cuál todavía está lejos de quedar terminado.

dic 13

Hacer un buscador de Google con Flex es lo más fácil que te puedas imaginar gracias a la API de Ajax de Google para búsquedas. En este caso hice un mini buscador con resultados paginados.
Botón derecho > “view source” para ver el código.



oct 20

Cuando el compilador de FlexBuilder nos lanza un error en tiempo de ejecución, automáticamente veremos una pila de lineas relacionadas con dicho error. Digamos que tenemos la siguiente estructura de objetos:

Clase Main alberga > clase Menú que alberga > clase Boton

Si uno de los botones genera un error, FlexBuilder nos dirá que en la línea x de la clase Botón hay un error, y seguidamente, nos mostrará el “camino” que ha seguido la aplicación para llegar a dicho error. En este caso el camino sería algo así (pseudo error imaginario claro):

Se ha intentado acceder a un objeto nulo: clase Boton, linea 27
[....] Menu, linea 69
[....] Main, linea 10

Pues bién, esta forma de mostrar los errores no es una característica de Flex Builder. En realidad es un método de la clase “Error” de ActionScript 3. Concretamente el método “getStackTrace()“.

¿Que para qué me sirve saber esto?
Pues resulta que si compilas con Eclipse FDT (por ejemplo), desgraciadamente los errores no vienen seguidos de su stack trace, y es mucho más dificil captarlos, o saber de dónde vienen.

Todavía no he descubierto la manera de que esto sea automático, pero en su lugar hago mucho uso de las sentencias try-catch, con las que podemos simular lo que os contaba:

try
{
    trace("Esto podría generar un error:", objeto.HacerAlgo());
 
}catch(e:Error)
{
    trace(e.getStackTrace()); // esto nos lanza todo el stack trace si se produce un error
}

Espero que os sirva si trabajáis con FDT, y si por casualidad alguien sabe cómo hacer que esto salga por defecto como en Flex Builder, soy todo orejas. Yo he preguntado en el foro de FDT, pero nadie me conesta =(

oct 20

Solo un apunte rápido. De toda mi experiencia de AS3 hasta la fecha, me acabo de dar cuenta (mira qué luces tengo!), de que la mayoría de errores “en tiempo de ejecución” (sí, eso que pasa después de compilar =), son por la misma causa. Porque estoy intentando manejar un objeto que no existe, ya sea llamándolo directamente, lo cuál es más facil de detectar, o llamándo a un método o propiedad de dicho objeto.

El error típico suele ser:
“TypeError [n]: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo”.

Si compilas con flex builder te dirá exactamente la línea del error. Pero lo que hago casi siempre para solucionarlo es una traza de cada una de las propiedades del objeto. Para ello tengo un método estático en una clase típica de útiles, de esta manera:

public static function TraceProps(o:*):void
{
	for ( var i:* in o)
	{
		trace(">", i, ":", o[i]);
	}
}

Así veremos el nombre y valor de cada propiedad del objeto, y podremos detectar más fácilmente nuestro error.

jul 27

Me comentaba un amigo que tenía problemas a la hora de utitilizar en FlashCS3, el código que estaba usando en FlexBuilder, y por eso he hecho un video tutorial explicando como crear y organizar el mismo proyecto con los dos IDE´s. Se muestra como compilar con FlexBuilder, así como utilizar FlexBuilder solo para la edición de código, dejando la tarea de compilar para Flash CS3.

Los puntos tratados son los siguientes:

  • Estructura de directorios para un proyecto ActionScript con FlexBuilder y FlashCS3
  • Creación del proyecto, propiedades y classpath
  • Main class (FlexBuilder) y Document class (Flash CS3)
  • Diferencias básicas a la hora de compilar
  • Propiedades de documento
  • Alineación del Stage
  • Uso de librerías de símbolos Continue reading »
jul 25

En una larga charla con Juan Muro, sobre los diferentes hábitos de hacer las cosas en lo que se refiere a proyectos ActionScript, llegamos a la conclusión de que muchos flasheros no dan el salto a utilizar otro editor de código que no sea FlashCS3, y mucho menos a compilar (publicar), por desconocimiento, poca información clara al respecto y confusión entre conceptos tales como Flex, FlexBuilder, Eclipse, FDT, classpath, swc, y diversos términos relacionados con la programación orientada a objetos (POO), etc.

La razón es sencilla. Estamos arraigados a Flash hasta la médula, y nos cuesta cambiar nuestras maneras, que buenas o malas, siempre nos han funcionado.

Con este post me gustaría aclarar dudas que se plantean a cualquier flashero con poca o mediana experiencia a la hora de afrontar un PROYECTO ACTIONSCRIPT con otra cosa que no sea FlashCS3. Continue reading »

jul 22

Nos encontramos con una aplicación de tantas en la que debemos cargar contenidos externos por demanda del usuarío: una galería de fotos, un catálogo de productos, etc, etc.

Vamos cargando esas imágenes o swf´s en nuestra aplicación y todo es muy bonito y fabuloso… hasta que algo empieza a fallar, se ralentiza o simplemente deja de funcionar. !Mierda! mi pc no vale para nada! Lo tiras por la ventana y te compras uno nuevo… pero a ver, si en mi ordenador que es un pepino, no funciona, los clientes lo van a flipar más aún.

Fuera de bromas, todo esto pasa porque lo que vamos cargando se almacena en memoria, y cuando hacemos desaparecer un contenido, no lo estamos aniquilando debidamente.
Resulta que el típico MovieClip.unloadMovie() de AS2 ha desaparecido en el olvido. Ese método se cargaba cualquier cosa que hubiera cargado externamente, liberando así la memoria y haciéndonos más felices y contentos. En cambio, en AS3 la cosa se complica mucho. Según leo en el blog de gSkinner, éstos son los motivos del problema, y por los cuáles sería imposible “descargar” algo:

  • Cualquier listener, timer, o variable que haga referencia al contenido cargado
  • Un contenido cargado con la línea de tiempo reproduciéndose
  • Un contenido cargado con algún listener que se refiera al stage, o a cualquier cosa fuera de su ámbito

Y creo que no podría explicarlo mejor que gskinner en este párrafo:

In AS3, calling Loader.unload() simply removes the reference to the loaded movie. If any other references exist to the loaded content, it will not be unloaded. Even when all references are removed, it only frees the content for collection by the garbage collector at some indeterminate point in the future. This means that even if everything worked as expected the loaded content will continue to execute, and remain in memory for an indeterminate amount of time after you unload it. This is problematic in many ways, but it is made worse by a bug in the player.

Parece mentira que a estas alturas con un señor Flash Player 9 y el tan supuestamente mejorado y todo poderoso ActionScript 3.0, nos encontremos con que la gestión de memoria es lo más decadente que nos podamos echar encima.

Aunque no todo es feo y negativo. Por lo visto con Flash Player 10 está medio resuelto el problema, y esperemos que este player se extienda rápido para poder producir con él.

Otro buen artículo sobre gestión de recursos, tambien de Grant Skinner.

Ala! a disfrutar con Adobe

jul 21

Estaba tratando de manejar crear un bitmapdata para reflejar una imagen que había cargado externamente cuando me saltó este error:

ArgumentError: Error #2015: Objeto BitmapData no válido

Despues de mirar en la ayuda de Flash, vi que podía ser por por dos razones:

  1. Estamos intentando crear un BitmapData con un ancho o alto que no es un valor numérico válido (esto suele pasar si lo creamos a partir de una imagen que hemos intentado cargar externamente pero que no se ha cargado bien)
  2. Estamos intentado crear un BitmapData demasiado grande (el límite tanto para el ancho como para el alto son 2880 pixeles). Para esto podemos hacer un simple control de errores
if(loquesea.width > 2880 || loquesea.height > 2880)
{
	throw new Error("La imagen supera los 2880 pixeles permitidos para BitmapData");
	return;
}

Un saludo

jul 16

Basándonos en el ejemplo anterior de cómo crear una aplicación mediante el “BasicView”, vamos a utilizar todas las primitivas de Papervision3D (package objects.primitives).

De momento usaremos solamente un material, el WireframeMaterial, ya que el uso de materiales se detallará debídamente en otro post.

Aunque no es una primitiva tambien usaremos la clase UCS (objects.special), que no es sino un eje de coordenadas 3D visibles formadas por líneas (core.geom.Lines3D), que nos pueden ser muy útiles en algunos casos.

También aprovecho para implementar un movimiento de cámara con tweenings, de una primitiva a otra, y una navegación mediante botones fuera de la escena de Papervision, que servirán para navegar. Los botones son de la clase “ItemButton”, de los cuáles podéis ver la referencia en este post, aunque lógicamente sirve cualquiera. Continue reading »