Comprobacion de tipos en Actionscript 3.0 con as e is

Comprobacion de tipos en Actionscript 3.0 con as e is

Etiquetas: as is

En Actionscript 3.0 disponemos de dos operadores para verificar tipos: "as" e "is". Es decir, con estos operadores podemos comprobar, por ejemplo, si un elemento del escenario es de tipo Sprite, o si una variable es de tipo Number.

Para ver como funcionan estos dos operadores voy a utilizar un escenario sobre el que tengo 3 MovieClips de la clase "Cuadrado", que extiende de MovieClip, y 3 MovieClips de la clase "Circulo", que también extiende de MovieClip.

El operador is

Permite comprobar si una variable o expresión forma parte de un tipo de datos. No solo verifica si un objeto es una instancia de la clase especificada, sino también si es una subclase de ella o implementa la misma interfaz.

Por ejemplo, si en el escenario que hemos propuesto ponemos:

  1.  
  2. for(var i:uint = 0; i < numChildren; i++){
  3. 	if (getChildAt(i) is DisplayObject) {
  4. 		getChildAt(i).alpha = .1
  5. 	}
  6. }
  7.  

Obtenemos:

Como vemos, "parpadean" círculos y cuadrados, ya que todos son instancias de clases que heredan de DisplayObject. Sin embargo, si ponemos:

  1.  
  2. for(var i:uint = 0; i < numChildren; i++){
  3. 	if (getChildAt(i) is Cuadrado) {
  4. 		getChildAt(i).alpha = .1
  5. 	}
  6. }
  7.  

vemos que solamente parpadean los cuadrados, ya que los circulos no pertenecen a la misma clase ni heredan de "Cuadrado".

El operador as

También permite comprobar si un elemento es miembro de un tipo de datos. Sin embargo, en lugar de devolver true o false, devuelve el valor de la expresión en lugar de true, y null en lugar de false. Por ejemplo:

  1.  
  2. trace(miCirculo as Circulo) //Devuelve: [object Circulo]
  3. trace(miCirculo as Sprite) //Devuelve: [object Circulo]
  4. trace(miCirculo as Cuadrado) //Devuelve: null
  5.  
Actionscript 3.0: Ejemplo básico para cargar imágenes

Actionscript 3.0: Ejemplo básico para cargar imágenes

Etiquetas: Loader URLRequest contentLoaderInfo addEventListener

Uno de los primeros post que escribí, fue "Carga de imágenes y SWF en AS3 con Loader" . Básicamente era una explicación de los diferentes eventos disponibles para trabajar con Loader, y de como añadirlos al objeto. Esta es una explicación más "sencilla" de como cargar una imagen, o un SWF en Actionscript.

Lo primero que tenemos que hacer es crear un objeto tipo Loader. Los Loader son los encargados de cargar imágenes (JPG, PNG o GIF) y SWFs en Flash. Esto lo hacemos así:

  1.  
  2.   var loader:Loader = new Loader();
  3.  

Ahora que tenemos un "cargador", hay que pedirle que informe de los eventos de la carga. Hay muchos eventos, pero los principales son tres:

-Error al cargar la imagen (no se encuentra el archivo)

-Progreso de la imagen (nos informa del progreso de la carga)

-Imagen cargada (la imagen ya se ha cargado y podemos trabajar con ella).

Para que el Loader nos informe de estos eventos, tenemos que asociar cada uno a una función. Es decir, debemos decirle: "si la carga falla, ejecuta esta función, y si se carga, ejecuta esta". Esta charla, traducida a Actionscript 3.0 es:

  1.  
  2. loader.contentLoaderInfo.addEventListener(Event.COMPLETE, imagenCargada);
  3. loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, imagenError);
  4. loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, imagenProgreso);
  5.  

