¿Quieres registrarte?

Añadir a un MovieClip un efecto de espejo con Actionscript 2

Por: NeoCesar
11 de Febrero del 2009

Varias veces he leído a algún clabber que quiere saber como hacer el efecto de espejo de tal o cual pagina, utilizando únicamente flash puesto que no saben, no pueden, o simplemente no les da la gana de hacerlo con un programa de diseño gráfico. Aquí publico la solución utilizando únicamente Actionscript 2, la explico de una manera sencilla, creo yo, es muy importante leer los comentarios al codigo para entenderla mejor. Ahora sin más preámbulos empecemos:

Efecto de Espejo


Para este efecto utilizaremos las propiedades de los MovieClip
Asi como tambien la API de dibujo de flash.

Previos:


Para comenzar con este tip supondremos los siguiente:
  1. Que el fondo de tu película es de color solido, es decir no son ni degradados, ni bitmaps ni nada que se le parezca.
  2. Que el MC que deseas reflejar ya lo tienes dentro de tu Biblioteca (obvio), y que lo tienes vinculado para Actionscript con el indetificador "original".
Dadas estas primeras suposición, empecemos.

PASO 1:


Definiremos una variable que sea igual al color de fondo de la pelicula, como no existe una propiedad que haga eso (al menos no la se) , lo haremos a mano, el código necesario seria el siguiente:

Código :

var fondo = 0xFFFFFF //Suponiendo que el color de fondo sea Blanco

Esta variable nos sera util mas adelante.

PASO 2:


Añadimos al escenario tu MC original, y lo colocamos en cierta posición (x,y)

Código :

this.attachMovie ('original', 'original_mc', _root.getNextHighestDepth()); 
original_mc._x = 10; // modifica este valor por la posicion Horizontal en que deseas aparezca tu MC
original_mc._y = 10; // modifica este valor por la posicion Vertical en que deseas aparezca tu MC

para efecto de este tip utilizare mi avatar como imagen de muestra





PASO 3:


Generamos la imagen de reflejo duplicando el MC original, la reflejamos y la posicionamos debajo del MC original

Código :

original_mc.duplicateMovieClip('reflejo_mc', _root.getNextHighestDepth()); //Duplicamos el MC original
reflejo_mc._yscale = -100; //Giramos el duplicado a manera de escalandolo negativamente
reflejo_mc._x = original_mc._x; //lo colocamos en la misma posición Horizontal que el original,
reflejo_mc._y = original_mc._y + (2*original_mc._height) + 1; //lo colocamos debajo del original, teniendo en cuenta que al escalarla negativamente, el punto de registro a quedado en la esq. inferior izquierda es necesario sumarle el doble del alto original mas 1 pixel



Imagen escalada negativamente antes de reposicionarla




Imagen escalada negativamente reposicionada



Notese que a la imagen reflejada le aumentamos 1 píxel a su posición Y esto es para que no quede pegada a la imagen original ya que debemos tener en cuanta que en un espejo las imagenes no salen pegadas al objeto original debido al grosor del cristalab, si no hagan la prueba y verán que es cierto, en resumen este píxel adicional es para dar realismo al efecto

PASO 4:


Creamos el degradado que hara el efecto de desvanecimiento de la imagen en el supuesto espejo, para esto utilizamos la propiedad .beginGradientFill:

Código :

this.createEmptyMovieClip('efecto_mc', _root.getNextHighestDepth());
colores = [fondo, fondo]; //Aqui es donde utilizamos la variable definida al principio
tipo = "linear"; // Establecemos el tipo de degradado
alphas = [0, 100]; //Establecemos los niveles de alpha puedes variar el 0 para conseguir diferentes tipos de transparencia inicial
ratios = [0, 150]; //Establecemos la posición inicial de cada color, los valores van de 0 a 255, puedes variar el 150 del ejemplo de aceurdo a tu gusto
matrix = {matrixType:"box", x:0, y:0, w:(original_mc._width), h:(original_mc._height), r:(90/180)*Math.PI}; // definimos la matriz ddel degradado.
efecto_mc.beginGradientFill(tipo, colores, alphas, ratios, matrix, 'pad', 'linearRGB');
efecto_mc.moveTo(0,0); //Empezamos a dibujar el cuadro que contendra el degradado utilizando la API de dibujo
efecto_mc.lineTo(original_mc._width,0); //utilizamos la propiedad _width para obtener el ancho del MC original e igualarla a nuestro efecto espejo
efecto_mc.lineTo(original_mc._width,original_mc._height); //utilizamos la propiedad _height apra obtener la altura del MC original e igualarla a nuestro efecto espejo
efecto_mc.lineTo(0,original_mc._height);
efecto_mc.lineTo(0,0);
efecto_mc.endFill(); //Terminamos el dibujo
efecto_mc._x = original_mc._x; //Posicionamos el efecto en el mismo punto Horizontal del original
efecto_mc._y = original_mc._y + original_mc._height + 1; //Posicionamos el efecto debajo de original mas 1 pixel esto lo coloca directamente encima del reflejo

Como se podrá observar para posicionar el efecto de reflejo no se utilizaron las mismas formulas que para posicionar la imagen reflejada esto debido que al posicionar la imagen reflejada debíamos tener en cuenta que esta había sido girada en base al punto de registro y el efecto de reflejo no había sido girado.

Para entender la creación del fondo degradado, recomiendo leer la ayuda integrada en flash acerca de .beginGradientFill ahi se detalla minuciosamente como se crea un relleno degradado

el resultado final es este:




El codigo completo y sin comentarios seria :

Código :

var fondo = 0xFFFFFF;

this.attachMovie ('original', 'original_mc', _root.getNextHighestDepth());
original_mc._x = 10;
original_mc._y = 10;

