Cristalab

Imagen con efecto de reflejo y movimiento en Actionscript 3

Por: Carloz.Yanez + 08.10.2007

En este Tip aprenderás a reflejar una imagen con Actionscript 3 y aplicarle una transición al pasar el Mouse sobre la imagen.
Cabe destacar que podemos usar el efecto sobre cualquier objeto de clase DisplayObject.

Lo primero que debemos hacer es crear un documento nuevo, crear o importar una imágen la cual podemos convertir tanto en Botón como en MovieClip, asignándole un nombre de instancia en el Panel de Propiedades y un nombre de Clase en el menú Linkage que podemos encontrar haciendo click derecho sobre el elemento en la Librería.



Despues de esto procedemos a crear un Degradado con cuatro niveles de color, de los cuales, los últimos tres tendrán niveles menores de Alpha, he utilizado (de izquierda a derecha) 100, 95, 80 y 0, cargando un poco el selector con alpha 100 hacia la derecha, esto servirá como Máscara para dar el efecto de reflejo, dependiendo de el color de fondo de tu swf, será el color del degradado que tendrás que crear.

Asignamos a la máscara un nombre de clase tal como lo hicimos con la imagen.

Ahora abrimos el Panel de Acciones y escribimos lo siguiente:

Código :


import fl.transitions.Tween;
import fl.transitions.easing.*;

Este código importa la clase Tween y la clase Easing.

Código :


function reflectAndAnimate(target:DisplayObject, ease:Object, expandScale:Number, insetScale:Number, expandTime:Number, insetTime:Number):void
{

Creamos la función que se encargará del reflejo y de la transición del DisplayObject, la cual tiene como parámetros lo siguiente:


Código :


var targetClass:Class = Object(target).constructor;
var targetCopy:DisplayObject = new targetClass();
targetCopy.y = target.y + target.height;
targetCopy.x = target.x;
targetCopy.rotation = 180;
targetCopy.width = target.width;
targetCopy.height = target.height;
targetCopy.scaleX = -target.scaleX;
addChild(targetCopy);
   
var msk:Mask = new Mask();
addChild(msk);
msk.x = targetCopy.x;
msk.y = targetCopy.y;
msk.width = targetCopy.width;
msk.height = targetCopy.height;

En la primera parte de este código, se copia el DisplayObject y se invierte, y en la segunda (donde Mask es el nombre de clase de la máscara) se añade las máscara creada, en ambos se copia el tamaño del parámetro target.

Código :


function mskScale():void
{
   msk.width = target.width;
   msk.height = target.height;
   targetCopy.y = target.y + target.height;
   msk.y = targetCopy.y;
}

var intervalId:Timer = new Timer(1, 0);
intervalId.addEventListener(TimerEvent.TIMER, mskScale);
intervalId.start();

Aquí se crea una función que se encargará de que la máscara siempre sea del tamaño de la copia del target (el DisplayObject al que se aplicara el efecto).

Código :


function expand(event:MouseEvent):void
{
   var xTween:Tween = new Tween(target, "scaleX", ease.easeOut, target.scaleX, expandScale, expandTime, true);
   var yTween:Tween = new Tween(target, "scaleY", ease.easeOut, target.scaleY, expandScale, expandTime, true);
   var cxTween:Tween = new Tween(targetCopy, "scaleX", ease.easeOut, targetCopy.scaleX, -expandScale, expandTime, true);
   var cyTween:Tween = new Tween(targetCopy, "scaleY", ease.easeOut, targetCopy.scaleY, expandScale, expandTime, true);
}

target.addEventListener(MouseEvent.ROLL_OVER, expand);

function inset(event:MouseEvent):void
{
   var xTween:Tween = new Tween(target, "scaleX", ease.easeOut, target.scaleX, insetScale, insetTime, true);
   var yTween:Tween = new Tween(target, "scaleY", ease.easeOut, target.scaleY, insetScale, insetTime, true);
   var cxTween:Tween = new Tween(targetCopy, "scaleX", ease.easeOut, targetCopy.scaleX, -insetScale, insetTime, true);
   var cyTween:Tween = new Tween(targetCopy, "scaleY", ease.easeOut, targetCopy.scaleY, insetScale, insetTime, true);
}

target.addEventListener(MouseEvent.ROLL_OUT, inset);
}

Estas dos funciones crean un objeto Tween que proporcionará el efecto tanto al target como a la copia del target, de lo cual se encargan los eventos ROLL_OVER y ROLL_OUT.

Nota: Como la máscara es regulada por las propiedades ScaleX y ScaleY, el DisplayObject objetivo, no podrá ser modificado en cuanto a tamaño directamente desde el escenario, es decir, si tu imagen es convertida en un MovieClip teniendo tu imagen como Width y Height 100Px, no podrás redimensionarla en el escenario ya que la máscara sería llamada al tamaño en que esta ese MovieClip en la libreria, no al modificado en el stage.
Deberás convertir tu imagen en MovieClip estando en el tamaño que va a ser utilizado en tiempo de ejecución, o modificar su tamaño utilizando scaleX y scaleY antes de llamar a la función.

Este es el código del ejemplo, el cual tiene tres imágenes de 100100Px, convertidas en MovieClip.

Código :


zguillez.scaleX = .5;
zguillez.scaleY = .5;

mx.scaleX = .5;
mx.scaleY = .5;

pedro.scaleX = .8;
pedro.scaleY = .8;

import fl.transitions.Tween;
import fl.transitions.easing.*;

