ActionScript 3 重點

ActionScript 3.0 筆記
基本三角函數的計算:
角的正弦值 = 對邊 / 斜邊
角的余弦值 = 鄰邊 / 斜邊
角的正切值 = 對邊 / 鄰邊
角度制與弧度制的相互轉換:
弧度 = 角度 * Math.PI / 180
角度 = 弧度 * 180 / Math.PI
向滑鼠旋轉(或向某點旋轉):
// substitute mouseX, mouseY with the x, y point to rotate to
dx = mouseX - sprite.x;
dy = mouseY - sprite.y;
sprite.rotation = Math.atan2(dy, dx) * 180 / Math.PI;

創建波形: // assign value to x, y or other property of sprite or movie clip, // use as drawing coordinates, etc.

 public function onEnterFrame(event:Event){
value = center + Math.sin(angle) * range; angle += speed;
 }
創建圓形: // assign position to x and y of sprite or movie clip, // use as drawing coordinates, etc.

public function onEnterFrame(event:Event){
 xposition = centerX + Math.cos(angle) * radius; yposition = centerY + Math.sin(angle) * radius; angle += speed;

}
創建橢圓:
// assign position to x and y of sprite or movie clip,
// use as drawing coordinates, etc.

 public function onEnterFrame(event:Event){
 xposition = centerX + Math.cos(angle) * radiusX; yposition = centerY + Math.sin(angle) * radiusY; angle += speed;
 }

計算兩點間距離:
// points are x1, y1 and x2, y2
// can be sprite / movie clip positions, mouse coordinates, etc.
dx = x2 – x1;
dy = y2 – y1;
dist = Math.sqrt(dx*dx + dy*dy);

轉換為十進位:
trace(hexValue);
十進位轉換為十六進位:
trace(decimalValue.toString(16));

顏色合成:
color24 = red << 16 | green << 8 | blue;
color32 = alpha << 24 | red << 16 | green << 8 | blue;

顏色提取:
red = color24 >> 16; green = color24 >> 8 & 0xFF;
blue = color24 & 0xFF; alpha = color32 >> 24;
red = color32 >> 16 & 0xFF; green = color32 >> 8 & 0xFF;
blue = color232 & 0xFF;

過控制點的曲線:
// xt, yt is the point you want to draw through
// x0, y0 and x2, y2 are the end points of the curve
x1 = xt * 2 – (x0 + x2) / 2;
 y1 = yt * 2 – (y0 + y2) / 2;
moveTo(x0, y0);
curveTo(x1, y1, x2, y2);

角速度轉換為 x,y 速度向量:
vx = speed * Math.cos(angle);
 vy = speed * Math.sin(angle);
角加速度(作用於物體上的 force )轉換為 x,y 加速度: ax = force * Math.cos(angle);
ay = force * Math.sin(angle);

將加速度加入速度向量:
vx += ax;
vy += ay;

將速度向量加入座標:
movieclip._x += vx;
sprite.y += vy;

移除出界對象:
if(sprite.x - sprite.width / 2 > right || sprite.x + sprite.width / 2 < left || sprite.y – sprite.height / 2 > bottom || sprite.y + sprite.height / 2 < top) {
 // 移除影片的代碼
}

重置出界對象:
if(sprite.x - sprite.width / 2 > right || sprite.x + sprite.width / 2 < left || sprite.y – sprite.height / 2 > bottom || sprite.y + sprite.height / 2 < top) {
 // 重置影片的位置和速度
}

螢幕環繞出界物件:
if (sprite.x - sprite.width / 2 > right) {
sprite.x = left - sprite.width / 2;
} else if (sprite.x + sprite.width / 2 < left) {
sprite.x = right + sprite.width / 2;
 }
 if (sprite.y – sprite.height / 2 > bottom) {
 sprite.y = top – sprite.height / 2;
 } else if (sprite.y + sprite.height / 2 < top) {
sprite.y = bottom + sprite.height / 2;
 }
摩擦力應用(正確方法):
speed = Math.sqrt(vx * vx + vy * vy);
angle = Math.atan2(vy, vx);
if (speed > friction) {
 speed -= friction;
} else {
speed = 0;
}
 vx = Math.cos(angle) * speed;
 vy = Math.sin(angle) * speed;

摩擦力應用(簡便方法):
vx *= friction;
vy *= friction;



簡單緩動,長形:
var dx:Number = targetX - sprite.x;
var dy:Number = targetY - sprite.y;
vx = dx * easing;
vy = dy * easing;
sprite.x += vx;
sprite.y += vy;

簡單緩動,中形:
vx = (targetX - sprite.x) * easing;
vy = (targetY - sprite.y) * easing;
sprite.x += vx;
sprite.y += vy;

簡單緩動,短形:
sprite.x += (targetX - sprite.x) * easing;
sprite.y += (targetY - sprite.y) * easing;

簡單彈性,長形:
var ax:Number = (targetX - sprite.x) * spring;
var ay:Number = (targetY - sprite.y) * spring; vx += ax;
vy += ay;
vx *= friction;
vy *= friction;
sprite.x += vx;
sprite.y += vy;

簡單彈性,中形:
vx += (targetX ‐ sprite.x) * spring;
vy += (targetY ‐ sprite.y) * spring;
vx *= friction;
vy *= friction;
sprite.x += vx;
sprite.y += vy;

簡單彈性,短形:
vx += (targetX ‐ sprite.x) * spring;
vy += (targetY ‐ sprite.y) * spring;
sprite.x += (vx *= friction);
sprite.y += (vy *= friction);
偏移彈性運動:
var dx:Number = sprite.x ‐ fixedX;
var dy:Number = sprite.y ‐ fixedY;
var angle:Number = Math.atan2(dy, dx);
var targetX:Number = fixedX + Math.cos(angle) * springLength;
var targetY:Number = fixedX + Math.sin(angle) * springLength;

距離碰撞檢測:
// 從 spriteA 和 spriteB 開始 // 如果使用一個空白影片,或影片沒有半徑(radius)屬性 // 可以用寬度與高度除以 2。

var dx:Number = spriteB.x - spriteA.x;
var dy:Number = spriteB.y - spriteA.y;
var dist:Number = Math.sqrt(dx * dx + dy * dy);
if (dist < spriteA.radius + spriteB.radius) {
// 處理碰撞
}

多物體碰撞檢測:
var numObjects:uint = 10;
for (var i:uint = 0; i < numObjects ‐ 1; i++) {
// 使用變數 i提取引用
var objectA = objects[i];
for (var j:uint = i+1; j<numObjects; j++) {
//使用變數 j 提取引用
var objectB = objects[j];
//在 objectA 與 objectB 之間進行碰撞檢測
}
}

座標旋轉:
x1 = Math.cos(angle) * x - Math.sin(angle) * y;
y1 = Math.cos(angle) * y + Math.sin(angle) * x;
反座標旋轉:
x1 = Math.cos(angle) * x + Math.sin(angle) * y;
y1 = Math.cos(angle) * y - Math.sin(angle) * x;

動量守恆的數學運算式:
(m0 – m1) * v0 + 2 * m1 * v1
v0Final =---------------------------------
 m0 + m1

(m1 – m0) * v1 + 2 * m0 * v0
v1Final = --------------------------------
 m0 + m1

動量守恆的 ActionScript 運算式:

var vxTotal:Number = vx0 - vx1;
vx0 = ((ball0.mass - ball1.mass) * vx0 + 2 * ball1.mass * vx1) / (ball0.mass + ball1.mass);
vx1 = vxTotal + vx0;