original_mc.duplicateMovieClip('reflejo_mc',_root.getNextHighestDepth());
reflejo_mc._yscale = -100;
reflejo_mc._x = original_mc._x;
reflejo_mc._y = original_mc._y + (2*original_mc._height) + 1;

this.createEmptyMovieClip('efecto_mc',_root.getNextHighestDepth());
colores = [fondo, fondo];
tipo = "linear";
alphas = [0, 100];
ratios = [0, 150];
matrix = {matrixType:"box", x:0, y:0, w:(original_mc._width), h:(original_mc._height), r:(90/180)*Math.PI};
efecto_mc.beginGradientFill(tipo, colores, alphas, ratios, matrix, 'pad', 'linearRGB');
efecto_mc.moveTo(0,0);
efecto_mc.lineTo(original_mc._width,0);
efecto_mc.lineTo(original_mc._width,original_mc._height);
efecto_mc.lineTo(0,original_mc._height);
efecto_mc.lineTo(0,0);
efecto_mc.endFill();
efecto_mc._x = original_mc._x;
efecto_mc._y = original_mc._y + original_mc._height + 1;


Espero que este tip les haya sido de mucha ayuda. Hasta la próxima.

Enviar a twitter Enviar a facebook


También te interesa


Etiquetas diseño flash actionscript efectos

Comentarios | Enviar un comentario
Está bien el tip.. pero a estas alturas se me hace extraño ver tips de AS2..
Por: Zguillez
Muy bueno para energumenos como yo que todavia siguen con AS2. Lo voy a probar !
Gracias !!!
Por: Spidxel-blog
Z acuerdate de los móviles que usan AS2
Por: eldervaz
Yup! Es un buen tip, aunque me parece que muchos de los trucos en AS2 deberían ser trasladados y publicados en AS3... ¡Es la moda!
(y)
Por: M@U
Esta muy bien, solo que yo hubiera optado por hacerlo manual y sin usar AS =)
Por: nashCode
chevere chevere ke sigan algunos con AS2 :D
Por: yotas-blog
Que lastima que algunos "intento de programadores" sigan usando as2.. porque no se ponen a trabajar con as3?? o les gusta quedarse en el pasado?..
Sigan asi, mejor para los que sabemos as3 no tenemos mucha competencia U_U
Por: nash-blog
Tu comentario me parece en extremo ofensivo eso de "intento de programadores" podrias criticar sin ofender asi sea por lo bajo.
Por: NeoCesar

nash-blog :

Que lastima que algunos "intento de programadores" sigan usando as2.. porque no se ponen a trabajar con as3?? o les gusta quedarse en el pasado?..
Sigan asi, mejor para los que sabemos as3 no tenemos mucha competencia U_U


Veamos nash, los moviles se programan en AS2 y son el presente y el futuro en la web, me parece un comentario de lo más pedante y poco profesional... la tecnología se usa a nivel de necesidades nash, aprende eso

U_U
Por: eldervaz
caray nash-blog, eres todo un pro, va a resultar muy interesante observarte el día que tengas que programar banners y publicarlos en Flash 7 u 8 porque es lo que todos los adservers que no tienen EyeBlaster son capaces de servir

te encargo encarecidamente que por favor guardes tus correos y logs de IM para aprender de cómo con tus argumentos provenientes de Kripton derrotaste las especificaciones de los portales a la hora de realizar sus pautas publicitarias

un poquito más de humildad no te vendría nada mal, por lo general resulta bastante tediosa la gente que intenta llamar la atención con comentarios a destiempo en vez de con su trabajo, como consejo nada más; me resulta confuso para mi entendimiento estar en Toronto hablando con Colin Moock o Aral Balkan y observar cómo son personas completamente normales y ahora llegar aquí y leerte esos comentarios que me hacen pensar que antes de programar te metes en una cabina de teléfono y te pones un traje de lycra con una S gigante en el pecho :)

d+g.
Por: granatta
ah, como agregado, nas-blog, la tecnología es un medio que se usa para resolver problemas, no para masturbarse con ella, comentario NSFW del día, chill out kid
Por: granatta

nash-blog :

Que lastima que algunos "intento de programadores" sigan usando as2.. porque no se ponen a trabajar con as3?? o les gusta quedarse en el pasado?..
Sigan asi, mejor para los que sabemos as3 no tenemos mucha competencia U_U

A ver, si el tip no te sirve por que es en AS2, ignóralo.. Pero el tip es bueno y a mucha gente le servirá, ya sea por que desarrolla para móvil, banners o por el motivo que sea que utiliza AS2..
Este tipo de comentarios despectivos sobran del foro.
A ver si no convertimos el tip en una discusion sobre "AS2 si, AS2 no"...
Por: Zguillez
Vaya!, el tal nash-blog no debe saber tanto as3 si va en busca de tips en vez hacer sus propios desarrollos. Probablemente sea un simple pinche dándoselas de jefe de cocina (hay tantos de estos por todas partes...). Mira don "Ser-Supremo-del-AS3" seguiré con AS2 mientras AS2 solucione mis problemas y no haré caso a los grandes gurús de AS3 como tú que me perdonan la vida a cada paso...
Por: Sonsku
El propio Dani Granata le puso los puntos a Nash.
No sé uds, pero es como si Horus hubiera bajado del olimpo nada más que para decirme "pobre mortal.. que efimero eres".
Si yo fuera nash me quedarían dos cosas por hacer: 1) alegrarme de que un monstruo me dirija la palabra. 2) Ver de desterrar cualquier rastro de fanfarronería ejercitando mi humildad.
Saludos!
Por: Chabat-blog
pd: Gracias Granatta
Por: Chabat-blog
Nash, si eres tan salsa, porque no posteas un tip en AS3?
Por: alternaweb
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.