function reflectAndAnimate(target:DisplayObject, ease:Object, expandScale:Number, insetScale:Number, expandTime:Number, insetTime:Number):void
{
   var targetClass:Class = Object(target).constructor;
   var targetCopy:DisplayObject = new targetClass();
   targetCopy.y = target.y + target.height;
   targetCopy.x = target.x;
   targetCopy.rotation = 180;
   targetCopy.width = target.width;
   targetCopy.height = target.height;
   targetCopy.scaleX = -target.scaleX;
   addChild(targetCopy);
   
   var msk:Mask = new Mask();
   addChild(msk);
   msk.x = targetCopy.x;
   msk.y = targetCopy.y;
   msk.width = targetCopy.width;
   msk.height = targetCopy.height;
   
   function mskScale():void
   {
      msk.width = target.width;
      msk.height = target.height;
      targetCopy.y = target.y + target.height;
      msk.y = targetCopy.y;
   }

   var intervalId:Timer = new Timer(1, 0);
   intervalId.addEventListener(TimerEvent.TIMER, mskScale);
   intervalId.start();

   function expand(event:MouseEvent):void
   {
      var xTween:Tween = new Tween(target, "scaleX", ease.easeOut, target.scaleX, expandScale, expandTime, true);
      var yTween:Tween = new Tween(target, "scaleY", ease.easeOut, target.scaleY, expandScale, expandTime, true);
      var cxTween:Tween = new Tween(targetCopy, "scaleX", ease.easeOut, targetCopy.scaleX, -expandScale, expandTime, true);
      var cyTween:Tween = new Tween(targetCopy, "scaleY", ease.easeOut, targetCopy.scaleY, expandScale, expandTime, true);
   }

   target.addEventListener(MouseEvent.ROLL_OVER, expand);

   function inset(event:MouseEvent):void
   {
      var xTween:Tween = new Tween(target, "scaleX", ease.easeOut, target.scaleX, insetScale, insetTime, true);
      var yTween:Tween = new Tween(target, "scaleY", ease.easeOut, target.scaleY, insetScale, insetTime, true);
      var cxTween:Tween = new Tween(targetCopy, "scaleX", ease.easeOut, targetCopy.scaleX, -insetScale, insetTime, true);
      var cyTween:Tween = new Tween(targetCopy, "scaleY", ease.easeOut, targetCopy.scaleY, insetScale, insetTime, true);
   }

   target.addEventListener(MouseEvent.ROLL_OUT, inset);
}

reflectAndAnimate(pedro, Strong, 1.2, .8, .5, 1);
reflectAndAnimate(zguillez, Elastic, 1, .5, .5, 1);
reflectAndAnimate(mx, Back, 1, .5, .5, 1);


Y aquí está el ejemplo:



Espero les sea útil. miau

Etiquetas actionscript_3

Comentarios | Enviar un comentario
Se ven muy bien !!!...
Thumbs up
Por: M@U
muy bien! :aplausos:
Por: penHolder
Simplemente excelente Sonrisa
Por: The Fricky!
que buen efecto y ademas muy bien explicado miau
Por: CarlosRuminott
Excelente Tip , esto era lo que andaba buscando miau
Por: flashreloco
Se ve genial Muy Feliz
Por: Kinduff
Excelente tip miau yo también estaba interesado en realizar algo como esto.
Pero tengo un problema cuando agrego los listeners Aw Crap

Código :


target.addEventListener(MouseEvent.ROLL_OVER, expand);
target.addEventListener(MouseEvent.ROLL_OUT, inset);

La salida me muestra los siguientes mensajes:

Código :


TypeError: Error #1006: addEventListener is not a function.
   at reflejo_fla::MainTimeline/reflectAndAnimate()
   at reflejo_fla::MainTimeline/reflejo_fla::frame1()

Disculpen si tenia que colocar este mensaje en el foro de Actionscript Apenado
Por: psycho-vnz
excelente tips.! a ponerlo en practica.. muchas gracias..!
Por: jripper
Idolos Muy Feliz
Por: Loon
exelente, gracias!!
Por: Invitado
execelente y como haria para darles un giro en perspectiva a las fotos, como aqui http://www.dragon-wars.com/gallery.swf
Por: Sebastian Garcia_blog
Exelente!
Por: StormRiders_blog
ummm bueno tube un error aqui:

var msk:Mask = new Mask();
Por: tomili_blog
esto era tan facil como hacer la imagen en photoshop convertir a clip poner un mezcla en el reflejo y ya, te lias demasiado
Por: death scythe_blog
Death x DIOS la clave del AS es hacer mas liviana la aplicacion! si haces el effect en PS pues OBVIAMENTE va a pesar mas! y las peliculas flash normalmente deben ser livianas es por eso que se buscan esta clase de codigos para hacer mas liviano el archivo

Muchas gracias por compartir scripts tan geniales! saludos desde CosTa Rica! Sonrisa
Por: Mariecr_blog
wow mis respets
Por: wow_blog
Maestro....
Por: Yandher_blog
pueden poner el archivo fla para ver mejor el muncionamiento de este excelente exfecto
Por: Wow_blog
Hola a todos, alguien sabe porque me sale este error:
1046: No se encontró el tipo o no es una constante en tiempo de compilación: peruvian.

peruvian , es mi mc, mi nombre de clase y nombre de instancia (solo estoy probando con un solo mc).Si pongo 3 mc me salen los 3 errores.

Gracias
Por: gmopinillosv
Ya lo solucione, y si funciona. Gracias Carlos Yanez
Por: gmopinillosv
¿como lo haria para poner una serie de imagenes indexadas en xml y distridas con un grid?

¿Donde creo el objeto de la imagen y la distribucion?
Por: Arnol_blog
Podes pasar el fla
Por: David_blog
puedes poner el fla porfa
Por: daniel-blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.