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.
Por alternaweb el 18 de Junio de 2009
Saludines
Por 0skr el 19 de Junio de 2009
el link para visualizar el ejemplo no carga la pelicula
Por nestorrente el 19 de Junio de 2009
Por M@U el 20 de Junio de 2009
nestorrente :
Por nestorrente el 20 de Junio de 2009
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 checheno el 16 de Julio de 2009
Por nestorrente el 16 de Julio de 2009
Por Sant el 21 de Julio de 2009
Por sergiogmuro el 16 de Diciembre de 2010
Por nestorrente el 17 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í.