Envio de email con adjuntos en AS3 y PHP

Etiquetas: FileReference FileFilter URLRequest

Este ejemplo muestra como hacer un formulario en Flash (Actionscript 3.0) con envio de adjuntos.

El esquema básico es que hacemos una subida normal con FileReference, y en el URLRequest de la subida incluimos las variables que queramos adjuntar en el formulario:

  1.  
  2. var request:URLRequest = new URLRequest(url);
  3. request.method = URLRequestMethod.POST;
  4. request.data = new URLVariables();
  5. request.data.nombre = Nombre_txt.text;
  6. request.data.destinatario = Destinatario_txt.text;
  7. subidor.upload(request);
  8.  

Estas variables las recogemos después en el PHP con el nombre que les hayamos puesto con:

  1.  
  2. $_REQUEST[nombre]
  3.  

En el php tenemos el código típico de una subida, y una vez terminada pasamos a montar el correo electrónico.

Dejo los fuentes con el fla, la clase Formulario, y el php para la subida.

El código php es una versión adaptada del que podéis encontrar en esta página

Comprobación de email con expresiones regulares

Etiquetas: RegExp

Esta función utiliza una expresión regular para comprobar si una cadena es un email válido.

La expresión regular no la he construido yo, pero no puedo citar la fuente porque la he visto en muchos foros de actionscript, en castellano e inglés. La función en cuestión es esta:

  1.  
  2. function emailValido(email:String):Boolean{
  3. var emailExpression:RegExp = /^[a-z][\w.-]+@\w[\w.-]+\.[\w.-]*[a-z][a-z]$/i;
  4. return emailExpression.test(email);
  5. }
  6.  

Y estos serían algunos resultados:

@hotmail.com: false
pepe@hotmail.: false
paco@hotmail.hola.com: true
www.hotmail.com: false
paco@hola@hotmail.com: false
carmen@hotmail.com: true

Actionscript 3.0: memoria utilizada

Etiquetas: System totalMemory

Podemos comprobar cantidad de memoria utilizada por Flash Player mediante la propiedad System.totalMemory, que devuelve el valor en bytes.

Por ejemplo, si queremos ver el valor en KBs de la memoria utilizada por nuestra aplicación, pondríamos:

  1.  
  2. import flash.system.System;
  3.  
  4. trace(System.totalMemory / 1024 + " KBs")

Efecto lupa en Actionscript 3.0

Etiquetas: BitmapData Bitmap smoothing mask drawCircle

Efecto lupa en Actionscript 3.0

En este ejemplo voy a tratar de explicar como se hace el "Efecto lupa" en Flash, con Actionscript 3.0.

Para simplificar voy a explicar la teoria basándome en una imagen que tengo en un MovieClip el escenario. Por supuesto esto se puede modificar para cargar imágenes externamente o como se necesite.

Los pasos que tenemos que seguir para crear el "efecto lupa" son estos:

-Crear una copia del MovieClip en BitmapData, y ponerla por encima a una escala mayor que el original:

  1.  
  2. //Creo un pantallazo del clip, lo pongo con una escala == zoom
  3. var myBitmapData:BitmapData = new BitmapData(clip.width, clip.height);
  4. myBitmapData.draw(clip);
  5. var bmp:Bitmap = new Bitmap(myBitmapData);
  6. bmp.smoothing = true;
  7. contenedor.addChild(bmp);
  8. contenedor.scaleX = contenedor.scaleY = zoom;
  9. addChild(contenedor);

-Poner a la copia una máscara circular, de manera que solo se vea el trozo de imágen tapado por la máscara:

  1.  
  2. //Le pongo una mascara del tamaño t al contenedor
  3. mascara.graphics.beginFill(0x000000, 1);
  4. mascara.graphics.drawCircle(0, 0, t);
  5. contenedor.mask = mascara;
  6. addChild(mascara);
  7.  

-Añadimos un evento enterframe. Dentro de la función del evento vamos a mover la máscara siguiendo al ratón, y a recolocar la "copia grande":

  1.  
  2. addEventListener(Event.ENTER_FRAME,renderizar)
  3.  