Lo que hemos hecho es "añadir listener de los eventos". Como se puede ver, cada evento vá asociado a una función. El evento Event.COMPLETE, por ejemplo, está asociado a la función "imagenCargada". Estas funciones suelen tener esta apariencia:

  1.  private function imagenCargada(e:Event):void {
  2.   trace("Cargada: " + e);
  3.   addChild(e.target.content);
  4.   }
  5.  
  6.   private function imagenError(e:IOErrorEvent):void {
  7.   trace("Error: " + e);
  8.   }
  9.  
  10.   private function imagenProgreso(e:ProgressEvent):void {
  11.   trace("Cargados=" + e.bytesLoaded + " Total=" + e.bytesTotal);
  12.   } 

Como se puede ver, cada función recibe un parámetro (al que hemos llamado "e", en este caso) que no servirá para obtener información del evento. Por ejemplo, cuando pongamos a cargar la foto, se comenzará a ejecutar periódicamente la función imagenProgreso hasta que termine la carga. Cada vez que Flash ejecute esa función, pasará como parámetro un "e distinto", que contendrá información sobre el progreso de carga en los atributos bytesLoaded y bytesTotal del evento.

Una vez que tenemos añadidos los eventos, tenemos que cargar la imagen mediante la función load:

  1.  
  2.   loader.load( new URLRequest(url));
  3.  

Y listo. El loader que hemos creado se encargará de ejecutar las funciones asignadas a los eventos que le hemos asociado. El evento más importante es Event.COMPLETE, que ejecuta la función imagenCargada cuando el archivo termina de cargarse. Podemos acceder al archivo dentro del parámetro e.target.content den evento.

El código completo, sería el siguiente:

Papervision GreatWhite: crear un plano con dos caras

Papervision GreatWhite: crear un plano con dos caras

Etiquetas: Plane DisplayObject3D Viewport3D BasicRenderEngine

Papervision GreatWhite: crear un plano con dos caras

Existen dos maneras de crear una plano con dos caras en Papervision3D:

-Crear un cubo con una profundidad de 1pixel, y utilizar las caras delantera y trasera como caras del plano.

-Crear un contenedor DisplayObject3D, y meter dentro dos planos. El plano "b" debe tener una profundidad de 1 y una rotatión de -180º.

El segundo método es el que me parece más cómodo, ya que gestionar los materiales con un cubo es más engorroso que con un plano. Un ejemplo de plano con dos caras podrías ser:

  1.  
  2. contenedor = new DisplayObject3D();
  3. var planoA = new Plane(new MovieAssetMaterial("CaraA"), 400, 400, 4, 4);
  4. var planoB = new Plane(new MovieAssetMaterial("CaraB"), 400, 400, 4, 4);
  5. planoB.z = 1;
  6. planoB.rotationY = -180;
  7. contenedor.addChild(planoA);
  8. contenedor.addChild(planoB);
  9. escena.addChild(contenedor);
  10.  
Dibujar en un cristal con vaho en Actionscript 3.0

Dibujar en un cristal con vaho en Actionscript 3.0

Etiquetas: addEventListener MOUSE_MOVE drawCircle beginFill endFill

Dibujar en un cristal con vaho en Actionscript 3.0

Este ejemplo muestra como hacer el efecto de "pintar sobre el vaho" en un cristal. Esta es la manera más sencilla que en encontrado de hacerlo, desde el punto de vista de alguien con pocos conocimientos de programación. Para hacer este efecto necesitamos:

-Imagen del cristal con vaho:

Ventana con vaho

-Imagen de cristal sin vaho:

Imagen de cristal sin vaho

-Nociones de AS3 (Sobre todo de la API de dibujo)

Los pasos a seguir serían los siguientes:

-Importar las dos imágenes a Flash, y poner cada una en una capa (la imagen sin vaho por encima de la con vaho), en la posición (0,0)

-Crear un clip vacio y llamarlo "Mascara_mc". Ponerlo en (0,0)

-Hacer que "Mascara_mc" sea la mascara para la imagen sin vaho. Aquí tenemos un pequeño "problema", y es que al estar vacio, no nos va a aplicar bien la máscara. Por ello, antes de ponerlo como máscara, nos metemos dentro de "Mascara_mc" y dibujamos un pequeño cuadrado.

La linea de tiempo nos quedaría asi:

Linea de tiempo en Flash