顯然本章最大的公式就是萬有引力公式。
引力的一般公式:
force = G * m1 * m2 / distance2
ActionScript 實現萬有引力:
function gravitate(partA:Ball, partB:Ball):void
{
var dx:Number = partB.x ‐ partA.x;
var dy:Number = partB.y ‐ partA.y;
var distSQ:Number = dx * dx + dy * dy;
var dist:Number = Math.sqrt(distSQ);
var force:Number = partA.mass * partB.mass / distSQ;
var ax:Number = force * dx / dist;
var ay:Number = force * dy / dist;
partA.vx += ax / partA.mass;
partA.vy += ay / partA.mass;
partB.vx ‐= ax / partB.mass;
partB.vy ‐= ay / partB.mass;
}

余弦定理:
a2 = b2 + c2 - 2 * b * c * cos A
b2 = a2 + c2 - 2 * a * c * cos B
c2 = a2 + b2 - 2 * a * b * cos C

ActionScript 的余弦定理:
A = Math.acos((b * b + c * c - a * a) / (2 * b * c));
B = Math.acos((a * a + c * c - b * b) / (2 * a * c));
C = Math.acos((a * a + b * b - c * c) / (2 * a * b));

本章的重要公式是 3D 透視,座標旋轉以及距離的計算。
基本透視法:
scale = fl / (fl + zpos);
sprite.scaleX = sprite.scaleY = scale;
sprite.alpha = scale; // 可選
sprite.x = vanishingPointX + xpos * scale;
sprite.y = vanishingPointY + ypos * scale;
排序:
// 假設有一個帶有 zpos 屬性的 3D 物體的陣列
objectArray.sortOn("zpos", Array.DESCENDING | Array.NUMERIC);
for(var i:uint = 0; i < numObjects; i++) {
setChildIndex(objectArray[i], i);
}
座標旋轉:
x1 = cos(angleZ) * xpos - sin(angleZ) * ypos;
y1 = cos(angleZ) * ypos + sin(angleZ) * xpos;
x1 = cos(angleY) * xpos - sin(angleY) * zpos;
z1 = cos(angleY) * zpos + sin(angleY) * xpos;
y1 = cos(angleX) * ypos - sin(angleX) * zpos;
z1 = cos(angleX) * zpos + sin(angleX) * ypos;
3D 距離:
dist = Math.sqrt(dx * dx + dy * dy + dz * dz);




【改變輸出swf的尺度,背景顏色或幀頻】
在"Navigator"窗框裏右鍵你的項目>選中"Properties">選中"ActionScript Compiler">在"Additional compiler arguments"裏輸入你所需要的命令
如想改變背景顏色,請輸入: -default-background-color 0xffffff

【滑鼠座標】
mouseX mouseY
【檢查變數類型並返回布林值】
is
【檢查變數類型並返回類型】
typeof
【檢查物件類型並返回該物件】
as
【是數字但不是有效數字問題】
var quantity:Number = 15 - "rabbits";
trace(typeof quantity); //顯示: "number" , 但它是NaN (not a number)
trace(quantity is Number); //true
trace(quantity != NaN); //false
//使用isNaN()函數檢測:
isNaN(quantity); //true
//檢測變數是否內含有效數字:
!isNaN(quantity); //false
【取消默認的嚴格編譯模式】
在"Navigator"窗框裏右鍵你的項目>選中"Properties">選中"ActionScript Compiler">取消"Enabel compile-time type checking"選項
【基元資料類型和複雜資料類型好比"值類型"和"引用類型"】
基元資料類型類似按值傳遞:
var intOne:int = 1;
var intTwo:int = 1;
trace(intOne == intTwo); //true
【複雜資料類型類似按引用傳遞】
var arrayOne:Array = new Array("a", "b");
var arrayTwo:Array = arrayOne;
trace(arrayOne == arrayTwo); //true
//-----------------------------------
var arrayOne:Array = new Array("a", "b");
var arrayTwo:Array = new Array("a", "b");
trace(arrayOne == arrayTwo); //false
【優化邏輯AND(&&)和OR(||)的小知識】
對於邏輯And(&&):
     除非條件運算式的前半部分為真,否則,ActionScript不會再去求算邏輯AND運算符的後半部.如果前半部為假,整個條件運算式一定為假,所以再去求算後半部就沒效率了.
對於邏輯OR(||):
     除非條件運算式前半部為假,否則,ActionScript不會再去求算邏輯OR運算符的後半部,如果前半部為真,整個條件運算式一定為真.
總結:使用邏輯AND(&&)時,把結果最可能為false的運算式放到前面;使用邏輯OR(||)時,把結果最可能為true的運算式放到前面.
【Timer類注意事項】
不要認為Timer可以極其準確;使用Timer時間間隔不要低於10毫秒.
【private,protected,internal,public訪問許可權】
private:只能在類本身內部訪問,按慣例,命名私有成員時以下劃線"_"開頭;
protected:可以由類本身或任何子類訪問.但這是以實例為基礎的.換言之,類實例可以訪問自己的保護成員或者父類的保護成員,但不能訪問相同類的其他實例的保護成員,按慣例,命名保護成員時以下劃線"_"開頭;
internal:可以由類本身或者相同包內的任何類訪問;
public:可以在類內部訪問,也可以由類實例訪問,或者聲明為static時,可以直接從類訪問.
【一個函數具有未知個數的參數,用arguments物件或"...(rest)"符號訪問它的參數】
注意:使用"...(rest)"參數會使 arguments 對象不可用;
private funciton average():void{
     trace(arguments.length); //輸出參數的個數
     // arguments的類型是:object,但可以像訪問陣列一樣去訪問它
     trace(arguments[1]); //輸出第二個參數
}
private function average(...argu):void{
     trace(argu[1]); //輸出第二個參數,argu參數名是自定義的.
}
【錯誤處理try,catch,finally】
private function tryError():void{
     try {
         trace("測試開始-try");
         throwError();
     }catch(errObject:Error) {
         trace("錯誤資訊:" + errObject.message);
         trace("測試結束-catch");
         return;
     }finally{
         trace("雖然catch裏已經有return方法,但位於return方法後面的finally裏的代碼依然會被執行.其實無論return方法是在try裏,還是catch裏,finally裏的代碼始終會被執行");
     }
     trace("前面已經有return了,此處是不會再執行的.除非沒有拋出錯誤,以使catch裏的代碼沒有被執行");
}
private function throwError():void{
     throw new Error("拋出錯誤");
}
【for...in與for each...in的區別】
與for...in迴圈不同的是,for each...in迴圈中的迭代變數包含屬性所保存的值,而不包含屬性的名稱(或主鍵,索引).
【命名包路徑的小技巧】
     使用相應於擁有者和相關項目的包名稱會比較好.按慣例來講,包名稱的開頭應該是逆向的網址名稱.例如,如果Example Corp(examplecorp.com)寫了一些ActionScript3.0類,就會把所有類放在com.examplecorp包內(或者 com.examplecorp的子包內).如此一來,如果英國有另一家Example Corp(examplecorp.co.uk)也寫了一些ActionScript3.0類,只要使用包uk.co.examplecorp,就可確保 唯一性.
     當類屬於特定應用程式的一部分時,就應該放在該應用程式特定的子包內.例如,Example Corp可能有個應用程式名叫WidgetStore.如果WidgetStore應用程式使用一個名為ApplicationManager的類,則此 類就應該放在com.examplecorp.widgetstore包內,或者位於該包的子包內.
     按慣例來說,包名稱的開頭是小寫字母.