En la función del evento tenemos que mover la máscara para que siga al ratón, y recolocar la imagen grande para que el trozo que se vé sea el que corresponde a la imagen pequeña. La función es cuestión es esta:

  1.  
  2. private function renderizar(e:Event):void {
  3. //Calculo el porcentaje que tengo que mover el pantallazo
  4. var porcentajeX = clip.mouseX / clip.width;
  5. var porcentajeY = clip.mouseY / clip.height;
  6. //Recoloco el contenedor
  7. contenedor.x = -(contenedor.width - clip.width) * porcentajeX
  8. contenedor.y = -(contenedor.height - clip.height) * porcentajeY
  9. //Muevo la mascara
  10. mascara.x = escenario.mouseX;
  11. mascara.y = escenario.mouseY;
  12. }
  13.  

Adjunto fuentes con todos los materiales, por si queda alguna duda.

ActionScript 3.0: La propiedad mouseChildren

Etiquetas: mouseChildren

Una de las trampas que me encontré cunado empecé con Actionscript 3.0 era esta:

-Creaba un MovieClip con un campo de texto dinámico dentro (por ejemplo para el botón de un menú).

-Le añadía un evento de ratón y ponia su propiedad buttonMode como true.

Resultado: no se veía el handCursor (la mano típica al hacer over sobre un botón) cuando ponía el ratón encima.

En aquel momento, para solucionar el inconveniente (estaba haciendo unos cambios delante del cliente), puse un botón transparente dentro del MovieClip, por encima del resto de elementos, de tal manera que al hacer over sobre el clip se hacia over sobre el botón y se mostraba el handCursor. Mas tarde, pude investigar un poco, y descubrí que lo que pasaba era que el campo de texto dentro del clip "interfería" con los eventos de ratón, y por eso no se mostraba "la mano".

Para solucionarlo, podemos utilizar la propiedad mouseChildren de los DisplayObjectContainer, que determina si los elementos secundarios de un objeto están habilitados para ratón. Su valor predeterminado es true.

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: Colisiones a nivel de pixel

Etiquetas: complexIntersectionRectangle hitTestObject

La función hitTestObject(obj:DisplayObject) evalúa un objeto para comprobar si choca con el objeto obj. Por ejemplo, si tenemos dos objetos "Item1_mc" e "Item2_mc", podemos comprobar si chocan con:

  1.  
  2. Item1_mc.hitTestObject(Item2_mc)
  3.  

Esta función, tiene el inconveniente de que comprueba los choques entre los contenedores rectangulares de los objetos. Por ejemplo:

Colisiones en FLash

por tanto, sin queremos comprobar las colisiones entre dos objetos no rectangulares, puede devolver valores que aparentemente no son correctos. Aquí tenemos un ejemplo en Flash:

Si queremos utilizar colisiones a nivel de pixel, podemos crear un objeto bitmapData, superponer los dos objetos en el objeto bitmapData con un filtro de color cada uno, y comprobar si hay pixels que tienen el color de la combinación de filtros utilizados. En el blog de tink , podemos descargar una clase que nos ahorra todo este proceso y utilizar directamente métodos que nos devuelven true o false como resultado de la colisión. Por ejemplo, si queremos comprobar la colisión a nivel de pixel entre los dos objetos del ejemplo anterior, pondríamos:

  1.  
  2. HitTest.complexHitTestObject(Item1_mc,Item2_mc)
  3.  

Y si queremos recibir el rectángulo de colisión:

  1.  
  2. var rect:Rectangle = HitTest.complexIntersectionRectangle(Item1_mc,Item2_mc);
  3.  

El resultado, sería este:

Los fuentes, y la clase HitTest de tink, tras el salto.

Comparar pixels de imágenes en Actionscript 3.0 con threshold

Etiquetas: BitmapData clone threshold

Comparar pixels de imágenes en Actionscript 3.0 con threshold

La función threshold permite hacer comparaciones pixel a pixel en una imagen. Por ejemplo, podemos separar todos los pixels mayores de un color de una imagen, y obtener otra imagen con esos pixels. La función threshold tiene 5 parámetros obligatorios (y varios opcionales):

threshold(sourceBitmapData:BitmapData, sourceRect:Rectangle, destPoint:Point, operation:String, threshold:uint)