-Por último, tenemos que programar la escena, para que cuando hagamos click, se dibuje dentro de "Mascara_mc" y se vaya destapando la imagen con vaho.

El código en Actionscript 3.0, y el resultado, son los siguientes:

Como hacer una pizarra en Actionscript 3.0

Como hacer una pizarra en Actionscript 3.0

Etiquetas: Shape lineStyle moveTo clear removeEventListener doubleClickEnabled

Como hacer una pizarra en Actionscript 3.0

Uno de los ejercicios típicos que se suelen hacer al comenzar a programar en Actionscript, es una pizarra.

En Actionscript 3.0 tenenmos que utilizar la clase Graphics. Podemos pintar dentro de cualquier objeto de visualización que tenga el atributo graphics (Shape, Sprite, MovieClip).

Lo primero que tenemos que hacer es definir el estilo de linea (color,grosor, etc) que vamos a utilizar en nuestro objeto. En este ejemplo vamos a dibujar en un Shape definido por la variable pizarra, por lo que podemos definir su estilo de linea asi:

  1. pizarra.graphics.lineStyle(10,0x000000);

Ahora tenemos el pincel en (0,0), con un grosor de 10 y color negro. Si queremos pintar una linea desde (100,100) hasta (200,200), tenemos que mover el pincel hasta (100,100). Para ello usamos la función moveTo(x,y);

  1. pizarra.graphics.moveTo(100,100);

Y ahora dibujamos la linea con lineTo:

  1. pizarra.graphics.lineTo(200,200);

Por último, si queremos borrar lo dibujado, utilizamos la función clear():

  1. pizarra.graphics.clear();

Hay que tener en cuenta que esta función borra además las definiciones de estilo de linea y relleno, por lo que antes de seguir dibujando debemos volver a hacerlas.

Utilizar materiales interactivos en Papervision GreatWhite

Utilizar materiales interactivos en Papervision GreatWhite

Etiquetas: InteractiveScene3DEvent BasicRenderEngine Viewport3D displayObject3D

Utilizar materiales interactivos en Papervision GreatWhite

Para utilizar eventos de ratón sobre objetos en Papervision GreatWhite, tenemos que hacer tres cosas:

-Crear un objeto Viewport3D con el atributo interactive = true
/
-Crear un objeto y poner el atributo interactive de su material = true

-Añadir los eventos al objeto

El código comentado, tras el salto.
Programar un botón en Flash Actionscript 3.0 (AS3)

Programar un botón en Flash Actionscript 3.0 (AS3)

Etiquetas: MouseEvent addEventListener CLICK MOUSE_OVER MOUSE_OUT

Programar un botón en Flash Actionscript 3.0 (AS3)

En Actionscript 2.0 existía la opción de crear un botón, hacer click encima y escribir código encima del propio objeto. En AS3 no existe la posibilidad de escribir código sobre clips de película ni botones, todo el código debe estar situado en la linea de tiempo o en clases. Esto puede parecer un inconveniente, pero a la hora de hacer desarrollos medianos/complejos hace las cosas mucho más sencillas.