【隱式的取出方法(getter)和設定方法(setter)】
public function get count():uint {
     return _count;
}
public function set count(value:uint):uint {
     if(value < 100){
         _count = value;
     }else {
         throw Error();
     }
}
【確保類是絕不會有子類,使用final】
final public class Example{}
【super關鍵字的使用】
super(); //父類的構造函數,只能在類實例構造函數內部使用
super.propertyName; //調用父類的屬性,屬性需要聲明為public或protected
super.methodName(); //調用父類的方法,方法需要聲明為public或protected
【建立常數,使用關鍵字const而不是var】
static public const EXAMPLE:String = "example";
【檢測播放器版本】
flash.system.Capabilities.version
對於8.5版以前的任何Flash Player版本,這種方法都不適用.
【判斷用戶端系統】
flash.system.Capabilities.os
【檢測播放器類型】
flash.system.Capabilities.playerType
可能的值有:
"StandAlone",用於獨立的 Flash Player
"External",用於外部的 Flash Player 或處於測試模式下
"PlugIn",用於 Flash Player 流覽器插件
"ActiveX",用於 Microsoft Internet Explorer 使用的 Flash Player ActiveX 控制項
【檢測系統語言】
flash.system.Capabilities.language
【判斷用戶是否啟用了IME(輸入法編輯器)】
flash.system.IME.enabled
【檢測螢幕的解析度】
flash.system.Capabilities.screenResolutionX
flash.system.Capabilities.screenResolutionY
【把彈出視窗居中的演算法】
X = (舞臺寬/2)-(窗口寬/2)
Y = (舞臺高/2)-(窗口高/2)
【控制影片配合Player的方式,包括縮放問題】
stage.scaleMode
可供選擇值:flash.display.StageScaleMode
【舞臺的對齊方式】
stage.align
可供選擇值:flash.display.StageAlign
【隱藏Flash Player的右鍵菜單】
stage.showDefaultContextMenu = false;
【檢測系統是否具有音頻功能】
flash.system.Capabilities.hasAudio
【檢測播放器是在具有MP3解碼器的系統上運行,還是在沒有MP3解碼器的系統上運行】
flash.system.Capabilities.hasMP3
【檢測播放器能 (true) 還是不能 (false) 播放流式視頻】
flash.system.Capabilities.hasStreamingVideo
【檢測播放器是在支援 (true) 嵌入視頻的系統上運行,還是在不支援 (false) 嵌入視頻的系統上運行】
flash.system.Capabilities.hasEmbeddedVideo
【檢測播放器能 (true) 還是不能 (false) 對視頻流(如來自 Web 攝像頭的視頻流)進行編碼】
flash.system.Capabilities.hasVideoEncoder
【顯示 Flash Player 中的"安全設置"面板】
flash.system.Security.showSettings();
可供選擇項:flash.system.SecurityPanel
【讓其他域的.swf訪問本域的.swf】
在本域的.swf文件里加上:flash.system.Security.allowDomain()
或 者使用安全策略檔"crossdomain.xml".在Flash 8以前,這個檔必須放在.swf所在域的根目錄,現在,你可以使用flash.system.Security.loadPolicyFile(),指定安全策略檔所在的位置.拒絕任何域的做法是在<cross-domain-policy>標籤內什麼也不填,安全策略檔也支援通用字元 "*":
<?xml version="1.0"?>
<!-- http://www.mydomain.com/crossdomain.xml -->
<cross-domain-policy>
     <allow-access-from domain="www.riahome.cn" />
     <allow-access-from domain="*.Y-boy.cn" />
     <allow-access-from domain="210.38.196.48" />
     <allow-access-from domain="*" />
</cross-domain-policy>
【數位的不同進制之間的轉換】
parseInt(str:String, radix:uint = 0):Number 返回十進位的數,參數radix表示要分析的數字的基數.如果省略radix,就默認為10,除非字串的開頭是"0x","0X"或"0":
trace(parseInt("0x12")); //設定radix為16,輸出:18
trace(parseInt("017")); //設定radix為8,輸出:15
或者使用Number,uint和int物件的toString(radix)方法.
【使用Math.round()對一個數取整,四捨五入】
Math.round()
trace(Math.round(204.499)); //輸出:204
trace(Math.round(401.5)); //輸出:402
【使用Math.floor()對一個數向下取整,就是只要整數部分而不理會小數分】
trace(Math.floor(204.99)); //輸出:204
【使用Math.ceil()對一個數向上取整,只要小數部分不為零,整數部分就加1】
trace(Math.ceil(401.01)); //輸出:402
【產生一個亂數】
使用Math.random()產生一個偽亂數n,其中 0 <= n < 1
【把數字取至最近的小數點位,即指定精確度】
1. 決定你要取的數字的小數點位元數:例如,如果你想把90.337取成90.34,就表示你要取到兩位小數點位,也就是說你想取至最近的0.01;
2. 讓輸入值除以步驟1所選的數位(此例為0.01);
3. 使用Math.round()把步驟2所計得的值取成最近的整數;
4. 把步驟3所得的結果乘以步驟2用於除法的那個值.
例如,要把90.337取成兩個小數點位數,可以使用:
trace(Math.round(90.337/0.01)*0.01); //輸出:90.34
【把數位取成一個整數的最接近倍數值】
例1,這樣會把92.5取成5的最近倍數值:
trace(Math.round(92.5/5)*5); //輸出:95
例2,這樣會把92.5取成10的最近倍數值:
trace(Math.round(92.5/10)*10); //輸出:90
【在指定數值範圍內獲得亂數】
//可取範圍:[min, max]
private function randRange(min:Number, max:Number):Number {
     var randomNum:Number = Math.floor(Math.random() * (max - min + 1)) + min;
     return randomNum;
}
應用例子:
模擬投銀幣,即希望得到隨機布林值(true 或 false): randRange(0, 1);
模擬投骰子,即希望得到隨機六個值: randRange(1, 6);
為避免被緩存而需要產生一個獨一無二的數位追加在URL尾端,通常最佳方法是取得當前毫秒數.
【弧度(radian)與度數(degree)之間的轉換】
從弧度轉為度數: degrees = radians * 180 / Math.PI
從度數轉為弧度: radians = degrees * Math.PI / 180
【計算兩點之間的距離】
畢氏定理: c2 = a2 + b2
假設有兩個影片剪輯mc1和mc2,則它們兩點間的距離c為:
var c:Number = Math.sqrt(Math.pow(mc1.x - mc2.x, 2) + Math.pow(mc1.y - mc2.y, 2));
【模擬圓周運動】
已知圓心o(x0, y0),半徑r和弧度angle,求圓上任意一點P(x, y)的座標:
x = x0 + (Math.cos(angle) * r);
y = y0 + (Math.sin(angle) * r);
注意:舞臺的x軸正方向水準向右,y軸正方向垂直向下.
【模擬橢圓運動】
已知圓心o(x0, y0),長軸a,短軸b以及弧度angle,求圓上任意一點P(x, y)的座標:
x = x0 + (Math.cos(angle) * a);
y = y0 + (Math.sin(angle) * b);

【華氏溫度和攝氏溫度之間的轉換】
華氏溫度 = 攝氏度數 * 9 / 5 + 32
攝氏溫度 = (華氏度數 - 32) * 5 /9
【公斤與磅之間的轉換】
公斤 = 磅 * 2.2
 = 公斤 / 2.2
