Que tal gente de Cristalab. Después de beneficiarme de este foro durante muuucho tiempo, he decidido aportar alguna cosilla, así que he hecho este efecto en Flash, a ver si os gusta.
El tip siguiente se trata de crear un efecto de sombras dinámicas originadas por un foco de luz que sale del puntero del ratón. Lo bueno es que los objetos con sombras pueden ser cualquier tipo de elemento, hasta un campo de introducción de texto, como he puesto en el ejemplo siguiente:
Código :
function Orientacion(ObjetoRelativo:MovieClip):Number {
// La posición del ratón relativa al objeto.
RatonX = ObjetoRelativo._xmouse - (ObjetoRelativo._width / 2);
RatonY = ObjetoRelativo._ymouse - (ObjetoRelativo._height / 2);
// Por trigonometría calculamos el ángulo
Hipotenusa = Math.round(Math.sqrt(Math.pow(RatonX,2) + Math.pow(RatonY,2)));
Angulo = Math.round(Math.asin(RatonY/Hipotenusa) * Math.round(180/Math.PI));
// De esta forma se consigue que cubra los 360º
if (RatonX < 0) {Angulo = 180 - Angulo}
return Angulo;
}
function Distancia(ObjetoRelativo:MovieClip):Number {
RatonX = ObjetoRelativo._xmouse - (ObjetoRelativo._width / 2);
RatonY = ObjetoRelativo._ymouse - (ObjetoRelativo._height / 2);
// Igual que la función orientación pero solo devuelve la hipotenusa
// que es la distancia en cualquier dirección hasta el ratón.
Hipotenusa = Math.round(Math.sqrt(Math.pow(RatonX,2) + Math.pow(RatonY,2)));
return Hipotenusa;
}
function AplicaEfecto(ObjetoDestino:MovieClip) {
// Los parámetros para la sombra.
// Para que el efecto sea natural deben ser los mismos para todas las sombras.
DistanciaSombra = 10;
ColorSombra = 0x000000;
TransparenciaSombra = 1;
DesenfoqueX = 8;
DesenfoqueY = 8;
var FiltroTemporal = new flash.filters.DropShadowFilter((Distancia(ObjetoDestino)/DistanciaSombra), 180 + Orientacion(ObjetoDestino), ColorSombra, TransparenciaSombra, DesenfoqueX, DesenfoqueY);
var Filtros:Array = ObjetoDestino.filters;
Filtros.pop();
Filtros.push(FiltroTemporal);
ObjetoDestino.filters = Filtros;
}
this.onEnterFrame = function() {
// Por cada frame se aplica el efecto a todos los objetos que queramos.
AplicaEfecto(texto1);
AplicaEfecto(Perraco);
}
// Un efecto de foco MUUUYYY simple
startDrag(Foco,true);
Código :
import flash.geom.*;
SF = new flash.filters.DropShadowFilter();
function sombra(clip){
Pm = new Point(_xmouse,_ymouse);
Pc = new Point(clip._x+clip._width/2 ,clip._y + clip._height/2);
SF.angle = Math.atan2((Pc.x-Pm.x),(Pm.y-Pc.y))*180/Math.PI-90;
SF.distance = Point.distance(Pc, Point.interpolate(Pc,Pm,1.08));
clip.filters = [SF];
}
onMouseMove = function(){ sombra(Perraco); sombra(texto1)}
Código :
import flash.geom.*;
SF = new flash.filters.DropShadowFilter();
BF = new flash.filters.BevelFilter();
function sombra(clip){
Pm = new Point(_xmouse,_ymouse);
Pc = new Point(clip._x+clip._width/2 ,clip._y + clip._height/2);
BF.angle = SF.angle = Math.atan2((Pc.x-Pm.x),(Pm.y-Pc.y))*180/Math.PI-90;
SF.distance = Point.distance(Pc, Point.interpolate(Pc,Pm,1.08));
BF.distance = SF.distance/6;
clip.filters = [BF,SF];
}
onMouseMove = function(){ sombra(Perraco); sombra(texto1)}
Código :
// Librería para utilizar la clase Point
import flash.geom.*;
// Definicion del efecto SOMBRA
SF = new flash.filters.DropShadowFilter();
// Definición del efecto BISELADO
BF = new flash.filters.BevelFilter();
function sombra(clip){
// Posición actual del ratón
Pm = new Point(_xmouse,_ymouse);
// Posición actual del centro del MoviCLip sobre el que vamos a aplicar el efecto.
Pc = new Point(clip._x+clip._width/2 ,clip._y + clip._height/2);
// Definición del ángulo para el efecto SOMBRA y para el efecto BISEL
// (Son exáctamente el mismo)
SF.angle = Math.atan2((Pc.x-Pm.x),(Pm.y-Pc.y))*180/Math.PI-90;
BF.angle = SF.angle;
// Definición de la distancia para el efecto SOMBRA
SF.distance = Point.distance(Pc, Point.interpolate(Pc,Pm,1.08));
// Definición de la distancia para el efecto BISEL
BF.distance = SF.distance/6;
// Se aplican los dos filtros al MoviClip.
// Si, por ejemplo, aquí se pusiera clip.filters = [SF] sólo se aplicaría el efecto SOMBRA
// y lo mismo con BF, que sería para BISEL.
clip.filters = [BF,SF];
}