個人認為這個類存在錯誤,這些錯誤又集中出現在最後一個方法getDrawMatrix()裡,因此把源碼copy下來直接注釋:
protected static functiongetDrawMatrix( target:DisplayObject, hitRectangle:Rectangle,accurracy:Number ):Matrix
{
var localToGlobal:Point;;
var matrix:Matrix;
var rootConcatenatedMatrix:Matrix =target.root.transform.concatenatedMatrix;
//雖然下面這句隱含錯誤,但很喜歡它的妙處。這句讓我來寫,肯定是
//localToGlobal =target.parent.localToGlobal( new Point( target.x,target.y));
localToGlobal = target.localToGlobal( new Point( ) );
matrix = target.transform.concatenatedMatrix;
//整個類是以root為標準參考座標系的,下面的localToGloba顯然使用stage座標系,
//hitRectangle使用root座標系,當root相對stage原點沒有位移時,這個錯誤體現不出來,
//只需在文檔類加一句"this.root.x+=50;",就會發現碰撞檢測的結果不準確。
matrix.tx = localToGlobal.x - hitRectangle.x;
matrix.ty = localToGlobal.y - hitRectangle.y;
//下面兩句的目的是,將target的concatenatedMatrix剔除掉root縮放變換的影響,以
//此得到target相對於root的記錄矩陣。但直接設定a,d值來實現scale功能是危險的,
// 當matrix的b,c值不為0(即發生旋轉變換時),這個操作並不等效與scale操作.
// 很多人都反應他們測試旋轉的對象依然準確,為什麼呢?因為rootConcatenatedMatrix的