【向陣列尾端添加元素】
var array:Array = new Array();
array.push("a", "b");
//向陣列尾端添加單一元素也可以這樣:
array[array.length] = "c";
//如果以索引設定的元素不存在,陣列本身會自動擴展以包含足夠的元素數目.介於中間的元素會被設為undefined:
array[5] = "e";
trace(array[4]); //輸出: undefined
【向陣列開端添加元素】
var array:Array = ["a", "b"];
array.unshift("c", "d");
trace(array); //輸出: c,d,a,b
【刪除陣列中第一個元素並返回該元素,使用shift()方法】
var letters:Array = new Array("a", "b", "c");
var firstLetter:String = letters.shift();
trace(letters); //輸出: b,c
trace(firstLetter); //輸出: a
【刪除陣列中最後一個元素並返回該元素的值,使用pop()方法】
var letters:Array = new Array("a", "b", "c");
trace(letters); //輸出: a,b,c
var letter:String = letters.pop();
trace(letters); //輸出: a,b
trace(letter); //輸出: c
【刪除陣列中的元素,給陣列添加新元素並返回刪除的元素,使用splice()方法】
splice(startIndex:int, deleteCount:uint, ... values):Array
startIndex: 一個整數,它指定陣列中開始進行插入或刪除的位置處的元素的索引;
deleteCount: 一個整數,它指定要刪除的元素數量;
... values: 用逗號分隔的一個或多個值的可選列表或陣列,此列表或陣列將插入到此陣列中由 startIndex 參數指定的位置.
【查找陣列中第一個相匹配的元素】
var array:Array = ["a", "b", "c", "d", "a", "b", "c", "d"];
var match:String = "b";
for(var i:int = 0; i < array.length; i++) {
     if(array[i] == match) {
         trace("Element with index " + i + " found to match " + match);
         //輸出: Element with index 1 found to match b
         break;
     }
}
【查找陣列中最後一個相匹配的元素】
var array:Array = ["a", "b", "c", "d", "a", "b", "c", "d"];
var match:String = "b";
for(var i:int = array.length - 1; i >= 0; i--) {
     if(array[i] == match) {
         trace("Element with index " + i + " found to match " + match);
         //輸出: Element with index 5 found to match b
         break;
     }
}
【把字串轉成陣列】
使用String.split()方法:
var list:String = "I am YoungBoy.";
var words:Array = list.split(" "); //以空格作為分隔符號號號將字串切割
trace(words); //輸出: I,am,YoungBoy.
【把陣列轉成字串】
使用String.join()方法:
var myArr:Array = new Array("one", "two", "three");
var myStr:String = myArr.join(" and ");
trace(myArr); //輸出: one,two,three
trace(myStr); //輸出: one and two and three
【使用物件陣列處理相關資料】
var cars:Array = new Array();
cars.push({make:"Mike", year:1997, color:"blue"});
cars.push({make:"Kelly", year:1986, color:"red"});
for(var i:int = 0; i < cars.length; i++) {
     trace(cars[i].make + " - " + cars[i].year + " - " + cars[i].color);
}
//輸出:
//     Mike - 1997 - blue
//     Kelly - 1986 - red
【在陣列中獲取最小或最大值】
var scores:Array = [10, 4, 15, 8];
scores.sort(Array.NUMERIC);
trace("Minimum: " + scores[0]);
trace("Maximum: " + scores[scores.length - 1]);
【使用for ... in語句讀取關聯陣列元素】
var myObject:Object = new Object();
myObject.name = "YoungBoy";
myObject.age = 20;
for(var i:String in myObject) {
     trace(i + ": " + myObject[i]);
}
//輸出: name: YoungBoy
//       age: 20
注意: for ... in迴圈不會顯示物件所有的內建屬性.例如,迴圈會顯示執行期間新增的特殊屬性,但是,不會列出內建物件的方法,即使都是儲存在物件屬性內.
【AVM(ActionScript Virtual Machine,虛擬機)和渲染引擎(Rendering Engine)】
AVM負責執行ActionScript程式,而渲染引擎則是把物件繪製在顯示器上.
【指出容器的顯示清單中有多少顯示物件】
每個容器都有numChildren屬性.
【把專案新增至顯示清單】
addChild(child:DisplayObject)
addChildAt(child:DisplayObject, index:int)
index: 添加該子項的索引位置.如果指定當前佔用的索引位置,則該位置以及所有更高位置上的子物件會在子級列表中上移一個位置.
【從顯示清單中移除專案】
removeChild(child:DisplayObject)
removeChildAt(index:int)
index: 要刪除的 DisplayObject 的子索引,該子項之上的任何顯示物件的索引位置都減去1.
如果想移除視窗所有子元件,可以結合removeChildAt(),numChildren屬性以及for迴圈.因為每次一個子元件被移除時,索引位置都會變化,所以,有兩種方法可以處理所有子元件的移除:
1. 總是移除位置0的子元件;
2. 倒過來移除子元件,也就是從尾端開始.
【更改現有子項在顯示物件容器中的位置】
setChildIndex(child:DisplayObject, index:int):void
可能用到的方法:
返回 DisplayObject 的 child 實例的索引位置: getChildIndex(child:DisplayObject):int
返回位元元於指定索引處的子顯示物件實例: getChildAt(index:int):DisplayObject
注 意: 當子元件移到低於它現在所在位置的索引時,那麼,從標的索引起,直到子元件索引前面的那個索引的所有子元件都會令其索引增加1,而該子元件就會指定至標的 索引.當子元件移到較高索引時,從該子元件索引之上的那個索引起,直到標的索引的所有子元件都會令其索引往下減1,而該子元件就會指定至標的索引值.
【關於TextField以垂直方式把文字擺在按鈕表面中心點的小技巧】
textField.y = (_height - textField.textHeight) / 2;
textField.y -= 2; //減2個圖元以調整偏移量
【外部.swf影片載入和互動】
1. 監聽init事件;
2. 透過content屬性存取所載入的影片.
當所載入的影片做好足夠的初始化工作,使其方法和屬性可以接受互動時,init事件就會被發起.只有在載入器發起init事件後,才能控制影片.所載入的影片還沒初始化就試著與它互動,是會產生執行期間錯誤的.
_loader.contentLoaderInfo.addEventListener(Event.INIT, handleInit); //當載入的.swf的屬性和方法可用時
_loader.load(new URLRequest("ExternalMovie.swf"));
private function handleInit(event:Event):void {
     var movie:* = _loader.content;
     trace(movie.getColor());
     movie.setColor(0xFF0000);
}
【TextField有兩種類型:動態(dynamic)和輸入(input),預設值為動態.改變TextField類型方法】
field.type = TextFieldType.INPUT; //selectable屬性預設值為true
flash.text.TextFieldType.INPUT和flash.text.TextFieldType.DYNAMIC
【過濾文字輸入】
TextField.restrict = "此處為可輸入的內容";
field.restrict = "^此處為禁止輸入的內容";
restrict屬性支援一些類似正則運算式的樣式:
field.restrict = "a-zA-z"; //只允許大小字母
field.restrict = "a-zA-z "; //只允許字母和空格
field.restrict = "0-9"; //只允許數字
field.restrict = "^abcdefg"; //除了小寫字母abcdefg不允許外,其他都允許
field.restrict = "^a-z"; //所有小寫字母都不允許,但是,其他內容都允許,包括大寫字母
field.restrict = "0-9^5"; //只允許數字,但5例外
讓restrict字元包含具有特殊意義的字母(例如-和^):
field.restrict = "0-9\\-"; //允許數字和破折號
field.restrict = "0-9\\^"; //允許數字和^
field.restrict = "0-9\\\\"; //允許數字和反斜杠
你也可以使用Unicode轉義序列,指定允許的內容.例如:
field.restrict = "^\u001A";
注意:ActionScript有區分大小寫的,如果restrict屬性設為abc,允許字母的大寫形式(A,B和C)輸入時會變成小寫對待形式(a,b和c),反之亦然.restrict屬性只影響用戶可以輸入的內容,腳本可將任何文本放入文本欄位元元中.
【設定輸入框的最大長度】
TextField.maxChars:int
【向TextField追加內容】
TextField.appendText(text:String):void
與通過對 text 屬性使用加法賦值來連接兩個字串(例如 field.text += moreText)相比,此方法的效率更高.
【顯示HTML格式的文字】
TextField.htmlText = "<b>Html text</b>";
支 持的HTML標籤集有: <b>,<i>,<u>,<font>(有face,size以及color屬性),< p>,<br>,<a>,<li>,<img>以及<textformat>(有 leftmargin,rightmargin,blockindent,indent,leading以及tabstops屬性,相應於 TextFormat類的同名屬性)
【縮減空白】
TextField.condenseWhite = true;
刪除具有HTML文本的文本欄位元元中的額外空白(空格,換行符等),如同多數HTML流覽器所做的那樣.
注意: 在設置 htmlText 屬性之前設置 condenseWhite 屬性
【自動大小調整和對齊】
TextField.autoSize = TextFieldAutoSize.LEFT;
可選之值:
flash.text.TextFieldAutoSize.CENTER
flash.text.TextFieldAutoSize.LEFT
flash.text.TextFieldAutoSize.NONE
flash.text.TextFieldAutoSize.RIGHT
【指示文本欄位元元是否自動換行】
TextField.wordWrap = true; //自動換行
【用程式手段滾動文字】
水準方向以圖元為單位,而垂直方向以行做單位:
scrollV: 指出文字框可見區域的最頂行,可讀寫;
bottomScrollV: 指出文字框內最底端可見行,唯讀;
maxScrollV: scrollV的最大值,唯讀;
numLines: 定義多行文本欄位中的文本行數,唯讀;
TextField.scrollV = field.maxScrollV; //滾動到最後一頁
【回應滾動事件】
field.addEventListener(Event.SCROLL, onTextScroll);
【樣式化文字的方法】
1. 使用HTML標籤進行樣式化;
2. 使用TextFormat物件;
3. 使用CSS.
例如: HTML是用<font>標籤,TextFormat物件是設定font屬性,而CSS是使用font-family屬性的.
受支援的層疊樣式表(CSS)屬性和值,及其相應的ActionScript屬性名稱(小括弧內):
color(color),display(display),font-family(fontFamily),font-size(fontSize),font-style(fontStyle),font-weight(fontWeight),kerning(kerning),leading(leading),letter-spacing(letterSpacing),margin-left(marginLeft),margin-right(marginRight),text-align(textAlign),text-decoration(textDecoration),text-indent(textIndent)
受支援的HTML實體: <(小於號: <), >(大於號: >), &(和: &), "(雙引號: "), '(撇號,單引號: ')
其中樣式物件的兩種寫法:
寫法一:
var sampleStyle:Object = new Object();
sampleStyle.color = "#FFFFFF";
sampleStyle.textAlign = "center";
css.setStyle(".sample", sampleStyle);
寫法二:
var sampleStyle:Object = {color: "#FFFFFF", textAlign: "center"};
css.setStyle(".sample", sampleStyle);
【對用戶輸入的文字進行樣式化】
使用defaultTextFormat屬性,樣式會施加至用戶鍵入輸入框的文字身上:
var formatter:TextFormat = new TextFormat();
formatter.color = 0x0000FF; //把文字變成藍色
field.defaultTextFormat = formatter;
【對現有文字的一部分進行樣式化】
TextFormat.setTextFormat(format:TextFormat, beginIndex:int = -1, endIndex:int = -1):void
【設定文字框的字體】
例子:
HTML: field.htmlText = "<font face='Arial'>Formatted text</font>";
TextFormat: formatter.font = "Arial";
CSS: P{ font-family: Arial; }
也可以使用以逗號隔開的字體清單: formatter.font = "Arial, Verdana, Helvetica";
注意:
字體和字體群組不同.字體群組有三種: _sans,_serif以及_typewriter.
_sans群組一般就是指Arial或Helvetica這種字體;
_serif群組一般就是指Times或Times New Roman這種字體;
_typewriter群組一般就是指Courier或Courier New這種字體.
【嵌入字體】
使用[Embed]後設標籤.[Embed]後設標籤應該出現在ActionScript檔中,處於類宣告之外.你可以內嵌TrueType字體或系統字體.內嵌TrueType字體時的語法:
[Embed(source="pathToTtfFile", fontName="FontName", mimeType="application/x-font-truetype")]
pathToTtfFile: ttf檔的路徑,TrueType字體的路徑可以是相對的,也可以是絕對的;
FontName: 字體名稱;
內嵌系統字體的語法:
[Embed(systemFont="Times New Roman", fontName="Times New Roman", mimeType="application/x-font-truetype")]
fontName: 以相同名稱作為實際系統字體名稱.
注 意: 在使用嵌入字體時,要把TextField的embedFonts屬性設為true,這樣TextField只能用內嵌字體了.如果你試著替 embedFonts設為true的TextField使用設備字體,什麼都不會顯示.如果embedFonts設為true,就無法指定以逗號相隔的字體清單.
【建立可以旋轉的文字】
使用內嵌字體.當你旋轉文字框時,設備字體就會消失.
【顯示Unicode文字】
1. 從外部來源載入Unicode文字;
2. 假如你的編輯器支援Unicode(如 Flex Builder),則可以直接在ActionScript程式中使用該字元;
3. 使用Unicode轉義字元,ActionScript裏所有Unicode轉義字元都以\u開頭,後面再跟四位元十六進位數字.
注意: 如果你想取得Unicode字元,在Windows下使用: 開始>所有程式>附件>系統工具>字元對應表.
【把Flash Player的焦點帶給文字框】
stage.focus = field;
把焦點移除:
stage.focus = null;
注意: 當.swf檔首次載入至網頁流覽器時,並沒有焦點.因此,以程式的方式把焦點指定給Flash應用程式的一個元素前,必須先把焦點移至Flash Player.
【以ActionScript選取文字】
使用TextField.setSelection(beginIndex:int, endIndex:int):void
為了可以正常選取文字,文字框必須具有焦點:
stage.focus = field; //把焦點設給文字框
field.text = "This is example text"; //設定文字
field.setSelection(0, 4); //把"This"這個單詞以高亮顯示
使用唯讀的selectionBeginIndex和selectionEndIndex屬性訪問所選取的字元範圍的索引.
【在文字內設定安插點(遊標位置)並訪問遊標位置的索引值】
可以使用TextField.setSelection()把起始和結尾的索引參數都設成相同值,在文字內設定遊標位置(假設具有焦點):
field.setSelection(0, 0); //在第一個字元前擺放安插點
trace(field.caretIndex); //輸出遊標位置的索引值
【當文本欄位元元受到選取或取消選取時給予響應】
獲得焦點時: FocusEvent.FOCUS_IN
失去焦點時: FocusEvent.FOCUS_OUT
通過鍵盤(Tab鍵)把焦點移除時: FocusEvent.KEY_FOCUS_CHANGE
通過滑鼠把焦點移除時: FocusEvent.MOUSE_FOCUS_CHANGE
FocusEvent 類有一個relatedObject屬性.就FOCUS_IN事件而言,relatedObject屬性是剛才擁有焦點的物件的引用位址;對於 FOCUS_OUT,KEY_FOCUS_CHANGE以及MOUSE_FOCUS_CHANGE事件,relatedObject屬性是剛接收到焦點的物件的引用位址.
FOCUS_IN和FOCUS_OUT事件都是在焦點改變後發生的,所以兩者都是不可取消的事件.對於KEY_FOCUS_CHANGE和MOUSE_FOCUS_CHANGE事件,可以使用FocusEvent.preventDefault()方法取消默認行為:
field.addEventListener(FocusEvent.KEY_FOCUS_CHANGE, onKeyFocus);
private function onKeyFocus(event:FocusEvent):void {
     if(field.text == "") {
         event.preventDefault(); //當field沒有任何文字前,不允許使用Tab鍵把焦點移除
     }
     //event.relatedObject就是剛才擁有焦點的物件的引用位址,即下一個獲得焦點的物件的引用位址
}


