下面对以上代码作简要说明:
(1)按照常规步骤创建并拷贝matrix_rect的matrx,
var myMatrix:Matrix=matrix_rect.transform.matrix;
此处应该注意大小写,transform内部并不存在Matrix对象。Matrix是矩阵类的名字,matrix是实例的名字。在AS3中,这样的情况俯拾皆是,一定要小心。
在编写代码时,一定要注意类的继承关系。假如使用了Object对象来声明myMatrix,编译时并不会报错,但是在随后运行将提示类型不匹配错误。
(2)创建好自定义矩阵对象之后,代码需要计算matrix_rect的中心点坐标,并将其移动到坐标系原点:
var tempx,tempy;
tempx=matrix_rect.x+matrix_rect.width/2;//计算中心点x坐标
tempy=matrix_rect.y+matrix_rect.height/2;//计算中心点y坐标
myMatrix.translate(-tempx,-tempy);
此时的情形可参考图:
(3)使用myMatrix.rotate()方法将对象逆时针旋转45度。由于该方法的参数为弧度,所以代码中进行了简单数学转换。因为matrix_rect的中心点已经移动到了坐标原点,所以这次旋转围绕对象的中心进行。图演示的就是此时的情形。
(4)再次使用Matrix类的translate()方法把旋转过的matrix移动到原来的位置。得到最终效果。
实际上,到这里为止代码并没有影响matrix_rect及其显示,所有的移动和旋转都是对myMatrix进行的操作,得到的是一个转换运算矩阵。图8-6和图8-7是为了形象说明每条语句的作用而作的演示示例,并不会出现在舞台上。只有经过最后一句用myMatrix矩阵替换matrix_rect的内部矩阵对象之后,这些操作才真正作用到matrix_rect显示对象上,并将最终结果(如图8-5)显示在舞台上。最终用户只会看到居于舞台中央的矩形围绕中心旋转了45度。
属性transform中的成员都是只读的。所以matrix也不例外,可以更换但是不可以修改。在代码中不能直接对matrix_rect.transform.matrix进行操作。如果尝试以下代码,编译器将会显示一条错误。
matrix_rect.transform.matrix.translate(-tempx,-tempy);//错误代码
必须将transform内部的对象或者transform对象本身拷贝到一个副本里,并对副本进行操作,然后用副本替换显示对象的内部对象。这种用法容易引起困惑。可以理解matrix对象为一个固化的机械零件,可以仿制并对仿制品进行改进,也可以用仿制的零件替换,但其本身不能拆解。