動態“修改”註冊點,實現任意點旋轉
阿新 • • 發佈:2020-09-21
動態“修改”註冊點,實現任意點旋轉
/** * * *------------------------------------------* * | *** 動態“修改”註冊點,實現任意點旋轉*** | * *------------------------------------------* * * 編輯修改收錄:fengzi(瘋子、wu341、wgq341) * * 不會寫程式碼,我是程式碼搬運工。 * * 聯絡方式:QQ(493712833)。 * * 隨 筆: https://www.cnblogs.com/fengziwu/ * * 版權協議:請自覺遵守LGPL協議,歡迎修改、複製、轉載、傳播給更多需要的人。 * 免責宣告:任何因使用此軟體導致的糾紛與軟體/程式開發者無關。 * 日 期: 2020.03.25 * * * ------------------ Example -------------------- * * PointRegister.register(mc,new Point(100,50)); PointRegister.rotate(mc,60) * 需要注意的點..使用register註冊新的點時..是當前的狀態為去註冊旋轉點, * 就是說如果當前mc已經轉了一定的角度..重新註冊旋轉點..與沒旋轉過的mc註冊旋轉點時位置會不一樣.. * 這裡是需要註冊的地方.. */ package fengzi.util { import flash.display.DisplayObject; import flash.geom.Point; import flash.utils.Dictionary; public class PointRegister { static private var _target:Dictionary; public function PointRegister() { } /** * 註冊旋轉點36 * @param target 目標 * @param point 新註冊點39 */ static public function register(target:DisplayObject, point:Point):void { if (! _target) { _target = new Dictionary(); } _target[target] = {}; var s:Object = _target[target]; s["x"] = point.x; s["y"] = point.y; s["r"] = Point.distance(new Point(target.x,target.y),new Point(s["x"],s["y"])); s["d"] = Math.asin(Math.abs(s["y"] - target.y)/s["r"])/(Math.PI / 180); if (s["x"] > target.x && s["y"] < target.y) { s["d"] = 180 - s["d"]; } else if (s["x"] > target.x && s["y"] > target.y) { s["d"] += 180; } else if (s["x"] < target.x && s["y"] > target.y) { s["d"] = 360 - s["d"]; } } /** * 以新的註冊點旋轉 * @param target 目標 * @param rotation 角度 */ static public function rotate(target:DisplayObject,rotation:Number):void { if (! _target) { return; } if (! _target[target]) { return; } var s:Object = _target[target]; var r:Number = rotation - target.rotation; target.rotation = rotation; s["d"] += r; target.x = s["x"] + s["r"] * Math.cos((s["d"]) * Math.PI / 180); target.y = s["y"] + s["r"] * Math.sin((s["d"]) * Math.PI / 180); } /** * 取消註冊 * @param target 目標 */ static public function unregister(target:DisplayObject):void { if (! _target) { return; } if (! _target[target]) { return; } _target[target] = null; } } }