2009-08-30 21:45
最近看了《AS3從入門到精通》,記錄了一些筆記,可能會對初學者有所幫助:)

1.AS3的虛擬機叫AVM2,而早期的AS使用的是AVM1,所以效率上AS3比早期版本快了10倍;
2.舞臺的名字叫state,主時間軸的名字叫root
3.當trace()函數輸出變數時,會自動調用toString()方法
4.寫在幀裏面的變數都是在MainTimeLine的類裏,並且MainTimeLine是動態類,而root是該類創建的物件,所以這些變數都變成了root的屬性,可以用 root.xxx 來訪問
5.Stage不是動態類,所以不能給他創建屬性,例如stage.xxx就不行了
6.時間軸的方波順序是在同一時間軸而不同圖層中,同一幀上的代碼由上到下執行;在同一圖層上,按照包含這些代碼的幀在時間軸上出現的先後順序排列
7.聲明常量 const ABC:unit=5;
8.flash中的數位計算,整數計算沒有誤差,但是浮點數計算總會出現誤差,例如:trace(0.1+0.2)
9.有時候,處理數位的時候,可以先把它轉換成文本類型,或許可以處理的更加方便
10.在基於時間軸的編程中,如果在第一幀定義了一個變數,又在後面的幀中定義了一個同名變數,AS3會當作“重複定義變數”來處理---新的變數代替舊的變數
11.Number類型的預設值是NaN(not a number);String類型的預設值是null;Boolean->false;int(uint)->0;
"*"類型的預設值是undefined,Object的預設值是null;
12.使用var 定義變數比直接定義變數和this動態添加變數效率更高;另外,聲明變數的準確資料類型會提高效率;(相比不定義資料類型或資料類型定義的不準確)
13.AS3中任何類都是Object的子類 var aaa:Object=new Object();或者var a:Object;
14.a=[0];表示陣列;a={x:0};表示物件,x是其屬性;
15.用反射動態創建實例的話,就可以製作swf素材庫,根據庫中的鏈結名可動態導出素材,實現程式與美工的分離;
//保存鏈結名
var linkname:String = "BigPhoto";
//得到類資訊
var cla:Class = getDefinitionByName(linkname);
//創建類的實例
var bitmapdata:NewClass = new cla();



