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 »

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

May 27

Doy por hecho que el lector de este artículo quiere deshacerse de Flash para compilar un swf. La herrramienta a utilizar es FlexBuilder. ¿Por qué FlexBuilder si solo vamos a usar ActionScript? (si, este post va sobre un proyecto ActionScript, nada que ver con el framework de Flex). Bueno, es simple, FlexBuilder no es ni de lejos, mejor que Flash Develop o FDT para escribir código, pero tiene debugger, y lo uso como herramienta estándar para proyectos ActionScript y proyectos Flex. Así me centro en una sola en lugar de aprendérmelas todas.
Por otro lado lo que me gusta es que al compilar genera un html y swf con su “Express Install” (por si alguien no tiene la versión de Flash instalada). Bueno, vamos al lío… Continue reading »

May 27

Alucino, según leo en este post, Adobe y Flash Player 10 nos trae mas sorpresas como el nuevo protocolo de comunicación RTMFP que funciona bajo UDP (no TCP), y se muestra como alternativa mejorada al protocolo RTMP (basado en TCP) usado por Flash Media Server. Los dos son propiedad de Adobe, aunque el RTMP lo usan diferentes tecnologías de servidor de terceras partes como por ejemplo Weborb o Wowza Media Server entre otros.

Por otro lado las comunicaciones con Flash Player 10 llevarán integradas el códec de audio de alta calidad SPEEX, con el que según se dice, se podrán realizar aplicaciones de sonido y transmisión de voz mucho más potentes.

Pero bueno, a lo que iba el post..
Parece ser que Adobe implementará en un futuro próximo una red de servidores que implementen estas conexiones y que serán accesibles desde Flash Player 10 mediante los objetos de ActionScript “NetConnection” y “NetStream”.

Digamos que el proceso sería el siguiente:

  1. Un cliente swf (swf 1) establece una conexión con un server de Adobe
  2. El servidor le asigna al cliente una ID única y temporal
  3. Otros clientes pueden subscribirse a los eventos y streams del primero (swf 1), mediante dicha ID mientras la conexión siga abierta

Esa misma ID que se establece en la conexión servirá también como identificador para aplicaciones de chat u otras comunicaciones.

¡Gran noticia!

Ahora mismo con RTMP podemos enviar un stream de sonido o video (micrófono o webcam) a un servidor que lo propague (broadcast) a otros clientes swf. Con la nueva tecnología, se podrá enviar un stream directamente de cliente a cliente sin pasar por el servidor, lo que nos abre un mundo de posibilidades enorme.

Además, el envío de datos mediante “NetConnection.send()” no se limita a streamings, sino a cualquier tipo de datos (eso sí, con sus limitaciones de tamaño). Lo que quiere decir que ya no nos hace falta un servidor para hacer por ejemplo un chat, un juego de comunicación en tiempo real, etc.

La gran pega a todo esto es que si frente a nuestra conexión tenemos un firewall que bloquee el protocolo UDP, no funcionará.

Muchos se están preguntando si se podrá implementar una red P2P (peer to peer) con esta tecnología, pero según argumenta Justin Everett (Product Manager for Flash Player at Adobe), las redes peer to peer se basan en lectura y escritura de datos constante en disco duro, guardando en memoria las diferentes partes de los archivos cuando son necesarias. Con Flash Player 10 se puede cargar un archivo del disco duro al runtime, pero se tiene que hacer manualmente, y de uno en uno, por lo tanto el P2P queda descartado.

Y digo yo, que aunque queden descartados los intercambios masivos de datos, si que podríamos hacer un messenger con envío de archivos, un sistema de video conferencia con archivos compartidos entre los clientes, aplicaciones mejoradas de e-learning, juegos multiusuario que trabajen con imágenes y ficheros de usuarios en tiempo real, etc, etc, etc…, y todo como ya he dicho, sin programación de servidor de por medio.

Esperemos que Adobe ponga pronto a disposición los servidores de comunicaciones para que todo esto sea posible, y que se documente bien el Flash Player 10.

Ahí dejo eso, que cada uno saque sus conclusiones.

May 25

Este es el primer post sobre la tecnología 3D con flash llamada Papervision3D. Ya que estoy empezando con ello, iré posteando referencias sobre las pruebas que haga. Hay muchos tutoriales por ahí con los que empezar, pero creo que otro punto de vista nunca viene mal, y sobretodo si está en español (la mayoría no lo son)

