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.
nestorrente :
M@U :