-sourceBitmapData: la imagen que vamos a utilizar

-sourceRect: rectángulo que define el area de la imagen de origen que vamos a utilizar

-destPoint: punto de la imagen de destino que corresponde a la esquina superior izquierda del rectángulo

-operation: operación que vamos a utilizar

-threshold: valor con el que comparamos cada pixel

Por ejemplo, si queremos separar los pixels mayores de 0xFFCCCCCC de los menores en una imagen, podemos utilizar:

  1.  
  2. img1.threshold(img1, new Rectangle(0, 0, 350, 242), new Point(0, 0), ">", 0xFFCCCCCC);
  3. img2.threshold(img2, new Rectangle(0, 0, 350, 242), new Point(0, 0), "<=", 0xFFCCCCCC);

El código completo y los fuentes:

Actionscript 3.0: Mostrar imagen en blanco y negro con ColorMatrixFilter

Etiquetas: ColorMatrixFilter filters

Actionscript 3.0: Mostrar imagen en blanco y negro con ColorMatrixFilter

La clase ColorMatrixFilter de Actionscript 3.0 permite aplicar una transformación a los valores de color y alfa de cada pixel de una imagen. Se puede aplicar sobre cualquier objeto que herede de la clase DisplayObject (es decir MovieClip, SimpleButton, TextField...).

Los filtros ColorMatrixFilter, se crean a partir de una matriz de transformación de 4x5, con lo valores de modificación que queremos aplicar a cada canal. Por ejemplo, si tenemos la matriz:

  1.  
  2. private var rLum:Number = 0.2225;
  3. private var gLum:Number = 0.7169;
  4. private var bLum:Number = 0.0606;
  5.  
  6. private var bwMatrix:Array = [rLum, gLum, bLum, 0, 0,
  7. rLum, gLum, bLum, 0, 0,
  8. rLum, gLum, bLum, 0, 0,
  9. 0, 0, 0, 1, 0];
  10.  

Podemos crear un filtro con ella, asi:

  1.  
  2. var filtroBW:ColorMatrixFilter
  3. filtroBW = new ColorMatrixFilter(bwMatrix);
  4.  

y aplicarlo a un MovieClip (que en este caso está en el escenario con el nombre Imagen2_mc):

  1.  
  2. Imagen2_mc.filters = [filtroBW]
  3.  

De esta manera, hacemos que el contenido de Imagen2_mc aparezca en blanco y negro, pero podemos modificar los valores de bwMatrix para obtener otros efectos.

El código completo y los fuentes, son estos:

Actionscript 3.0: Aplicar estilos CSS a campos de texto

Etiquetas: StyleSheet parseCSS styleSheet htmlText

Actionscript 3.0: Aplicar estilos CSS a campos de texto

Los campos de texto en flash pueden contener texto simple o texto en formato HTML. El texto en formato HTML se almacena en la propiedad htmlText. Sobre los campos con texto HTML podemos aplicar hojas de estilo CSS, creadas en el código de la aplicación o cargadas en tiempo de ejecución.

En este ejemplo vamos a ver como cargar un archivo css, y aplicar estos CSS a un TextField que contiene un teto HTML. La hoja de estilos que vamos a utilizar, es esta:

  1.  
  2. h1 {
  3. font-family: Times New Roman, Times, _serif;
  4. font-size: 30;
  5. font-weight: bold;
  6. }
  7. h2 {
  8. font-family: Arial, Helvetica, _sans;
  9. font-size: 24;
  10. }
  11. p{
  12. font-size: 15;
  13. }
  14. a{
  15. color: #009900;
  16. }
  17. a:hover{
  18. color: #00ff00;
  19. }
  20.  

Lo primero que tenemos que hacer, es cargar la hoja de estilos. Para ello, utilizamos una instancia de Loader:

  1.  
  2. cargador = new URLLoader();
  3. cargador.addEventListener(Event.COMPLETE, onCSSFileLoaded);
  4. cargador.load(new URLRequest("http://www.esedeerre.com/ejemplos/as3/css/ejemplo.css"));
  5.  