Nota: Este artículo parte de cero en cuanto a que no solo explica el comienzo de un proyecto con papervision, sino también a cómo usar un cliente de subversion para actualizar y/o descargar el uso de código de terceras partes, la configuración de un proyecto en Flex Builder y conceptos básicos con los que empezamos a lidiar cuando damos el salto desde Flash a otro modo de desarrollar ActionScript Continue reading »

May 10

 

Hola a todos, os dejo un listado de las ultimas api´s en as3 que he encontrado últimamente. Sirven para acceder diréctamente desde ActionScript (bueno, para según qué cosas hace falta código del lado del servidor) a servicios conocidos como YouTube, Facebook, Flickr, etc.
Os recomiendo que descarguéis los archivos (normalmente son repositorios de subversion) y que vayáis probando. Suelen ser bastante sencillos en cuanto a funciones básicas.

Picasa albums:
http://code.google.com/apis/picasaweb/overview.html

Flickr:
http://code.google.com/p/as3flickrlib/

YouTube:
http://code.google.com/p/as3-youtube-data-api/

Facebook:
http://code.google.com/p/facebook-actionscript-api/
http://code.google.com/p/as3facebooklib/

Last FM:
http://code.google.com/p/lastfm-as3/

Y si en esta lista no hay nada que os llame la atención, todavía os queda el buscador de google code!

Apr 18

Acabo de solucionar un problema con texto dinámico que me ha dado más de un día de quebraderos de cabeza en el trabajo.

El caso

Resulta que los contenidos de un frame en concreto (que no sea el 1) de la línea de tiempo (me refiero a cualquier instancia colocada en el escenario), NO están disponibles, o mejor dicho, NO existen nada más llegar al frame.
Por ejemplo:
- Crea una peli nueva
- Pon un movieClip en el frame 5 con nombre de instancia “prueba”
- Ahora vuelve al frame 1 y en panel de acciones escribe este código:

stop();
gotoAndStop(5);
trace(prueba); // null

El resultado del trace nos da “null” !!!!!
Esto no pasaba en as2, y me fastidia que en algunos aspectos as3 va hacia atrás en lugar de mejorar las cosas (y eso que no puedo vivir sin él).

Solución

Para solucionar esto hay que programar un método que busque periódicamente el movieClip “prueba” hasta que ya esté disponible. ¿Cómo?, pues con un Timer por ejemplo:

stop();
gotoAndStop(5);
trace(prueba); // null
 
var timer:Timer = new Timer(10, 0); // se repite cada 10 milisegundos indefinidamente
timer.addEventListener(TimerEvent.TIMER, AccessContent);
timer.start();
 
function AccessContent(event:TimerEvent):void
{
    if(prueba != null)
    {
        Timer(event.target).stop();
        trace("ya tenemos acceso a prueba: ", prueba)
    }
}

Yo personalmente preferiría no tener que hacer esto nunca, ya que me parece una guarrería, pero a veces, por como está montado el proyecto, (o cómo nos lo han dado), o vete a saber qué cosas, pues tenemos que hacer ñapas como estas.
De todas formas, no se si esto es “lógico” o es un bug.

Saludos

Mar 05

Estaba por ahí navegando cuando me encontré este manual, por cierto muy bien explicado y todo muy clarito. Ojalá lo hubiera encontrado antes!!!!

Muy acertado para los que se quieran iniciar con Eclipse y el plugin FDT para ActionScript, tanto AS2, como AS3. Explica como compilar con Flash CS3, mtask y Flex SDK.

También explica la instalación y uso de algunos plugins de Eclipse muy utilizados como el plugin de Subversion (SVN)

Mar 04

Estoy metido en un proyecto donde los “artes” han dictaminado que nuestra aplicación Flash (un juego) irá a 12 FPS(frames por segundo). Los motivos no vienen al caso.

Resulta que yo siempre he testado a 31 FPS, por lo que mis animaciones con Tweening (Tweener de Caurina) iban de lujo. Cuando puse el swf a 12 FPS menuda cagadilla, todo a saltos y horrible. Y claro, es que la mayoría de las librerias de Tweening usan el evento ENTER_FRAME para renderizar el movimiento, por lo tanto, a menor tasa de frames por segundo, menos fluidas serán nuestras animaciones, al igual que ocurre con animaciones en timeline.

Buscando por ahí encontré este paquete de animaciones que permite elegir el modo de renderizado entre ENTER_FRAME y un TIMER, además de otra serie de características que me han gustado bastante. Problema del framerate arreglado ! Incluso a 1 FPS la animación rula bién.

Felicitación y gracias al máquina que las hizo (boostworthy.com).
Os animo que que os bajeis el paquete, que viene con documentación, y que la probéis. No tiene desperdicio.