Además programar botones en AS3 no es más complicado que hacerlo en AS2, sólo tenemos que añadir el evento al objeto con addEventListener, indicar que evento añadimos ("Event.CLICK", "Event.MOUSE_DOWN, etc...) y crear la función que se vá a ejecutar cuando se reproduzca el event. Es decir, que traducido al castellano, lo que decimos es:

 

Utilizar clases con Actionscript 3.0: Parte II

Utilizar clases con Actionscript 3.0: Parte II

Etiquetas: package import addEventListener

En este anterior post, mostraba como empezar a trabajar con clases en AS3. En este segundo tutorial, mostraré como podemos enlazar nuestros elementos de la biblioteca con sus clases correspondientes, y como insertar estos objetos en el escenario (haciendo algo "parecido" a lo que se hacía en AS2 con attachMovie.

Lo primero que voy a intentar explicar es como se "suelen" organizar las clases. Normalmente la clase principal (la que se asocia al documento, como vimos en el anterior tutorial) se deja en la misma carpeta que el .fla principal, y el resto de clases secundarias se ordenan en una serie de subcarpetas siguiendo esta estructura:

-Nombre del dominio invertido de la persona o empresa que crea el programa. Por ejemplo en mi caso tengo las clases en com/esedeerre/.. es decir, que siempre creo una carpeta com, que tiene dentro una carpeta esedeerre, que tiene dentro una serie de carpetas con los nombres de los paquetes (ahora veremos lo que es un paquete): "utilidades", "precargas", "sonido", etc...

Esta forma de nombrar las clases, garantiza que los nombres de paquete sean únicos. Por ejemplo si en una aplicación Flash usamos clases de Papervision, de Ape, propias y de Flash, y todas estuvieran nombradas de la misma manera, Flash tendría problemas para buscarlas. Utilizando esta estructura nos aseguramos que nuestras clases no se van "a pegar" con las de otros paquetes de clases.

Ahora que hemos visto como se suelen organizar las clases, vamos a ver como acceder a esas clases que están "escondidas" en carpetas. Si tenemos una clase en com/esedeerre/Bola.as, para acceder a ella tendremos que hacer:

  1.  
  2. import com.esedeerre.Bola
  3.  

Dicho esto, creamos un documento nuevo de Flash(Actionscript 3.0) , y asociamos el escenario a la clase Main. Ahora vamos a crear un círculo, click encima, botón derecho, convertir en símbolo, y dejamos la pantalla como esta:

Flash: Exportar en primer fotograma

Lo que estamos haciendo es crear un clip de película con nombre de instancia Bola_mc. Lo asociamos a la clase com.esedeerre.Bola (que vamos a crear después), y le decimos a Flash que lo exporte en el primer fotograma y lo exporte para Actionscript.

Ahora que tenemos el clip de la clase "Bola", vamos a su archivo de clase. Creamos un nuevo Archivo de Actionscript y lo guardamos en una carpeta llamada esedeerre, que esté dentro de una carpera com, con el nombre de Bola.as.

En este archivo escribimos:

  1.  
  2. package com.esedeerre{
  3. 	import flash.display.MovieClip;
  4. 	public class Bola extends MovieClip {
  5. 		import flash.events.*;
  6. 		public function Bola():void {
  7. 			addEventListener(Event.ENTER_FRAME,mover);
  8. 		}
  9. 		private function mover(e:Event) {
  10. 			x+=5;
  11. 			if (x > 300) {
  12. 				x = 0;
  13. 			}
  14. 		}
  15. 	}
  16. }
  17.  

Lo que estamos haciendo es crear una clase Bola, que hereda de MovieClip. En la primera linea ponemos

package com.esedeerre{

porque hemos guardado el archivo Bola.as en com/esedeerre/. Si lo hubieramos guardado en la misma carpera que el fla, sólo tendríamos que poner package. Es decir. que le estamos indicando a Flash la ruta hasta el archivo Bola.as. El resto de lineas siguen la estructura que ya vimos en el primer tutorial. En este caso en la función constructora

  1.  
  2. public function Bola():void {
  3.  

hemos añadido un evento enterframe para el objeto, asociado a la función mover. Esta función mueve 5 px hacia la derecha el objeto, y cuando llega a x=300 lo vuelve a colocar en 0.

Ahora que tenemos la clase Bola, vamos a crear la clase Main. Creamos un nuevo archivo de Actionscript, y escribimos:

  1.  
  2. package {
  3.  
  4. 	import flash.display.MovieClip;
  5.  
  6. 	public class Main extends MovieClip {
  7.  
  8. 		import flash.text.TextField;
  9. 		import com.esedeerre.Bola;
  10.  
  11. 		public function Main():void {
  12.  
  13. 			var bola:Bola = new Bola();
  14. 			addChild(bola);
  15.  
  16. 		}
  17. 	}
  18. }
  19.  

Como vemos, hemos tenido que importar la clase Bola para poder utilizarla. En la función constructora Main, creamos una nueva Bola y la añadimos al escenario:

  1.  
  2. var bola:Bola = new Bola();
  3. addChild(bola);
  4.  

Guardamos los dos archivos .as, publicamos el fla, y deberiamos nuestra bola moviéndose de izquierda a derecha.

Flash: Imágenes rotativas en AS3

Flash: Imágenes rotativas en AS3

Etiquetas: setTimeout removeChild addEventListener URLRequest Loader

Flash: Imágenes rotativas en AS3

Esta clase, explica paso a paso como hacer en AS3 una carga de imágenes que van rotando cada cierto tiempo. Para ello se almacenan las urls en una matriz y se van cargando los archivos cada cierto tiempo.
Galeria de Flickr con Papervision GreatWhite, V2

Galeria de Flickr con Papervision GreatWhite, V2

Etiquetas: API Flickr Papervision GreatWhite

Galeria de Flickr con Papervision GreatWhite, V2

He "mejorado" la galeria de imágenes en 3D, añadiendo un menú lateral con todos los albums de usuario (en este caso Lola) y permitiendo la carga de las imágenes originales haciendo click en cada cubo.

Papervision 2.0: GreatWhite.Plantilla básica

Papervision 2.0: GreatWhite.Plantilla básica

Etiquetas: Viewport3D BasicRenderEngine Scene3D Camera3D MovieMaterial MaterialList DisplayObject Viewport3D Vertex3D

Papervision 2.0: GreatWhite.Plantilla básica

Hace tiempo que está disponible la versión 2.0a de Papervision, bajo el nombre de Greatwhite. Hay algunos cambios respecto a la versión anterior, y ya han empezado a surgir tutoriales donde se explica como utilizar las nuevas clases y como se recomienda dividir los bloques de código. Esta es una plantilla básica de Papervision 2.0. En este caso creo un cubo y creo sobre él un efecto de "fluidez". Para que funcione hay que tener descargadas las clases de Papervision 2.0a, y haber indicado a Flash donde están guardadas.

Puedes verlo a pantalla completa aquí
Controlar teclas pulsadas en AS2

Controlar teclas pulsadas en AS2

Etiquetas: Object onKeyDown onKeyUp Key.getCode addListener

El siguiente código controla los eventos de teclado "pulsar" (onKeyDown) y "soltar" (onKeyUp), devolviendo el código de la tecla con la que se ha interactuado.
Actionscript 3.0: Simular el movimiento de una cuerda

Actionscript 3.0: Simular el movimiento de una cuerda

Etiquetas: addEventListener graphics clear moveTo lineStyle curveTo Math.sin Math.sqrt

Actionscript 3.0: Simular el movimiento de una cuerda

Cuando empecé a aprender Flash, lo que más me llamaba la atención eran los experimentos de páginas como uncontrol. Con el tiempo he ido viendo que algunos de esos experimentos no son tan complicados como me parecían, sino que son una mezcla de imaginación y matemáticas. Este es el código para simular el movimiento de una cuerda oscilando, utilizando la función curveTo y un poco de matemáticas.
Tipos de materiales en Papervision 1.5

Tipos de materiales en Papervision 1.5

Etiquetas: MovieScene3D Cube MaterialsList WireframeMaterial MovieMaterial MovieAssetMaterial BitmapAssetMaterial ColorMaterial BitmapFileMaterial renderCamera

Tipos de materiales en Papervision 1.5

Este ejemplo muestra como crear un cubo con 6 tipos diferentes de materiales en Papervision (AS3). He utilizado los más básicos, en la wiki de Papervision se puede encontrar un listado completo con los materiales disponibles.
Carga de imágenes y SWF en AS3 con Loader

Carga de imágenes y SWF en AS3 con Loader

Etiquetas: Loader URLRequest contentLoaderInfo addEventListener load

El código de este ejemplo sirve para cargar una imagen (jpg, gif o png) o swf controlando el proceso de carga. Para cargar otro tipo de archivos (por ejemplo XML o texto), hay que utilizar URLLoader.
Pasar parámetros en función asociada a un addEventListener

Pasar parámetros en función asociada a un addEventListener

Etiquetas: addEventListener function

Esta es una forma de indicar que valores queremos que tengan los parámetros de una función asociada a un addEventListener dentro del mismo addEventListener.