Una vez cargado el archivo, salta el evento COMPLETE, y creamos una instancia de StyleSheet, parseamos el CSS cargado, y se lo aplicamos al campo de texto. Después de aplicar el CSS al campo de texto, podemos rellenar el campo con el texto HTML que queramos:

  1.  
  2. public function onCSSFileLoaded(event:Event):void
  3. {
  4. var sheet:StyleSheet = new StyleSheet();
  5. sheet.parseCSS(cargador.data);
  6. campo.styleSheet = sheet;
  7. campo.htmlText = texto;
  8. }
  9.  

El código completo, y el ejemplo en Flash, tras el salto.

Actionscript 3.0: optimizaciones (II)

Continuación del artículo de optimizaciones en Actionscript 3.0

Sumar / Concatenar cadenas de texto (Strings)

Método: concat()

  1.  
  2. var t:Number = getTimer();
  3. var txt1:String = "Esto es";
  4. var txt2:String = "una prueba de rendimiento";
  5. var txt3:String = "de concatenacion de cadenas"
  6. var txt:String;
  7. for(var i:uint = 0;i < 1000000; i++){
  8. txt = txt1.concat(" ", txt2, " ",txt3);
  9. }
  10. trace(getTimer() - t);
  11.  

Resultado: 2034 ms




Método: operador +

  1.  
  2. var t:Number = getTimer();
  3. var txt1:String = "Esto es";
  4. var txt2:String = "una prueba de rendimiento";
  5. var txt3:String = "de concatenacion de cadenas"
  6. var txt:String;
  7. for(var i:uint = 0;i < 1000000; i++){
  8. txt = txt1 + " " + txt2 + " " + txt3;
  9. }
  10. trace(getTimer() - t);
  11.  

Resultado: 894 ms



Conclusión: sumar Strings con + es 2 veces más rápido que utilizar el método concat() de la clase String().

Calcular mínimo / máximo de 2 números

Método: Math.min() / Math.max()

  1.  
  2. var t:Number = getTimer();
  3. var n1:Number = 234;
  4. var n2:Number = 675
  5. var n:Number;
  6. for(var i:uint = 0;i < 1000000; i++){
  7. n = Math.min(n1,n2);
  8. }
  9. trace(getTimer() - t);
  10.  

Resultado: 149 ms




Método: condicionales

  1.  
  2. var t:Number = getTimer();
  3. var n1:Number = 234;
  4. var n2:Number = 675
  5. var n:Number;
  6. for(var i:uint = 0;i < 1000000; i++){
  7. n = (n1>n2)?n2:n1;
  8. }
  9. trace(getTimer() - t);
  10.  

Resultado: 25 ms



Conclusión: una vez más, hacerlo "a mano" es más rápido.

Multiplicación vs División

Método: división

  1.  
  2. var t:Number = getTimer();
  3. for(var i:uint = 0;i < 10000000; i++){
  4. var n:Number = i / 2;
  5. }
  6. trace(getTimer() - t);
  7.  

Resultado: 226 ms




Método: multiplicación

  1.  
  2. var t:Number = getTimer();
  3. for(var i:uint = 0;i < 10000000; i++){
  4. var n:Number = i * .5;
  5. }
  6. trace(getTimer() - t);
  7.  

Resultado: 225 ms



Conclusión: esta era una de las "leyendas urbanas" que siempre habia oido pero nunca habia testeado. Por lo que he estado investigando, hasta alguna versión de FP9, era más rápido multiplicar que dividir un número, pero en las nuevas versiones de Flash Player ya no es así.

Actionscript 3.0: optimizaciones (I)

Etiquetas: Math.floor Math.abs

Este artículo recoge algunos test de rendimiento para diversas operaciones en Actionscript 3.0. Este es un tema que me interesa bastante, asi que espero hacer mas test e ir ampliando información en el futuro.

Los test se han realizado en un Core2 6420 2,13Ghz, con 3GB de RAM y Windows Vista Home Premium de 32 bits. La versión de Flash Player es la 10,0,2,54.

 

Recorrer elementos de un Array (de 1 millón de elementos)

  1.  
  2. var t:Number = getTimer();
  3. var temp:int;
  4. for(var i:Number = 0; i < matriz.length; i++){
  5. temp = matriz[i];
  6. }
  7. trace(getTimer() - t);
  8.  