16.複雜資料類型的變數通過引用來操作實例的
var obj1:Object=new Object();
var obj2:Object=new Object();
trace(obj1==obj2); //false;
var obj3:Object=obj1;
trace(obj1==obj3)//true
17.delete 不能刪除var 定義的變數,只能刪除動態的屬性。
delete mc.speed;
delete arr[0];-------只是刪除陣列的元素的值,不能刪除索引; 可以用splice刪除元素;//oneArray.splice(2,2);
18.檢測變數的準確資料類型,用is-----用來判斷實例是否屬於某類型;或者它的父級;
var x_mc:MovieClip=new MovieClip();
trace(x_mc is MovieClip); //true
trace(x_mc is Sprite);       //true
trace(x_mc is Stage);       //falsed
19.getQualifiedClassName();獲取包括包在內的完整資訊;
20.as作為複雜類型轉換: 對象 as 類型;mc2=mc1 as MovieClip;
21.this是對當前對象的引用,在主時間軸中,this引用的是主時間軸,所以trace(root==this);//true
22.點語法可以用“[ ]”來代替
var x_mc:MovieClip=new MovieClip();
trace(x_mc.x);
trace(x_mc['x']);
好處1.訪問的動態性:可以用變數名,屬性名,方法名保存在字串變數中,通過變數和陣列運算符就可以訪問屬性和方法;2.在嚴謹模式下,點語法可能會出錯;
23. 在if 中 “||”中,把最可能的條件放在前面,可減少條件的判斷次數;在if的“&&”的條件中,同理把最不可能的條件放在前面;
24. “!”運算符是對布林值取反;
var t:Boolean=true;
trace(!t);
25.for (變數 in 物件或陣列)與 for each(變數 in 物件或陣列)的區別是 前者的變數代表屬性名或者陣列索引,後者獲得的是屬性值或者陣列元素的值;
26.定義物件可以用
var object1:Object=new Object();
obje1.x=100;obje1.y=100;
或者 object1={x:100,y:100};
27.函數的參數可以是任何資料類型的變數;當使用簡單資料類型作為變數時,傳遞的是值;使用複雜資料類型作為變數時,傳遞的是引用(函數調用開始時,實參向形參進行了值的傳遞,函數調用結束時形參向實參進行了值傳遞)
28.在使用函數的默認參數功能時,默認參數必須是寫在所有必須參數的後面;
29.   Interactive類的contextMenu屬性用於右鍵功能表的創建;
30. this.numChildren;返回此物件的子實例數目
31.Graphics類不允許用戶自己創建實例,只有通過Shape或Sprite(MovieClip)來創建;首選Shape,如果需要圖形的交互時,再考慮Sprite或者MovieClip;
32.判斷顯示實例是否出現在舞臺上,可使用顯示實例的stage屬性;
trace(mc.stage);如果是null,則不在,否則的話,是[object Stage]
33.繪圖
繪製直線:
this.graphics.lineStyle(1);
this.graphics.moveTo(0,0);
this.graphics.lineTo(100,200);
繪製曲線:
this.graphics.lineStyle(1);
this.graphics.moveTo(0,0);
this.graphics.curveTo(100,0,100,100);//控制點的x和控制點的y,終點的x和終點的y;
繪製矩形:
   this.graphics.beginFill(0xFF9900,1);
   this.graphics.drawRect(0,0,50,100);
   this.graphics.endFill();

34.當創建一個flash文檔時,已經有了stage和root(this)2個實例;root(this)又是stage的實例;
35.用name屬性給實例賦實例名
var mc:Sprite=new Sprite();
mc.name="xxx";

