当变形显示对象时,如果要得到以父容器相对坐标系为基准的形变,变形矩阵就不仅要应用在显示对象自身,同时也应用于tx和ty。但是根据仿射变形的公式:f(x)=Ax+b,变形矩阵的值a、b、c、d仅仅与对象的位置数据相乘,并不会和位移矢量tx或ty进行运算。所以修改变形矩阵内部的d值,不会对ty产生作用。
若要得到以父容器相对坐标系为基准的形变,必须在执行公式计算之前,提前计算出修正后的位移矢量。Matrix类的内建方法,都是遵循这样的机制。当代码调用这些方法的时候,AS3自动执行了对tx和ty的修正。
然而在自定义的flip_V_1()函数中,直接修改的仅仅是矩阵的d值,对于ty并未操作。在用变形矩阵替换显示对象原有矩阵时,显示对象的形状被重新计算,并在下一次重绘时更新,这个过程是应用变形矩阵的过程,而不是修正变形矩阵的过程,所以在flipobjbox.flipObj.transform.matrix=objMatrix;语句中,变形矩阵的tx和ty值不会被修改。而显示对象内部采用的是其自身的内部坐标,不包含tx和ty,最终的结果,自然就是显示对象在原地变形了。
由此可见,修正这个小问题十分简单,只需要在objMatrix.d=Math.sin(flipstep);后增加对ty的修正即可:
function flip_V_1():void
{
flipstep+=0.1;
objMatrix.d=Math.sin(flipstep);
objMatrix.ty=50*Math.sin(flipstep);
flipobjbox.flipObj.transform.matrix=objMatrix;
}
再次运行程序,这次的运行结果就符合预期了。其原理可参考图:
ActionScript 3.0中,许多类的属性都不是简单的变量,而是setter/getter取存器。当代码为类对象的取存器属性赋值时,Flash Player会执行取存器中的程序逻辑。最终的结果,可能会牵涉到多个相关变量的修改。