根据鼠标位置缩放对象

时间:2009-05-31 14:42:00

标签: actionscript-3

我有一个大的大型Sprite,当你旋转鼠标滚轮时,我想放大和缩小鼠标位置作为枢轴点,谷歌地图或photoshop缩放的工作原理。

在scaleX和scaleY属性之间实现缩放效果,但是固定点是(0,0),而我需要是鼠标位置(当然每次都会改变)。

我该如何更改?

感谢。

3 个答案:

答案 0 :(得分:2)

我刚刚做了Google search“缩放任意点”(减去引号),第一个结果看起来很有希望。

您必须从比例尺中取出原始偏移量,然后以新比例重新应用它。我自己做了这个,但是现在还没有代码,所以我会看看我是否可以把它挖出来并稍后发布。

这个伪代码是这样的(来自内存):

float dir = UP ? 1 : -1;
float oldXscale = Xscale;
float oldYscale = Yscale;
Xscale += dir * increment;
Yscale += dir * increment;
newX = (oldX - Xoffset) / Xscale;
newY = (oldY - Yoffset) / Yscale;
Xoffset += (newX * oldXscale) - (newX * Xscale);
Yoffset += (newY * oldYscale) - (newY * Yscale);

任何未声明的内容都是“全球”

答案 1 :(得分:2)

通过在谷歌搜索正确的单词找到... 此链接解释了仿射变换http://gasi.ch/blog/zooming-in-flash-flex/  所以我可以补间变换矩阵:

var affineTransform:Matrix = board.transform.matrix;
affineTransform.translate( -mouseX, -mouseY );
affineTransform.scale( 0.8, 0.8 );
affineTransform.translate( mouseX, mouseY );
var originalMatrix:Matrix = board.transform.matrix;
TweenLite.to(originalMatrix, 0.7, {a:affineTransform.a, b:affineTransform.b, c:affineTransform.c, d:affineTransform.d, tx:affineTransform.tx, ty:affineTransform.ty, onUpdate:applyMatrix, onUpdateParams:[originalMatrix]});

: - )

答案 2 :(得分:-1)

private static function onMouseWheel(event:MouseEvent):void {
    var zoomAmount:Number = 0.03;

    if (event.delta < 0)
        zoomAmount *= -1;

    var x:int = largeLargeSprite.mouseX;
    var y:int = largeLargeSprite.mouseY;
    largeLargeSprite.scaleX += zoomAmount;
    largeLargeSprite.scaleY += zoomAmount;
    largeLargeSprite.x -= x * zoomAmount;
    largeLargeSprite.y -= y * zoomAmount;
}