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 21

Acabo de hacer una prueba con esta clase y me ha parecido de lo más útil. Hace poco hice una clase similar por no saber que existía (creo que por entonces no existía). Es una cámara que usamos en lugar de “Camera3D”, que nos da total control sobre ella, mediante movimientos de ratón (pinchar y arrastrar) y mediante el teclado.

Me parece idónea para movernos por la escena y explorarla desde todas las vistas posibles cuando estamos desarrollando con Papervision3D. Además podemos explorar en tiempo real, propiedades muy importantes como “fov”, “near plane” y “far plane” para el manejo del frustum culling (la explicación de todo esto vendrá en nuevo post), lo que nos evitará tener que cambiar y probar con numeritos “mágicos” tropecientas veces hasta que los objetos se vean como queremos.

La clase se encuentra en el mismo package de las cámaras (org.papervision3d.cameras).
Si no la encuentras hazle un “update” a tu repositorio, que lo más seguro es que tengas una versión desactualizada.

Aquí va una prueba sencilla de lo que estoy contando: Continue reading »

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 »

Jul 15

Como bién dice en la documentación de Papervision3D (traduzco), el BasicView es una clase que nos brinda una plantilla para configurar rápidamente un proyecto de Papervision, creando automáticamente un viewport, escena, cámara y renderer (bucle de renderización). Como BasicView es una subclase de Sprite, la podemos añadir a cualquier DisplayObject.

En resumen: te facilita la vida para proyectos sencillos, evitando instanciar y declarar unas cuantas cosas.
La clase la podéis encontrar dentro del package “view” de Papervision3D Great White.

Veamos el mismo ejemplo del post “Papervision3D y Flex Builder: Primeros pasos“, pero ahora usando la clase “BasicView”. He quitado todos los comentarios que no vienen al caso para centrarnos en lo importante: Continue reading »

Jul 15

Esta clase es un simple controlador de caché. Un array que almacena datos cargados. Si nuestra aplicación carga datos bajo demanda, por ejemplo de una base de datos, tal vez queramos almacenar los datos en una caché interna, de manera que solo hará falta una petición al servidor para mostrar el mismo dato o consulta.

Ejemplo:

Tenemos un catálogo de productos, el usuario pincha un botón del producto con “id=x”
Hacemos una consulta a la base de datos que nos devuelve todos los datos de ese producto, que parseamos creando un objeto.
El usuario continua navegando por otros contenidos. Acto seguido vuelve a reclamar el producto mostrado anteriormente. ¿Por qué volver a hacer la petición al servidor si previamente podíamos almecenar esa información?

Pues esa situación es la que resuelve esta clase.
Admite cualquier tipo de datos. Continue reading »

Jul 14

Estaba yo paseando por Times Square hace poco, cuando mirando todas las ‘publicidades’ que inundan el citado lugar, me encuentro con que en muchas había un cartelito debajo que decía “Powered by Adobe Flash”, yo pensaba que todo aquello se hacia con After Effects o algo así, pero no, resulta que nuestro querido Flash se utiliza para estas cositas también.

En fin, nunca pensé en hacer piezas Flash para ser visualizadas en semejante soporte, pero quién sabe…

Jul 11

Leyendo un post de EzeQl, me animé a postear una clase para la creación de botones que desarrolle hace tiempo, y que uso tropecientas veces en todos mis proyectos. Creo que es bastante completa y escalable. Casi siempre la uso tal cuál, pero es muy fácil extender su funcionalidad en caso de necesitarlo.

Características:

  • Estados basados en línea de tiempo (aunque también se pueden implementar con código). Se diseña la animación en un solo sentido, que se recorre en el estado “over”. Al hacer un “out” automáticamente la animación se reproducirá hacia atrás.
  • Solo hay que configurar dos estados. Estado out y over. Cuando tengo una botonera y quiero que uno se quede pulsado lo dejo en “over”. De esta manera me libro del estado “pressed” o “down”.
  • Soporte para sonidos de alguna o todas las acciones de botón: click, over, out (se pasan por parámetro en el constructor)
  • Se puede habilitar y deshabilitar el botón
  • Complétamente integrado con la clase Menú (mi clase menú que postearé otro día)
  • Aspecto gráfico y animación (asset) totalmente separado de la lógica del botón (se pasa un MovieClip por parámetro en el constructor)
  • Eventos: este botón avisa de todo lo que hace mediante eventos (OVER, RELEASE, OUT, SELECTED, UNSELECTED, ENABLED, DISABLED, NOSTATE). Continue reading »