36.使用parent屬性 可以訪問顯示列表中的上一級實例;
下一級引用:
getChildAt(index:int);
getChildByName(name:String);
通過點語法也可以訪問子級實例,要求是顯示列表中的實例都是動態類,可以有自定義的屬性(例如MovieClip)
37.深度可以理解成顯示實例的顯示層次,深度越大,顯示實例顯示的層次就越高;
38.getChildIndex(實例名);獲取實例的深度
39.交換深度的2種方法:
swapChildren(實例名1,實例名2);//通過引用來交換
swapChildrenAt(0,1);                      //通過深度來交換
40.移除所有子物件
for (var i:int=mc.numChildren-1;i>=0;i--) {
mc.removeChildAt(0);
}
41.mc.currentLabel 當前幀標籤 mc.currentFrame 當前幀
42.addFrameScript(index:int,fn);//幀數,函數
    移除addFrameScript(index:int,null); //移除在第index幀上的函數
43.使用LoaderInfo類的2種方式:通過DisplayObject類的loadinfo屬性來引用LoaderInfo類,或者通過Loader類的contentLoaderInfo屬性來引用;
this.loadInfo.addEventListener(...);
var loader:loader=new Loader();
loader.contentLoaderInfo.addEventListener(...);


函數體中的this一般指向定義函數的路徑

Animator類,選中動畫的全部幀-》右鍵-》【將動畫負值為AS3腳本】-》輸入實例名-》粘貼腳本;

事件流:1.捕獲階段:從頂部到目標;2.目標階段:目標;3.冒泡階段:從目標到頂部;
addEventListener的第三個參數,默認是false,表示沒有捕獲階段,只有目標階段和冒泡階段;(先偵聽目標事件,再偵聽冒泡階段的事件);
true:表示先有捕獲階段,再有目標階段(先偵聽捕獲階段的事件,再偵聽目標事件);
如果想同時使用捕獲階段和冒泡階段,則應該把事件註冊2次,第一次把useCapture設置true,第二次把useCature設置成false;
Event類的cancelable屬性表示默認行為能否被阻止;
a_txt.addEventListener(TextEvent.TEXT_INPUT,func);
function func(e:TextEvent) {
e.preventDefault(); //阻止文本輸入的事件
}


Event類的bubbles屬性表示是否可以使用冒泡機制;並非所有類都可以使用該機制;例如MouseEven類可以,Event類的complete事件不可以;
Event類的eventPhase屬性表示事件流的階段;1=捕獲階段;2=目標階段;3=冒泡階段;
target屬性在事件流的目標階段;currentTarget在事件流的冒泡,目標,捕獲階段;只有當事件流在目標階段,2者才是相同的;

mc1.mouseChildren=false;//mc1的子物件將不能處理滑鼠事件;

stopPropagation()停止事件流中當前節點以後的事件;stopImmediatePropagation()停止當前事件以後的所有事件;
function fn_1(e:MouseEvent) {
e.stopPropagation();
}

addEventListener(事件,函數,冒泡機制,次序,是否弱引用);如果在addEventListener內的函數不存在任何引用,那麼在弱引用的情況下,這個偵聽器會被垃圾回收器刪除
第二部分:Event類的事件:
Event.ACTIVATE 當播放器獲得系統的焦點時發生
Event.DEACTIVATE 當播放器失去系統的焦點時發生
Event.Added    當顯示實例添加子顯示實例或顯示實例被添加到父級顯示實例時發生;
var sp1=new Sprite();
sp1.addChild(sp2);
this.addChild(sp1);
Event.REMOVED 移除顯示實例的事件(查一下是否和Added類似);


過程參考:
this.addChild(sp1);
stage.addChild(sp1);
相當於先把sp1從root下刪除,觸發REMOVED事件,再把sp1添加到stage,觸發Added事件;

判斷顯示實例 是否在舞臺中,可以通過顯示實例的stage屬性來判斷,如果顯示實例沒有通過addChild()添加到顯示列表,說明顯示實例不在舞臺中,它的stage屬性是null;

Keyboard類的發起者一般是stage

在FLASH IDE下控制元件的座標,參照點是元件資訊面板上選擇的參照點,默認是元件中心點;控制元件縮放,參照點是元件中心點,也就是圓圈所在位置;使用AS控制元件的座標和縮放,參照點都是元件的註冊點,也就是元件上的十字標記

改變root的座標,root下的顯示實例的座標也會隨著改變。(stage的x,y不能被改變),所以,一般實例都是添加在root下面的;

stageX,stageY,滑鼠相對於stage的x,y座標;localX,localY,滑鼠相當於顯示實例的註冊點的x,y座標

mc.addEventListener(MouseEvent.CLICK,fn);

function fn(e:MouseEvent) {

trace(e.localX);//MouseEvent類的屬性
trace(e.stageX);//MouseEvent類的屬性
trace(stage.mouseX);//顯示實例的屬性--本地座標(DisplayObject實例的屬性)
}



在package中,如果要直接訪問屬性,需要在var 屬性名...之前加上public;
在var 和 function 前沒有加修飾符時,屬性或方法相當於被internal修飾,在同一包內可以調用;
另外,當局部變數和成員變數同時出現在類的方式中時,成員變數將會被隱藏;一般用this.成員變數來代表;
package {
public class Person{ //相當於public class Person extends Object 這是隱式繼承
public var names:String="sss"
static public var length:int=3 //靜態屬性,在類的內部,不能通過this.length調用,因為靜態屬性也就是類屬性,不通過實例來調用,在類內部可以通過length或者Person.length調用,在類外部通                               //過Person.length調用
public function p(names:String) {
   trace(this.names)
   this.names=names;
}

static function s() { //在函數體前加上static,表示是靜態方法;靜態方法只能訪問靜態屬性;實例方法可以對靜態屬性和實例屬性都可以訪問;
//靜態方法可以調用靜態方法,實例方法不能調用靜態方法
trace("aaa");
}
}
}
當類載入(import)的時候,會給類成員(類屬性和類方法---靜態屬性和靜態方法)分配一定的記憶體;當創建第一個實例,會給實例成員(實例屬性和實例方法)分配記憶體,當創建第二個實例,會給第二個實例的實例成員(實例屬性和實例方法)分配記憶體,但此時類成員不能再分配記憶體;因此可以理解類成員和實例成員相互訪問間的機制;

文檔類即是MainTimeline的實例;一般繼承Sprite(如果主時間軸只有一幀)或者MovieClip類(多幀);
當在主時間軸的幀中編寫代碼時,使用位於flash.*包內的類或函數,不需要進行導入,當使用了文檔類,則需要導入包

弧度=Math.atan2(y,x);//Y軸座標和X軸座標;角度/弧度=180/Math.PI;
2點間的距離:Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
Math.sin(弧度);Math.cos(弧度);利用sin,cos可計算X,Y軸的速度;
根據正余弦曲線可以做曲線運動;

Math.floor(x:Number)獲取數字的下限值;Math.round(x:Number)獲取數字的四捨五入值;

var p1:Point=new Point(100,200);
var p2:Point=new Point(100,200);
p1.length;獲取p1距離(0,0)的長度
Point.distance(p2,p1);獲取p2到p1的長度;
var line:Line=new Line(p1,p2);
line.K;直線的斜率((p1.y-p2.y)/(p1.x-p2.x));如果輸出的是Infinity,表示是90度
line.angle傾斜角
trace(line.A+":"+line.B+":"+line.C);相當於Ax+By+C=0;

兩直線的交點:
var line1:Line=new Line(new Point(0,0)),new Point(0,100));
var line2:Line=new Line(new Point(100,0)),new Point(0,50));
var p:Point=line1.pointOfIntersection(line2);
trace(p);

