ActionScript 3.0自寫類整理筆記(二)Dot類

加入共享書籤: HEMiDEMi個人書籤 MyShare個人書籤 Yahoo分享書籤 Technorati分享書籤 Del.icio.us個人書籤 DiggIt! funP分享書籤

index.base.geom.Dot類講解
基本功能:記錄xy兩點
構造函數
public function Dot(x_:Number = 0,y_:Number = 0,_isListen:Boolean = false)
前兩個參數表示Dot的初始位置,第三個參數表示是否是一個功能性強的點
如果為false,當xy發生改變的時候,就不會發布事件,為true則會發布事件
bind鎖定顯示對象方法
public function bind(_dis:DisplayObject,isInTime:Boolean = false):voidr
當Dot綁定到DisplayObject上之後,Dot的xy屬性會隨著_dis改變而改變
第一個參數為綁定的對象,第二個參數表示是否即時鎖定。
如果為false,Dot的xy屬性不會隨著_dis的改變而即時改變,但在獲取Dot的xy屬性,或者調用Dot的方法時,將會立即改變並且以_dis的xy屬性為基準。
如果為true,Dot的xy屬性會隨著_dis的改變而立即改變,如果isListen為true,還會即時發布xy改變的事件,那麼等於可以偵聽顯示對象的xy屬性,並且在改變後做出即時的反應。

updata刷新方法
public function updata():void
更新顯示對象與Dot的xy屬性
from返回兩點之間距離
public function from(_dot:Dot,isQuadrant:Boolean = false):Number
第一個參數表示,結束點,第二個參數表示,是否為真實距離
如果為false,返回的兩點距離絕對是正數,指的是兩點之間的絕對距離
如果為true,則返回相對坐標,那麼是有可能的為負的!
angle返回兩點所形成的夾角
public function angle(_dot:Dot,isRadian:Boolean = false):Numberria
第一個參數表示,另外一個點,第二個參數表示,是否為弧度值
返回的角度是相對順時間的真實角度值,具體的數值變化可以從上面的例子看出
quadrant返回相對點所在的象限
public function quadrant(_dot:Dot,isMaster:Boolean = true):int
第一個參數表示另外一個點,第二個參數表示是否以該點為標準,具體請看示例
返回0,表示兩點在同一條橫著或者豎著的直線上
返回1,表示在第一象限,返回2表示第二象限…………最高是第四象限。
不知道象限是什麼意思的,請看這:觀看
clear方法
public function clear():void
清空顯示對象
length屬性(只讀)
public function get length():Number
獲取該點距0,0點的距離
x屬性
public function set x(num:Number):void
public function get x():Number
設置x屬性,如果isListen為true,則會發布x改變的事件
y屬性
public function set y(num:Number):void
public function get y():Number

設置y屬性,如果isListen為true,則會發布y改變的事件
isListener屬性
public var isListen:Boolean
指定設置isListen的值,是否為可偵聽xy
舉例:
上面的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;
}
//鎖定DisplayObject7
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);
}
}
}
文章來自:512RIA分享

沒有留言:

 
解析度1280*1024 瀏覽器Google
All Content Copyright © 2010 Huang Wei-lun