Hoy me encontré pensando en si sería posible que una imagen en Flash pudiera ser rotada desde cualquier punto a través de Action Script 2 y no solo desde su centro. Por supuesto, no hay ninguna función directa pero la trigonometría tiene una solución para todo, en este tip mostraré como lograrlo.
He colocado el siguiente código en la raíz (_root) del documento:
Código :
/* NOTA: En las funciones atan2, la suma y resta de ángulo se debe a que queremos ajustar el "origen" de los ángulos, siendo este "origen" el lugar donde el ángulo es 0 */ import flash.geom.Point function anguloMouse(MC:MovieClip){ return 90 - Math.atan2(_xmouse - MC._x,_ymouse - MC._y)*180/Math.PI } function anguloMCs(MC1:MovieClip,MC2:MovieClip){ return Math.atan2(MC1._y - MC2._y,MC1._x - MC2._x)*180/Math.PI + 180 } function distMCs(MC1:MovieClip,MC2:MovieClip){ return Point.distance(new Point(MC1._x,MC1._y),new Point(MC2._x, MC2._y)) } this.onMouseDown = function(){ this.rotar = true // Rotación Interior angulo_triangulo1 = anguloMouse(centro_mc) Rot_Inicial = img_mc._rotation // Rotación Exterior angulo_inicial = anguloMCs(img_mc,centro_mc) hipo_imagen = distMCs(img_mc,centro_mc) } this.onMouseUp = function(){ this.rotar = false } this.onMouseMove = function(){ if(this.rotar && !centro_mc.arrastrar){ // Rotación Interior angulo_triangulo2 = anguloMouse(centro_mc) angulo_descrito = angulo_triangulo2 - angulo_triangulo1 this.img_mc._rotation = Rot_Inicial + angulo_descrito // Rotación Exterior var angulo_giro:Number = (angulo_inicial + angulo_descrito + 180)*Math.PI/180 var coordenadas:Point = Point.polar(hipo_imagen,angulo_giro) this.img_mc._x = coordenadas.x + centro_mc._x this.img_mc._y = coordenadas.y + centro_mc._y } updateAfterEvent() }Donde “img_mc” es la imagen que se rota y “centro_mc” es el clip de película que el usuario cambia de posición para poder mover el centro de rotación. El código que lleva este clip es el siguiente:
Código :
arrastrar = false onPress = function(){ // startDrag(this,true) arrastrar = true this._x = _parent._xmouse this._y = _parent._ymouse } onRelease = function(){ // stopDrag() arrastrar = false } onMouseMove = function(){ if(arrastrar){ this._x = _parent._xmouse this._y = _parent._ymouse } updateAfterEvent() }También podría hacerse de igual manera con un startDrag(this,"") y stopDrag(), pero de esta manera ya no dependemos de los FPS.
Archivos del ejemplo: descargar *fla
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Saludines
el link para visualizar el ejemplo no carga la pelicula
nestorrente :
M@U :
Oh, pues gracias, porque el servidor donde estaban tampoco me dejaba linkearlos con la etiqueta "[flash]".
Por Hola Nestor el 16 de Julio de 2009
La figura pienso modelarla con alguna aplicacion para 3D. 3D studio Max probablemente. Gracias de antemano.
Por Sant el 21 de Julio de 2009
Por sergiogmuro el 16 de Diciembre de 2010
sergiogmuro :
Cuando tenga algo de tiempo libre supongo que podría portarlo a AS3... si de verdad te interesa, lo haré y lo publicaré aquí.