Resultado: 130 ms

 

Si sustituimos el tipo de i de Number a uint:

  1.  
  2. var t:Number = getTimer();
  3. var temp:int;
  4. for(var i:uint = 0; i < matriz.length; i++){
  5. temp = matriz[i];
  6. }
  7. trace(getTimer() - t);
  8.  

Resultado: 95 ms

 

Si almacenamos matriz.length en una variable:

  1.  
  2. var t:Number = getTimer();
  3. var temp:int;
  4. var l:uint = matriz.length;
  5. for(var i:uint = 0; i < l; i++){
  6. temp = matriz[i];
  7. }
  8. trace(getTimer() - t);
  9.  

Resultado: 23 ms

 

En definitiva, solo con poner uint (entero positivo) como tipo de i, y con almacenar la longitud de la matriz en una variable, hacemos que el bucle se ejecute 5,6 veces más rápido.

 

Redondear números (Math.floor)

  1.  
  2. var t:Number = getTimer();
  3. var temp:Number;
  4. for(var i:uint = 0;i < 1000000; i++){
  5. temp = Math.floor(1.7);
  6. }
  7. trace(getTimer() - t);
  8.  

Resultado: 163 ms

 

  1.  
  2. var t:Number = getTimer();
  3. var temp:Number;
  4. for(var i:uint = 0;i < 1000000; i++){
  5. temp = uint(1.7);
  6. }
  7. trace(getTimer() - t);
  8.  

Resultado: 29 ms

 

  1.  
  2. var t:Number = getTimer();
  3. var temp:Number;
  4. for(var i:uint = 0;i < 1000000; i++){
  5. temp = int(1.7);
  6. }
  7. trace(getTimer() - t);
  8.  

Resultado: 18 ms

 

Este test me ha sorprendido mucho. Convertir el número a int(entero), es 9 veces más rápido que utilizar Math.floor(). Teniendo en cuenta que el resultado es el mismo, y que encima int tiene menos letras que Math.floor, no veo motivos para no desterrar a Math.floor().

 

Obtener el valor absoluto de un número (Math.abs)

  1.  
  2. var t:Number = getTimer();
  3. var temp:Number;
  4. var n:Number = -53.44;
  5. for(var i:uint = 0;i < 1000000; i++){
  6. temp = Math.abs(n);
  7. }
  8. trace(getTimer() - t);
  9.  

Resultado: 145 ms

  1.  
  2. var t:Number = getTimer();
  3. var temp:Number;
  4. var n:Number = -53.44;
  5. for(var i:uint = 0;i < 1000000; i++){
  6. temp = n < 0 ? n * -1 : n;
  7. }
  8. trace(getTimer() - t);
  9.  

Resultado: 26 ms

Es decir, obtener el valor absoluto "a mano", 5,5 veces más rápido que utilizar Math.abs()

Eliminar dobles saltos en textos cargados en XML

Etiquetas: charCodeAt charAt

Cuando cargamos un XML cuyos textos contienen saltos de linea, Flash duplica los saltos. Es decir, que si en el XML hemos puesto dos lineas separadas por un salto, en Flash aparecerán separadas por dos. Para solucionarlo, podemos aplicar una función al texto antes de mostrarlo en el campo de texto.

La función que podemos aplicar es la siguiente:

Utilizar la webcam con Actionscript 3.0

Etiquetas: Camera Video getCamera setMode attachCamera

Utilizar la webcam con Actionscript 3.0

Utilizar la Webcam en Flash es muy sencillo. Basta con crear un objeto Camera, otro objeto Video, capturar la cámara con Camera.getCamera, y añadir el flujo de vídeo a la instancia de Video mediante attachCamera.
Tras el salto, el código comentado.

Cambiar el color de un MovieClip con Actionscript 3.0

Etiquetas: ColorPicker ColorTransform ColorPickerEvent

Cambiar el color de un MovieClip con Actionscript 3.0

La clase ColorTransform permite ajustar el color de los objetos de visualización. Este ejemplo muestra como cambiar el color de un MovieClip utilizando el componente ColorPicker de Flash.

