举例:
上面的flash展示源代码:
import index.base.geom.Dot; import index.base.events.DotEvent;
var po1:Dot = new Dot(0,0,true); var po2:Dot = new Dot(0,0,true); po1.bind(p1,true); po2.bind(p2,true);
po1.addEventListener(DotEvent.DOT_CHANGE,dotChangeFun); po2.addEventListener(DotEvent.DOT_CHANGE,dotChangeFun);
function dotChangeFun(e:DotEvent):void{ te.text = "物体1坐标:" + po1.x + "," + po1.y; te.appendText("\n物体2坐标:" + po2.x + "," + po2.y); te.appendText("\n两点之间距离:" + po1.from(po2)); te.appendText("\n所形成的角度:" + po1.angle(po2)); te.appendText("\n物体1所在象限:" + po1.quadrant(new Dot,false)); te.appendText("\n物体2所在象限:" + po2.quadrant(new Dot,false)); te.appendText("\n物体1对于物体2在象限:" + po2.quadrant(po1)); }
p1.addEventListener(MouseEvent.MOUSE_DOWN,p1MouseDownFun); p2.addEventListener(MouseEvent.MOUSE_DOWN,p2MouseDownFun);
function p1MouseDownFun(e:MouseEvent):void{ p1.startDrag(); stage.addEventListener(MouseEvent.MOUSE_UP,p1MouseUpFun); }
function p1MouseUpFun(e:MouseEvent):void{ p1.stopDrag(); stage.removeEventListener(MouseEvent.MOUSE_UP,p1MouseUpFun); }
function p2MouseDownFun(e:MouseEvent):void{ p2.startDrag(); stage.addEventListener(MouseEvent.MOUSE_UP,p2MouseUpFun); }
function p2MouseUpFun(e:MouseEvent):void{ p2.stopDrag(); stage.removeEventListener(MouseEvent.MOUSE_UP,p2MouseUpFun); }
下面是类的源代码:
package index.base.geom{ import flash.events.EventDispatcher; import flash.display.DisplayObject; import index.base.events.DotEvent; public class Dot extends EventDispatcher{ private var _x:Number; private var _y:Number; private var dis:DisplayObject; public var isListen:Boolean; public function Dot(x_:Number = 0,y_:Number = 0,_isListen:Boolean = false){ _x = x_; _y = y_; isListen = _isListen; } //绑定DisplayObject public function bind(_dis:DisplayObject,isInTime:Boolean = false):void{ dis = _dis; updata(); if(isInTime) dis.addEventListener("enterFrame",enterFrameFun); } //帧频繁事件 private function enterFrameFun(e:Object):void{ if(_x != dis.x) x = dis.x; if(_y != dis.y) y = dis.y; } //更新xy数据 public function updata():void{ if(dis != null){ _x = dis.x; _y = dis.y; } } //计算该点与另外一点的距离 public function from(_dot:Dot,isQuadrant:Boolean = false):Number{ updata(); var num:Number = Math.sqrt(Math.pow(_dot.x - _x,2) + Math.pow(_dot.y - _y,2)); if(!isQuadrant) num = Math.abs(num); return num; } //计算该点与另外一点所形成的线段与水平线的夹角,按顺时间计算 public function angle(_dot:Dot,isRadian:Boolean = false):Number{ updata(); var numx:Number = _dot.x - _x; var numy:Number = _dot.y - _y; var num:Number = Math.atan(numy/numx); if(!isRadian) num = num * 180 / Math.PI; return num; } //返回当前点处在另外一点的哪个象限中 或 返回另外一点处在当前点的哪个象限中 public function quadrant(_dot:Dot,isMaster:Boolean = true):int{ updata(); if(_x == _dot.x || _y == _dot.y){ return 0; } var num:int; var p1:Boolean = (_x - _dot.x) > 0; var p2:Boolean = (_y - _dot.y) > 0; num = isMaster ? (p1 ? (p2 ? 2 : 3) : (p2 ? 1 : 4)) : (p1 ? (p2 ? 4 : 1) : (p2 ? 3 : 2)); return num; } //返回该点距0点的距离 public function get length():Number{ updata(); var num:Number = Math.sqrt(Math.pow(_x,2) + Math.pow(_y,2)); return num; } //清除显示对象 public function clear():void{ dis = null; } //改变X坐标 public function set x(num:Number):void{ _x = num; if(dis != null) dis.x = num; if(isListen) dispatchEvent(new DotEvent(DotEvent.DOT_CHANGE,true)); } //设置X坐标 public function get x():Number{ updata(); return _x; } //改变Y坐标 public function set y(num:Number):void{ _y = num; if(dis != null) dis.y = num; if(isListen) dispatchEvent(new DotEvent(DotEvent.DOT_CHANGE,true)); } //设置Y坐标 public function get y():Number{ updata(); return _y; } } }
事件类的代码:
package index.base.events{ import flash.events.Event; public class DotEvent extends Event{ public static const DOT_CHANGE:String = "dotChange"; public function DotEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false){ super(type,bubbles,cancelable); } } }
经典论坛交流: http://bbs.blueidea.com/thread-2842487-1-1.html
本文链接:http://www.blueidea.com/tech/multimedia/2008/5706.asp
出处:蓝色理想
责任编辑:bluehearts
上一页 Dot类 [1] 下一页
◎进入论坛RIA设计与应用版块参加讨论
|