獲取影片剪輯的矩形實例
trace(mc.getBounds(this))   //包括筆觸
trace(mc.getRect(this)) //不包括筆觸
trace(mc.transform.pixelBounds) //帶筆觸的背景矩形
這3者獲得的x,y是以矩形的左上角為座標,而mc的x,y是以註冊點為座標的;


勻速運動:
位移+=速度;

加速度運動;
速度+=加速度;
位移+=速度;


彈性力運動:
加速度=(中間座標-物體座標)*係數;

形狀與形狀的碰撞檢測:mc1.hitTestObject(m2);//返回true或false
形狀與點   的碰撞檢測:mc1.hitTestPoint(X,Y);//返回true或false


trace(stage);//[object Stage]
trace(root);//[object MainTimeline]
trace(root.parent);//[object Stage]
trace(root.parent==stage);//true

as3.0改變了些方式,要取得web傳遞的參數需要使用loaderInfo.parameters[]方法。
如:web傳遞參數為:a.swf?n=benblog.cn
swf可先聲明一個變數程式碼
程式碼
varid:String;
id=loaderInfo.parameters["n"];
for(var w:int = 1;k < root.numChildren;k++){
    if(root.getChildAt(k).name == "FacemakerBt"){
        if (!root.getChildAt(k).hasEventListener(MouseEvent.CLICK)) {
            root.getChildAt(k).addEventListener(MouseEvent.CLICK, FacemakerUrlGo);
        }
    }
}
System.setClipboard(strContent); 複製內容到系統剪貼板
navigateToURL(new URLRequest("javascript:location.reload();"),"_self"); 刷新流覽器
navigateToURL(new URLRequest("http://www.5ga.cn"), "_blank"); 打開一新流覽器視窗
navigateToURL(new URLRequest("javascript:window.close()"),"_self"); 關閉流覽器
getQualifiedClassName(data) ;獲取資料類型
//例如取obj物件的the_name屬性,沒定義取會報錯,這樣就不會了
var the_name:String = new String();
//使用hasOwnProperty檢測這個屬性是否存在
if(obj.hasOwnProperty("the_name")){
    the_name = String(obj.the_name);
}
//在刪除監聽前先判斷,這樣更加安全了,而且可以把多設置的監聽都刪除了.
while(bt.hasEventListener(MouseEvent.CLICK)){
    bt.removeEventListener(MouseEvent.CLICK, bt_function);
}

隱藏由TAB產生的黃色焦點框(IE最小化然後最大化也會產生)
全局:
stage.stageFocusRect = false;
obj.focusRect = false;

獲取當前時間秒
**/
function getTimeSeconds() {
    now_date = new Date();
    now_seconds = now_date.getHours()*3600+now_date.getMinutes()*60+now_date.getSeconds();
    return now_seconds;
}
/**
* 獲取當前的時間毫秒
**/
function getTimeMilliseconds() {
    now_date = new Date();
    now_milliseconds = (now_date.getHours()*3600+now_date.getMinutes()*60+now_date.getSeconds())*1000+now_date.getMilliseconds();
    return now_milliseconds;
}
<style>
<!--
.tooltips:hover{
background:none; /*沒有這個在IE中不可用*/
}
.tooltips p{
display: none;
}
.tooltips:hover p{
display:block;
}
-->
</style>
<a href="#tooltips">這就是Tooltips<p>如你所見,這些附加的說明文字在滑鼠經過的時候顯示。</p></a>


var name_array:Array=["swf/a.swf","swf/b.swf","swf/c.swf","swf/d.swf"];//保存SWF名的陣列
var p:uint =new uint;//記住當前播放的是陣列中的第幾個SWF(指標從0開始)
var play_mc:MovieClip =new MovieClip;//當前播放的SWF
//--------------------------------------------------------
addChild(play_mc);
var swf_loader:Loader=new Loader;
var swf_urlloader:URLLoader =new URLLoader;
var swf_urlrequest:URLRequest =new URLRequest;
swf_urlloader.dataFormat =URLLoaderDataFormat.BINARY ;
//---------------------二進位載入SWF-------------------------
function swfLoad() {
     p=p<0?(name_array.length -1):p%=name_array.length ;
     try {
         swf_urlrequest.url =name_array[p];
         swf_urlloader.load(swf_urlrequest);
         swf_urlloader.addEventListener(Event.COMPLETE ,binaryLoadComplete);
     } catch (_err:Error) {
         trace(_err);
     }
}
function binaryLoadComplete(_evt:Event):void {
     //swf_loader=new Loader;
 
     swf_loader.loadBytes(_evt.target.data);
     swf_loader.contentLoaderInfo.addEventListener(Event.COMPLETE ,swfLoadComplete);
}
//------------------------載入完成------------------------
function swfLoadComplete(_evt:Event):void {
     removeChild(play_mc);
     play_mc=_evt.target.loader.content as MovieClip;
     play_mc.addEventListener(Event.ENTER_FRAME,onMcEnterFrame);
     swf_loader.unload ();
     addChild(play_mc);
}
//-----------------------檢測是否播放到最後一幀---------------
function onMcEnterFrame(_evt:Event):void {
     var _mc:MovieClip=_evt.target as MovieClip;
     if (_mc.currentFrame ==_mc.totalFrames ) {
         _mc.removeEventListener(Event.ENTER_FRAME,onMcEnterFrame);
         p++;
         swfLoad();
     }
     info_txt.text ="當前播放的是:"+name_array[p]+"   ( "+_mc.currentFrame +"/"+_mc.totalFrames +")";
}
//------------------------檢測按鈕事件 -----------------------
function onBtnClick(_evt:MouseEvent):void {
     var _btn:Button =_evt.target as Button;
     switch (_btn) {
         case prev_btn :
             p--;
             break;
         case next_btn :
             p++;
             break;
     }
     swfLoad();
}
prev_btn.addEventListener(MouseEvent.CLICK ,onBtnClick);
next_btn.addEventListener(MouseEvent.CLICK ,onBtnClick);
//----------------------默認載入第一個SWF-------------------
swfLoad();




stage.align=StageAlign.TOP_LEFT;
stage.scaleMode=StageScaleMode.NO_SCALE;
function setSize(_evt:Event):void {
     image.width=stage.stageWidth;
     image.scaleY=image.scaleX;
     if (image.height<stage.stageHeight) {
         image.height=stage.stageHeight;
         image.scaleX=image.scaleY;
     }
     image.x=(stage.stageWidth-image.width)*.5;
     image.y=(stage.stageHeight-image.height)*.5;
}
setSize(null);
stage.addEventListener(Event.RESIZE,setSize);


function goFullScreen():void {
stage.displayState=StageDisplayState.FULL_SCREEN ;
stage.scaleMode=StageScaleMode.NO_SCALE;
//stage.align = StageAlign.TOP_LEFT;
}
goFullScreen();


2009-09-24 17:12
var arr:Array=["aa","bb","cc","dd","bb","cc","aa","bb","gg","aa","cc"];
function formatX(arr:Array):Array {
var obj:Object={};
return arr.filter(function(item:*, index:int, array:Array):Boolean{
return !obj[item]?obj[item]=true:false
});
}
trace(formatX(arr))
//該方法的實現過程是 對於"aa"來講 obj["aa"]的值為undefined 而!undefined為true,就會返回該成員,然後 將obj["aa"]的值設為true,下一次遇到obj["aa"]時,obj["aa"]的值為true,!obj["aa"]的值就為false,就不返回該成員。


轉載至:http://blog.xuite.net/ylw0804/flash/34218617-學習ActionScript+3+筆記

留言

熱門文章