Carga de sonidos y visualización del espectro en Actionscript 3.0

Etiquetas: SoundChannel Sound ByteArray computeSpectrum

Carga de sonidos y visualización del espectro en Actionscript 3.0

Con AS3 podemos visualizar el espectro de sonido de un audio. Con unas pocas lineas de código, podemos hacer cosas impensables con anteriores versiones del lenguaje. Este es el resumen del código:

-Creo un objeto de tipo Sound() y cargo en él archivo mp3:

  1.  
  2. sonido = new Sound();
  3. var request:URLRequest = new URLRequest(url);
  4. sonido.addEventListener(Event.COMPLETE, sonidoCargado);
  5. sonido.load(request);
  6.  

-Programo la carga para que cuando termine se ejecute la función sonidoCargado. En esta función reproduzco el sonido (canal = sonido.play(0,1000);) y añado un evento para que se pinte el espectro de sonido (addEventListener(Event.ENTER_FRAME,mover)).

-La función mover es la encargada de "Pintar" el espectro. El espectro se almacena en la variable arrayMixer en forma de matriz de bits. Los elementos de esta matriz pueden ser 1 o 0. Resumiendo, podemos decir que cuantos más 1 haya, más "alto suena el sonido". Recorro la matriz y sumo todos esos 1, para ver como de grande tengo que pintar la barra de volumen. Cuando tengo ese valor lo almaceno en la matriz de volúmenes. Depués de esto, recorro toda la matriz de volúmenes y pinto una barra para cada valor almacenado.

El código completo:

  1.  
  2. package {
  3. import flash.display.*;
  4. import flash.events.*;
  5. import flash.media.*;
  6. import flash.utils.ByteArray;
  7. import flash.net.*;
  8. public class CargadorSonidos extends Sprite {
  9. var url:String = "sonido.mp3";
  10. var canal:SoundChannel;
  11. var sonido:Sound;
  12. var fourierTransform:Boolean = false;
  13. var arrayMixer:ByteArray = new ByteArray();
  14. var volumenes:Array = new Array();
  15. public function CargadorSonidos():void {
  16. cargarSonido();
  17. }
  18. function cargarSonido():void {
  19. SoundMixer.stopAll();
  20. sonido = new Sound();
  21. var request:URLRequest = new URLRequest(url);
  22. sonido.addEventListener(Event.COMPLETE, sonidoCargado);
  23. sonido.load(request);
  24. }
  25. function sonidoCargado(event:Event):void {
  26. canal = sonido.play(0,1000);
  27. addEventListener(Event.ENTER_FRAME,mover);
  28. }
  29. function mover(e:Event):void {
  30. SoundMixer.computeSpectrum(arrayMixer, true);
  31. var c = 0;
  32. for (var i = 0; i < arrayMixer.length; i++) {
  33. c += arrayMixer[i];
  34. }
  35. volumenes.push(c);
  36. if (volumenes.length > 400) {
  37. volumenes.splice(0,1);
  38. }
  39. graphics.clear();
  40. graphics.lineStyle(1, 0x000000);
  41. graphics.beginFill(0x000000);
  42. for (var j = 0; j < volumenes.length; j++) {
  43. graphics.lineTo(j,100+volumenes[j]/1200);
  44. graphics.lineTo(j,100-volumenes[j]/1200);
  45. graphics.moveTo(j,100);
  46. }
  47. graphics.lineTo(volumenes.length,100);
  48. graphics.lineTo(0,100);
  49. }
  50. }
  51. }
  52.  

Clase para comprobar campos en Actionscript 3.0

Etiquetas: split return length

El siguiente código es la base de una clase para comprobar campos en AS3. De momento tiene tres funciones:

-esMail: recibe un String y comprueba si contiene una arroba y uno o más puntos. Si es así, devuelve true (es un correo), en caso contrario, false (no es un correo).

-tanLargo: recibe un String y una longitud, y comprueba si la cadena tiene exactamente esa longitud. Esto se puede hacer de formá rápida en Actionscript, pero de esta manera aprovecho más la clase y ahorramos unos teclazos.

-masLargo: recibe un String y una longitud, y comprueba si la cadena tiene una longitud mayor. También se puede hacer de formá rápida en Actionscript, pero asi se ahorra algo de trabajo.

