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

mas

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.

mas

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.

mas

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.  

mas

Como crear un menú dinámico con Actionscript 3.0 y XML

Etiquetas: URLLoader URLRequest currentTarget

Como crear un menú dinámico con Actionscript 3.0 y XML

Este ejemplo intenta mostrar una forma básica de hacer un menú dinámico con Flash y XML. La misma teoria que se aplica aquí para crear los elementos del menú, se puede aplicar en la creación, por ejemplo, de una galeria de imágenes o videos.

La idea es hacer un menú cuyos elementos se crean a partir de los nodos de un XML. De esta forma se hace más sencillo el mantenimiento del menú, ya que por ejemplo para añadir un botón solo habría que añadir un nuevo nodo con los contenidos necesarios. El XML que vamos a utilizar es este:

  1.  
  2. <?xml version="1.0" encoding="utf-8" ?>
  3. <data>
  4. <elementos>
  5. <elemento>
  6. <titulo>Google</titulo>
  7. <enlace>http://www.google.com</enlace>
  8. </elemento>
  9. <elemento>
  10. <titulo>Yahoo</titulo>
  11. <enlace>http://www.yahoo.com</enlace>
  12. </elemento>
  13. <elemento>
  14. <titulo>Altavista</titulo>
  15. <enlace>http://www.altavista.com</enlace>
  16. </elemento>
  17. <elemento>
  18. <titulo>Lycos</titulo>
  19. <enlace>http://www.lycos.com</enlace>
  20. </elemento>
  21. </elementos>
  22. </data>
  23.  

Vemos que cada elemento tiene un título, que vamos a poner en el texto del botón, y un enlace, que es la url que vamos a cargar al hacer click en el botón.

Una vez que tenemos el XML, vamos a flash y creamos el botón que vamos a utilizar para crear el menú. En este caso es un fondo blanco con un campo de texto dinámico llamado "Texto_txt". Una vez creado pulsamos con el botón derecho en el símbolo que tenemos en la biblioteca y seleccionamos "Vinculación". Tenemos que asociar el botón a la clase ElementoMenu, que es el nombre de clase que vamos a utilizar para crear los botones.

Vinculacion FLash Actionscript

Ahora vamos a cargar el XML. Creamos un URLLoader, añadimos los eventos, y creamos las funciones de carga y error. Se puede ver el proceso de carga más detallado en el tutorial de carga de XML en Actionscript 3.0 . Una vez cargado el XML y almacenado en la variable datos, llamamos a la función montar, donde vamos a crear el menú. Tenemos que recorrer todos los nodos, y crear un botón por cada nodo. Para recorrer los elementos con la estructura que hemos definido en el XML, tenemos que utilizar un for con este aspecto:

  1.  
  2. for (var i:uint = 0; i < datos.elementos.elemento.length(); i++) {
  3.  
  4. }
  5.  

En cada "vuelta" del for, vamos a crear un botón, rellenamos su campo Texto_txt con el nodo titulo, y almacenamos en una variable dentro del botón el valos del nodo enlace. Lo colocamos en "y" descendente según avanzamos para que salgan uno debajo de otro, y por último le añadimos un evento click que llama a la función navegar:

  1.  
  2. boton = new ElementoMenu();
  3. boton.Texto_txt.text = datos.elementos.elemento[i].titulo;
  4. boton.enlace = datos.elementos.elemento[i].enlace;
  5. boton.y = i * 25
  6. boton.buttonMode = true;
  7. boton.mouseChildren = false;
  8. boton.addEventListener(MouseEvent.CLICK, navegar);
  9. addChild(boton);
  10.  

Ahora, cada vez que hagamos click en un botón, se ejecutará la función navegar. En esta función recogemos el valor de la variable que hemos almacenado en enlace dentro del botón, por medio de currentTarget:

  1.  
  2. private function navegar(e:MouseEvent):void {
  3. navigateToURL(new URLRequest(e.currentTarget.enlace), "_blank");
  4. }

Espero haberlo explicado de una manera fácil. Para cualquier duda podéis utilizar los comentarios.

mas

Away3D: Galería esférica

Away3D: Galería esférica

ESPECIFICACIONES

Lenguaje: Actionscript 3.0 con Away3D y XML

Compatibilidad: Flash Player 9 o superior

Peso: 125KB

mas

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.

mas

Problemas al cargar combobox en Actionscript 2.0

Esta trampa es una de esas alegrías que nos dá Flash de vez en cuando. La sorpresa se suele producir asi:

-Tenemos que hacer una película que luego vamos a cargar en otra película madre. En esta película "hija", utilizamos un combobox de los de Flash. Probamos nuestra película, y obtenemos algo parecido a esto:

-Una vez tenemos el SWF funcionando, probamos a cargarlo en la película madre, y obtenemos esto:

Como se puede ver, el combo está, aparece incluso la primera opción, pero no podemos desplegarlo.

La solución: hay que incluir una instancia de combobox en la biblioteca de la película principal.

Por suerte, esto sólo ocurre en Actionscript 2.0. En Actionscript 3.0 no hace falta tener el combo en la película principal.

mas

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:

mas

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:

mas

Páginas: [1] [2] 3 [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16]