AS改变“注册点”的方法

AS在flash8以后的版本中可以改变显示元素的注册点。在Flash8环境下,显示元素特指MovieClip。这是因为API中提供了Transform和Matrix。利用这两个类可以几乎任意的操作显示元素的形状。

以往的变形操作中,注册点的概念仅在旋转,缩放中有意义,平移不会影响注册点。这样,如果把注册点设定为左上角,则以旋转为例,不管怎么平移,设置_rotation都是围绕左上角的。

使用transform.matrix情况则不同。transform.matrix按照这个仅按照matrix对象的属性设置显示元素的位置。为了描述方便,我在没有进行操作之前,使用的显示元素都是以左上角(0,0)为注册点。为了使用方便,请你也这样做。

matrix是一个矩阵
[a,b,tx
c,d,ty]
这个矩阵的工作是
dstX = srcX*a + srcY*c + tx;
dstY = srcX*b + srcY*d + ty;
我们现在不考虑tx,ty,如果请你找到一个缩放,旋转都不会变化的点,这是哪一点?(0,0),这个就是注册点。自定义的注册点就是考虑tx,ty时的不变的点。

但是,如果数学基础不好,比如我,要计算这样一个点是很不方便的。所以我尽量使用API来简化问题。

前面说过直接设置x,y,Flash8是_x,_y的位移是和注册点无关的,而使用matrix.translate操作确是相关的,我要利用的就是这个特性,先做平移,然后旋转或者缩放再平移回去。

//offset为0时的例子
//!警告:x,y属性不能自己设置,要平移必须使用translate!
//把注册点设置为中心
var halfW:Number = obj.width/2;
var halfH:Number  = obj.height/2;
//offset是当前剪辑的位置,现在要假设他们是0
var matrix:Matrix = obj.transform.matrix;
matrix.translate(-(halfW+offsetX),-(halfH+offsetY));
matrix.rotate(rad);
matrix.scale(xs,ys);
matrix.translate(halfW+offsetX,halfH+offsetY);
obj.transform.matrix = matrix;

现在解释为什么不能设置x,y属性。一上面的例子来说,请在每一次旋转和缩放的前后观察x,y属性,发现他们是变化了的。说明x,y属性被transform对象修改了,直接操作x,y相当于破坏transform的封装。不幸的是得到的结果也是不正确的。

平移的时候,需要记录offset,因为已经看到代码,offset是设置注册点必须的量。

这次没有源文件,Flash8和AS3除了使用_x,_y和x,y的区别外没有不同。
原文地址:https://www.cnblogs.com/chocolate/p/1459078.html