Clase para vaciar clips en AS3

Etiquetas: removeChildAt numChildren getInstanceAtDepth

La siguiente clase permite eliminar todos los elementos de un clip, recorriendo todas las profundidades "ocupadas" y eliminando los elementos que están en ellas.

Función para pasar de número a String con formato de tiempo

La siguiente función recibe como parámetro un número entero, y devuelve un String con formato de minutos:segundos (mm:ss). No he probado si funciona también en AS2, pero deberia hacerlo.

Clase para hacer precargas en Actionscript 3.0

Etiquetas: Loader MovieClip URLRequest

Esta es una clase que estoy utilizando bastante en mis últimos trabajos. Es bastante sencilla, pero se puede modificar fácilmente para añadir otros comportamientos. La clase tiene las siguientes function públicas:

-Función constructora: recibe como parámetro el clip que se va a mostrar durante la precarga. La clase está preparada para que este clip tenga un campo de texto llamado Texto_txt, que será donde se muestre el progreso de carga, y una animación de 100 fotogramas.

-Función cargar: recibe como parametro una url (String) y el clip donde vamos a cargar el contenido de la url (MovieClip).

Clase para crear scroll con easing en Actionscript 3.0

Esta es una clase para crear un scroll con easing en Actionscript 3.0. Hay que pasarle los siguientes parámetros:
  • Clip que queremos controlar con el scroll
  • Posición x del Scroll
  • Posición y del scroll
  • Ancho del scroll
  • Altura del scroll (será el alto de la máscara
  • Color de la barra grande
  • Color de la barra de arrastre
  • Color de los contornos de las barras

Por supuesto es mejorable, se admiten comentarios en contacto@esedeerre.com.

Asignación condicional de valores a variables (AS2 y AS3)

Este código muestra como hacer una asignación condicional de valor a una variable. Sirve para ahorrar lineas de código cuando, como en el ejemplo, el valor de la variable que queremos definir, depende del valor de otra variable. El código vale para Actionscript 2.0 y 3.0.

Utilización de filtros en Actionscript 3.0

Etiquetas: BevelFilter BlurFilter DropShadowFilter GlowFilter filters

Utilización de filtros en Actionscript 3.0

En AS3 hay disponibles 9 tipos de filtros. En este ejemplo aplico 4 de estos filtros a una imagen del escenario, por medio de un menú de Sliders. Con estos componentes modifico alguno de los parámetros de los filtros. Estos filtros son mucho más potentes de lo que yo muestro aquí, y un estudio detallado de como usarlos viene en la ayuda de Flash.

Crear reflejos por medio de Actionscript 3.0

Etiquetas: BitmapData Bitmap draw cachaAsBitmap createGradientBox beginGradientFill

Esta función recibe como parámetro un MovieClip y crea su reflejo. Para ello se copia la imagen del mc en un Bitmap y después de le aplica como máscara un degradado. Para modificar el reflejo se puede jugar con los valores de alphas y ratios con los que se crea el degradado.

Envio del e-mails con Actionscript 3.0 y PHP

Etiquetas: URLRequest URLLoader URLVariables

Este ejemplo muestra como enviar un correo electrónico desde flash y AS3 , por medio de php. Para que funcione debemos tener un php subido en nuestro servidor con el siguiente código:

  1.  
  2. $email = $_POST['email'];
  3. $asunto = $_POST['asunto'];
  4. $cuerpo = $_POST['cuerpo'];
  5. mail("$email","$asunto","$cuerpo");
  6. echo "resultado=Mensaje enviado";
  7.  


Podemos pasar los datos necesarios a este fichero desde Flash de la siguiente forma:

Gestión de eventos: Diferencia entre target y currentTarget

Etiquetas: numChildren getChildAt target currentTarget

Para explicar la diferencia entre ambas propiedades, voy a poner un ejemplo práctico. Tenemos un clip llamado Menu_mc, que tiene dentro otros 3 clips que hacen de botones. Si añadimos el evento "click" a Menu_mc, en la función que se ejecute (poniendo como parámetro e:MouseEvent) obtendremos los siguientes resultados:

  • Si hacemos trace(e.target.name), se imprimirá al nombre del clip pulsado (que está dentro de Menu_mc)

  • Si hacemos trace(e.currentTarget.name), se imprimirá el nombre del menú, es decir, "Menu_mc".

    Por tanto, cuando queremos programar un menú, no hace falta añadir los listeners uno a uno a los botones, podemos añadir el listener al menú, y aprovechar la propiedad target para ver que elemento ha sido pulsado.
  • Actionscript 3.0: utilizar imágenes de la biblioteca

    Etiquetas: Bitmap BitmapData

    Este ejemplo muestra como añadir al esenario imágenes de la biblioteca con Actionscript 3. Para ello hay que tenerlas vinculadas con un nombre de clase (en este caso material1), que es el que utilizaremos para crear el objeto en el escenario.

    Embeber fuentes de biblioteca en AS3

    Etiquetas: TextFormat font size TextField defaultTextFormat embedFonts selectable

    Este es el código necesario para embeber una fuente de la biblioteca con AS3. Además del código es necesario tener vinculada la fuente en la biblioteca (en este caso con el nombre "Mi Fuente")

    Recorrer XML en AS3

    Etiquetas: XML URLLoader URLRequest elements

    El siguiente código carga un XML y recorre sus nodos y atributos imprimiendolos en pantalla.

    El XML que he utilizado es el siguiente:

    1.  
    2. <Discos>
    3. <Disco puntuacion="10">
    4. <grupo id="20">The Knife</grupo>
    5. <titulo>Deep Cuts</titulo>
    6. </Disco>
    7. <Disco puntuacion="7">
    8. <grupo id="21">Jose Gonzalez</grupo>
    9. <titulo>Veneer</titulo>
    10. </Disco>
    11. </Discos>
    12.  


    Y el código AS:

    Cargar archivos de texto y XML con URLLoader

    Etiquetas: URLLoader URLRequest load

    El código de este ejemplo carga un XML e informa de los eventos de carga. Para cargar imágenes y SWF hay que utilizar Loader en lugar de URLLoader.

    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.

    Hacer un sendAndLoad en Actionscript 3.0

    Etiquetas: URLRequest URLVariables sendToURL URLLoader method load dataFormat

    sendAndLoad permitía enviar información a un fichero externo (PHP, ASP o similar) y recibir después información de este. En AS3 ya no se puede utilizar esta función, pero en su lugar se puede utilizar el siguiente código (en el ejemplo envio dos numeros a un PHP, que los sumará y devolverá el resultado). El php puede ser como este:

    1.  
    2. <?php
    3. $numero1 = htmlentities($_POST[numero1]);
    4. $numero2 = htmlentities($_POST[numero2]);
    5. $suma = $numero1 + $numero2;
    6. echo "suma=" . $suma;
    7. ?>
    8.  

    Y el Actionscript:

    ActionScript 3.0: Subir archivos con FileReference y PHP

    Etiquetas: FileFilter FileReference URLRequest browse upload

    La clase File Reference de AS3 es bastante parecida a la de AS2. Además el ejemplo de la ayuda de Flash es bastante sencillo de entender.El código que pongo a continuación esta hecho a partir de dicho ejemplo, al que he añadido algunos comentarios para explicarlo. Para utilizarlo Hay que tener en el escenario un boton llamado "Examinar_bt" y un campo de texto dinámico llamado "Estado_txt".

    LocalConnection en Actionscript 3.0

    Etiquetas: LocalConnection send connect

    La clase Localconnection permite la comunicación entre varias peliculas SWF ejecutándose en el mismo cliente. El ejemplo que he utilizado es sencillo, por una parte tengo una pelicula con dos botones, play y stop, y por la otra una animación que reproduzco o paro según pulse los botones. El funcionamiento es el siguiente:

    Clase en Actionscript 3.0 para saber los FPS de una película

    Etiquetas: Date getTime

    Esta sencilla clase coloca en pantalla un campo de texto que nos muestra a cuantos FPS se está reproduciendo la película. Además del constructor, tiene un par de métodos más para indicar la posición que queremos para el texto y el color. Por defecto el objeto se coloca en (10,10) con color negro.