本例还可以通过应用二次变形矩阵来实现。Matrix类提供concat()方法。该方法可以实现多次变形矩阵的应用。
concat()方法的函数说明为:
方法定义:
public function concat(m:Matrix):void
作用:
连接(Concatenates)一个矩阵到当前矩阵,其效果等于两次变形的效果。在数学角度解释,这种连接等同于两个矩阵相乘。
备注:
1该方法无返回值,将直接修改当前矩阵。
2如果要避免修改,请使用clone方法复制当前矩阵。
参数:
m:Matrix — 用于同当前矩阵连接的一个矩阵
使用concat()方法将两个变形矩阵相乘,在此过程中,tx和ty会参与运算,所以不必在代码中自行设置。通过创建一个处理伸缩映射的变形矩阵,并将它同显示对象的矩阵副本相乘,得到的矩阵将是同直接使用scale()方法等效的。
需要注意的是,该方法直接修改当前矩阵,所以如下的代码是不能达到预期的:
function flip_V_2():void
{
flipstep+=0.1;
flipMatrix.d=Math.sin(flipstep);
objMatrix.concat(flipMatrix);
flipobjbox.flipObj.transform.matrix=objMatrix;
}
因为在这段代码执行时,每次objMatrix都会被改变,每次执行都是在上次执行的结果上处理。正确的写法应该使用clone()方法,创建objMatrix的副本:
……
var flipMatrix:Matrix=new Matrix();
……
//函数主体
function flip_V_3():void{
flipstep+=0.1;
flipMatrix.d=Math.sin(flipstep);
trace("flipmatrix:"+flipMatrix.toString());
var tempMatrix:Matrix=objMatrix.clone();
trace("OriginalMatrix:"+tempMatrix.toString());
tempMatrix.concat(flipMatrix);
trace("Concat result matrix:"+tempMatrix.toString());
flipobjbox.flipObj.transform.matrix=tempMatrix;
}
……
function transtimerHandler(event:TimerEvent):void {
//动画代码编写入口
//flip_V_0();
//flip_V_1();
//flip_V_2();
flip_V_3();
}
执行这段程序,动画的显示结果符合预期。