Feb 22

Some times you need to manage more than one language from your app, and you know that it´s a boring task.
Time ago I wrote a very simple class that I used in Flash applications, but I modified a couple of details to adapt it to Flex, so now it uses the wonderfull DataBinding. Apart from that I´ll show you two practical examples for:

  1. Load a default language (via flashvars)
  2. Change language at runtime

Next I´ll explain the complete process to make it work:
Continue reading »

Feb 16

xperiaadobe

It seems that finally Adobe tell us that advanced mobile phones with  o.s.  Android, Symbian and Windows Mobile in 2010 will have a Flash player 10 similar to that of computers. Apple negotiations go separate, but it is clear that this long-awaited release by spanish market finally gives us the opportunity to develop applications compatible with most terminals “advanced” market and computers, which if accompanied by a better standardization of data tariffs will mean a significant leap in order to create a market platform navigators.

A market with a big population for developing applications and advertising the same level as that found in the internet for computers with the people connected at all times, and willing to offer geopositioning in “live” from the location . The possibilities, as we have said many times, are spectacular.

Anyway, I can only say that … it’s about time.

Link | Reuters.

Feb 09

I´ve been fighting with Augmented Reality this weekend and at the end I was able to make a example work, so I want to show you. This post is the first of a serie where I´ll be explaining and discussing about the different aspects of this topic from a Flash perspective. I hope you like this litle exercise.

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

I want to show you a new work we just finished in our company. Check it out at http://www.viceroy.es/. It´s an ActionScript 3 and Coldfusion 8 site based on a product catalogue and brand information, with a simple and clean design. With no great effects, it´s focus on the information. Masive use of Flash Remoting.
Here you can see some of the tools we used in the project.

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

Jan 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.

Jan 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

Jan 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/

Jan 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.

Jan 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

Jan 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)

Jan 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.

Jan 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.

Dec 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 »