2011年12月5日 星期一

[AS3] 漸層動畫 ← 使用位元移動(bitwise)運算子拆解和組合RGB色碼

private function separateRGB(_color:uint):Object{
return {_r24:_color >> 16, _g24:_color >> 8 & 0xff, _b24:_color & 0xff};
}
private function combineRGB(_r24:uint,_g24:uint,_b24:uint):uint{
return _r24 << 16 | _g24 << 8 | _b24;
}

位元移動(bitwise)運算子,參考Flash Help以下連結
FlashPlatform_reference__運算子(operators) _●& bitwise AND 運算子 及其以下其它相關運算子


,拜讀奶綠茶的文章

位元移動與RGB - milkmidi Blog


2011年11月23日 星期三

[AS3] Graphics.beginGradientFill() → 漸層填色

Graphics.beginGradientFill()
public function beginGradientFill(type:String, colors:Array, alphas:Array, ratios:Array, matrix:Matrix = null, spreadMethod:String = "pad", interpolationMethod:String = "rgb", focalPointRatio:Number = 0):void

Matrix.createGradientBox()
public function createGradientBox(width:Number, height:Number, rotation:Number = 0, tx:Number = 0, ty:Number = 0):void

GradientType、SpreadMethod class
















[AS3] 殘影效果 → 加上 z 軸的 Tween












2011年11月22日 星期二

[AS3] 殘影效果 → 加上BlurFilter、GrowFilter慮鏡

GlowFilter(color:uint = 0xFF0000, alpha:Number = 1.0, blurX:Number = 6.0, blurY:Number = 6.0, strength:Number = 2, quality:int = 1, inner:Boolean = false, knockout:Boolean = false)
以指定的參數初始化新的 GlowFilter 實體。
BlurFilter(blurX:Number = 4.0, blurY:Number = 4.0, quality:int = 1)
以指定的參數初始化濾鏡。










[AS3] 殘影效果→Tween動畫路徑

BitmapData.colorTransform()
BitmapData.draw()
Tween()建構函式
public function Tween(obj:Object, prop:String, func:Function, begin:Number, finish:Number, duration:Number, useSeconds:Boolean = false)
建立 Tween 類別的實體。 可以使用建構函數並搭配 new 運算子:var myTween:Tween = new Tween()。


2011年11月21日 星期一

[AS3] 殘影效果拖曳_BitmapData.colorTransform()、draw()

BitmapData.colorTransform()
BitmapData.draw()


[AS3] BitmapData.colorTransform()方法_改變點陣影像指定區域顏色值


BitmapData.colorTransform(rect:Rectangle, colorTransform:flash.geom:ColorTransform):void
使用 ColorTransform 物件調整點陣圖影像指定區域中的顏色值。 如果矩形符合點陣圖影像的邊界,則此方法將會變化整個影像的顏色值。
參數
rect:Rectangle — 定義 ColorTransform 物件套用之影像區域的 Rectangle 物件。
colorTransform:flash.geom:ColorTransform — 用來說明要套用之顏色轉換值的 ColorTransform 物件。




2011年11月20日 星期日

[AS3] hitTestObject()_陸續產生500個紅色塊與500艘飛船的碰撞偵測與爆破、移除、記憶體回收

多對多碰撞的物件導向一對一偵測,不使用陣列

2011年11月13日 星期日

[jQuery] css()、text()

2011年11月12日 星期六

[jQuery] toggle(speed,callback)



<a href=# id="toggleBtn"><span style="font-size: large;">
Click me !!!</span></a>

<div id="info1">
<span style="font-size: large;">來去洗澡 !!!</span></div>

<div id="info2">來去吃飯 !!!

</div>

<script>
$(document).ready(function(){
$('#info1').hide();
$('#toggleBtn').click(function(){
$('#info1').toggle('slow', function(){
$('#info2').toggle('fast');
});
});
});
</script>

[AS3] 簡易ScrollBar

1001111_customScrobar_1.swf


fla下載

Main.as......
package  {
 
 import flash.display.MovieClip;
 import flash.events.MouseEvent;
 import flash.geom.Rectangle;
 import caurina.transitions.*;
 import flash.events.Event;
 
 public class Main extends MovieClip {
  
  public var container:MovieClip;
  public var displayZone:MovieClip;
  public var track:MovieClip;
  public var slider:MovieClip;
  private var bounds:Rectangle;
  private var minScrollValue:Number;
  private var maxScrollValue:Number;
  private var initPOsY:Number;
  
  public function Main() {
   this.initial();
   this.setListener();
   return;
  }
  
  private function initial():void{
   this.initPOsY = this.container.y;
   this.minScrollValue = 0;
   this.maxScrollValue = this.track.height-this.slider.height;
   this.bounds = new Rectangle(this.track.x, this.track.y, this.minScrollValue, this.maxScrollValue);
   this.container.mask = this.displayZone;
   return;
  }
  
  private function setListener():void{
   this.slider.addEventListener(MouseEvent.MOUSE_DOWN,dragHandler);
   this.stage.addEventListener(MouseEvent.MOUSE_UP,dragHandler);
   this.addEventListener(Event.ENTER_FRAME,scrollcontent);
   return;
  }
  
  private function dragHandler(event:MouseEvent):void{
   /*trace(event.type);*/
   switch(event.type){
    case "mouseDown":
     this.slider.startDrag(false,bounds);
    break;
    case "mouseUp":
     this.slider.stopDrag();
    break;
    default:
    break;
   }
   return;
  }
  
  private function scrollcontent(event:Event):void{
   var _percent:Number = (this.slider.y-this.track.y)/(maxScrollValue);
   /*trace("_percent : " + _percent);*/
   Tweener.addTween(this.container,{y:(this.initPOsY - _percent*(this.container.height-this.displayZone.height)),time:1});
   return;
  }
 }
}

2011年11月9日 星期三

[pHOTOsHOP]作圖:FLASH



2011年11月7日 星期一

Chrome瀏覽器 + 從iframe裡調用父視窗裡的函數

我們理解通常可使用「window.parent.函數()」在iframe裡調用父視窗的某個函數
但在作業平台的檔案系統,以Google Chrome瀏覽器預覽HTML,卻總是發現無法如IE、FF、Opera、Safari瀏覽器正常運作。
例如,file:///C:/mypages/mainPage.html

百思不得其解之後,終於發現:
問題其實出在Chrome不允許在檔案系統中使用 parent 參照父視窗。
但在web server下,「window.parent.函數()」則可如常運作。
例如,http://localhost/mypages/mainPage.html




2011年10月30日 星期日

HTML5 DOM__※CanvasRenderingContext2D.arc()

CanvasRenderingContext2D.arc()
arc(x, y, radius, startAngle, endAngle, counterclockwise)





HTML5_canvas_drawImage()_在canvas上繪製外部jpg點陣圖






< !DOCTYPE HTML>
< html>
< head>
< meta charset="utf-8">
< title>無標題文件< /title>
< style type="text/css">
#canvas1 {
 color: #000000;
 font-size: 100px;
 background-color: #000000;
 border: medium dotted #ffffff;
}
body {
 background-color: #000000;
}
< /style>< /head>

< body>

< canvas id="canvas1" width="550" height="400">< /canvas>
< script language="javascript">
//
var canvas = document.getElementById("canvas1");
var context = canvas.getContext("2d");
//
var image = new Image();
image.onload = function(){
 context.drawImage(image,0,0,canvas.width,canvas.height);
};
image.src = "nv007-001a.jpg";
< /script>

< /body>
< /html>

2011年10月29日 星期六

Graphics.beginBitmapFill()方法 - 以點陣圖影像填滿繪圖區(拼貼) + Matrix物件旋轉點陣圖

beginBitmapFill(bitmap:BitmapData, matrix:Matrix = null, repeat:Boolean = true, smooth:Boolean = false):void
以點陣圖影像填滿繪圖區。

apFill_1.swf


//
var bmd:BitmapData = new MyPhoto(0, 0);
//
var myMatrix:Matrix = new Matrix();
//旋轉60度,但需轉換為弧度
var angle:Number = 60*Math.PI/180;
/*with(myMatrix){
 //以下四行為旋轉屬性,與使用rotate屬性相同
 a = Math.cos(angle);
 b = Math.sin(angle);
 c = -Math.sin(angle);
 d = Math.cos(angle);
}*/
/*以下隱藏為使用Matrix的rotate屬性*/
myMatrix.rotate(60*Math.PI/180);

//
var mySH:Shape = new Shape();
//
var myGH:Graphics = mySH.graphics;
//
with(myGH){
 lineStyle(4, 0x000055);
 //
 beginBitmapFill(bmd, myMatrix, true, true);
 //
 drawRect(0, 0, 600, 600);
 endFill()
}
//
mySH.x = 0;
mySH.y = 0;
//
addChild(mySH);

2011年10月28日 星期五

HTML5__canvas標籤

< canvas id="canvas1" width="550" height="400">< /canvas>
var canvas = document.getElementById("canvas1");
var context = canvas.getContext("2d");
context.fillStyle = "#aabbff";
context.fillRect(100,100,100,100)
context.fillStyle = "#ffffff";
context.fillText("Hello World!!!",150,130);

HTML 5 新增 < canvas> 標籤。
藉由JavaScript 操作 HTML DOM CanvasRenderingContext2D 對象所提供的一組繪圖 API,
達到在畫布上繪圖的目的。

A.在html5中加入標籤:
< canvas height="400" id="canvas1" width="550">< /canvas>

B.取得canvas 畫布的參照:
var canvas = document.getElementById("canvas1");

C.取得 Context 繪圖環境的參照:
var context = canvas.getContext("2d");
這即是取得 CanvasRenderingContext2D 對象的參照
CanvasRenderingContext2D 對象提供了一組豐富而可在畫布上繪圖的圖形函數。





< !DOCTYPE HTML>
< html>
< head>
< meta charset="utf-8">
< title>無標題文件< /title>
< style type="text/css">
#canvas1 {
 color: #000000;
 font-size: 100px;
 background-color: #FC0;
 border: medium dotted #036;
}

< /style>< /head>

< body>
< canvas id="canvas1" width="550" height="400">< /canvas>
< script language="javascript">
//
var canvas = document.getElementById("canvas1");
var context = canvas.getContext("2d");
//
context.fillStyle = "#aabbff";
context.fillRect(100,100,100,100)
context.fillStyle = "#ffffff";
context.fillText("Hello World!!!",150,130);

< /script>

< /body>
< /html>

2011年10月25日 星期二

HTML5+JS_小動畫實驗


HTML5+JS_小動畫實驗

2011年10月24日 星期一

[PhotoShop] 製作3D球體,載入拼圖紋理


PhotoShop繁體中文語系檔

繁體中文版 PhotoShop CS5.5 可從以下路徑找到繁體中文語系檔 tw10428.dat
C:\Program Files\Adobe\Adobe Photoshop CS5.1\Locales\zh_TW\Support Files
將 tw10428.dat 暫時變換名稱,重新啟動 Photoshop,就變成英文版了。
當然,回復為 tw10428.dat 檔名後,Photoshop 也會回歸繁體中文版。




PhotoShop混色模式[中英]名稱對照



2011年9月2日 星期五

[AS3] 同步錯誤與非同步錯誤事件處理

同步錯誤事件 - 可用try..catch陳述式處理
處理應用程式中的同步錯誤


非同步錯誤事件 - 偵聽IOErrorEvent.IO_ERROR事件
ErrorEvent 類別及其子類別所包含的錯誤類型,可用來處理 Flash 執行階段在嘗試讀取或寫入資料時所傳送的錯誤。




[AS3] 一些有IO_ERROR事件型態的類別

2011年8月26日 星期五

[AS3] Security.showSettings()__啟動「Flash Player 設定」面板


flash.system.Security.showSettings()

//顯示使用者最後一次關閉「Flash Player 設定」時所開啟的面板
//Security.showSettings("default");
Security.showSettings(SecurityPanel.DEFAULT);

//顯示「Flash Player 設定」中的「攝影機」面板
//Security.showSettings("camera");
Security.showSettings(SecurityPanel.CAMERA);

//顯示「Flash Player 設定」中的「麥克風」面板
//Security.showSettings("microphone");
Security.showSettings(SecurityPanel.MICROPHONE);

//顯示「Flash Player 設定」中的「顯示」面板
//Security.showSettings("display");
Security.showSettings(SecurityPanel.DISPLAY);

//顯示「Flash Player 設定」中的「本機儲存設定」面板
//Security.showSettings("localStorage");
Security.showSettings(SecurityPanel.LOCAL_STORAGE);

//顯示「Flash Player 設定」中的「隱私權設定」面板
//Security.showSettings("privacy");
Security.showSettings(SecurityPanel.PRIVACY);

//在不同的瀏覽器視窗中顯示「設定管理員」
/*Security.showSettings("settingsManager");*/
Security.showSettings(SecurityPanel.SETTINGS_MANAGER);

2011年8月24日 星期三

AIR Debug Launcher (ADL) 應用程式

AIR Debug Launcher (ADL) 應用程式

2011年8月15日 星期一

[AS3] 讀取作業系統剪貼簿

flash.desktop.ClipboardFormats

package System {
package System {
 
 import flash.display.MovieClip;
 import flash.desktop.ClipboardFormats;

 public class setClipboard_1000815 extends MovieClip {
  
  public function setClipboard_1000815() {
   /*讀取作業系統剪貼簿*/
   var clipboardData:String  = 
Clipboard.generalClipboard.getData(ClipboardFormats.TEXT_FORMAT) as String;
  }
 }
}

2011年8月12日 星期五

[AS3] flash.sampler套件 - getSize()函數__取得不同顯示物件記憶體使用量

flash.sampler套件__●getSize()函數
getSize()函數會顯示物件所耗用的記憶體位元組。

選擇適當的顯示物件類型,有助於限制記意體使用量。
Shape - 非互動的簡單形狀
Sprite - 不需時間軸的互動物件
MovieClip - 如需使用時間軸的動畫

package  {
	
	import flash.display.MovieClip;
	import flash.display.Shape;
	import flash.sampler.getSize;
	import flash.display.Sprite;
	
	public class Main extends MovieClip {
		
		public function Main() {
			trace(getSize(new Shape())); //236
			trace(getSize(new Sprite())); //408
			trace(getSize(new MovieClip())); //444
			return;
		}
	}
	
}

2011年8月11日 星期四

[AS3] 將 [SWF()] 中繼資料標籤套用至根文件類別,設定影格速率、寬、高、背景色...

package  {
	
	import flash.display.MovieClip;
	
	[SWF(frameRate="24", width="1024", height="600", backgroundColor="#666666")]
	public class Main extends MovieClip {
		
		public function Main() {
			trace('[SWF(frameRate="24", width="1024", height="600", 
                              backgroundColor="#666666")]');
		}
	}
	
}


2011年8月6日 星期六

[AS3] flash.media.StageVideo

2011年7月19日 星期二

[AS3] 命名空間namespace及小實例

※ 應將public、private、protected、internal存取控制指定字視為內建的命名空間。
※ 命名空間可控制方法和屬性的能見度。
※ 屬性和方法的名稱永遠包含識別名稱和命名空間。只要定義之前未有命名空間特質,預設就會以internal命名空間加以限定。(只有在相同套件內的呼叫者才看得見)

※ 使用命名空間三個基本步驟:

(A) 定義命名空間:使用 namespace 關鍵字來定義命名空間
//使用public讓其它套件的程式碼獲取namespaceExample命名空間的可見度
package  example{
public namespace namespaceExample;
}


(B) 套用命名空間:
namespaceExample function doJob():void{}


(C) 參考命名空間
  1.  use namespace 指令參考命名空間
    use namespace namespaceExample;

    var counterAddition:CounterAddition = new CounterAddition();

    counterAddition.doJob(1,2);

    trace(counterAddition.getAnswer);

  2. 或 使用名稱修飾語 (::) 標點符號
    var counterAddition:CounterAddition = new CounterAddition();

    counterAddition.namespaceExample::doJob(1,2);

    trace(counterAddition.namespaceExample::getAnswer);


※ 命名空間namespace小小實例
當public、private、protected、internal四個存取控制指定子的存取權限不符合使用,比如說有一些「方法」分散在不同套件的類別裡,若想讓所有套件都可以存取,但又不想讓這些方法變成公用方法,此時就可透過建立命名空間namespace,做為自定義的特殊存取控制指定子。以下例子將不同套件內的類別方法,整合到相同的命名空間中,透過參照命名空間的use namespace陳述式,或名稱修飾語 (::) 標點符號可調用這些方法。


下圖為檔案結構:



1000718_namespaceT1.fla





//namespaceExample.as
package  example{
public namespace namespaceExample;
}


//CounterAddition.as
package  example.addition{
import example.namespaceExample;
public class CounterAddition  {
public var answer:Number;
public function CounterAddition() {
return;
}
namespaceExample function doJob(_a:Number,_b:Number):void{
this.answer = _a + _b;
return;
}
namespaceExample function get getAnswer():Number{
return this.answer;
}
}
}


CounterSubtraction.as
package example.subtraction {
import example.namespaceExample;
public class CounterSubtraction {
public var answer:Number;
public function CounterSubtraction() {
return;
}
namespaceExample function doJob(_a:Number,_b:Number):void{
this.answer = _a - _b;
return;
}
namespaceExample function get getAnswer():Number{
return this.answer;
}
}
}


NamespaceT1_1000718.as
package  {
import flash.display.MovieClip;
import example.namespaceExample;
import example.addition.CounterAddition;
import example.subtraction.CounterSubtraction;

public class NamespaceT1_1000718 extends MovieClip {
public function NamespaceT1_1000718() {
var counterAddition:CounterAddition = new CounterAddition();
counterAddition.namespaceExample::doJob(1,2);
trace(counterAddition.namespaceExample::getAnswer);
var counterSubtraction:CounterSubtraction = new CounterSubtraction();
counterSubtraction.namespaceExample::doJob(3,1);
trace(counterSubtraction.namespaceExample::getAnswer);
/*use namespace namespaceExample;
var counterAddition:CounterAddition = new CounterAddition();
counterAddition.doJob(1,2);
trace(counterAddition.getAnswer);
var counterSubtraction:CounterSubtraction = new CounterSubtraction();
counterSubtraction.doJob(3,1);
trace(counterSubtraction.getAnswer);*/
return;
}
}
}







Download

[AS3] 變數範圍之「升舉」技術

AS3變數有一個叫做「升舉」的技術,允許在變數宣告之前,讀取或寫入變數。
透過此項技術,編譯器會將變數宣告移至函數的最上層


但編譯器並不會升舉任何指定陳述式
只升舉宣告變數的部份,但不會升舉指定值給變數的部份。

(例一)

trace(num); //trace得NaN,NaN是Number型別的預設值,代表num已經宣告,但尚未初始化(賦值)
var num:Number = 100;
trace(num); //100
trace("**********************");

trace(str); //null
var str:String = "Hello";
trace(str); //Hello
trace("**********************");

aUint = 66;
trace(aUint); //66,先賦值,底下才宣告,透過「升舉」,var aUint:uint的宣告被移到最上方
var aUint:uint = 99;
trace(aUint); //99















(例二)

trace(mc); //null ←Object型別的預設值(代表mc此時已升舉宣告)
myFunc();

function myFunc():void{
trace("myFunc !!!"); //myFunc !!!
mc = new MyObject();
trace(mc); //[object MyObject]
}

var mc:Object;
trace(mc); //[object MyObject]



將(例二)修改如以下:

trace(mc); //null ←Object型別的預設值(代表mc此時已升舉宣告)(但指定賦值部份並未被升舉)
myFunc();

function myFunc():void{
trace("myFunc !!!"); //myFunc !!!
trace(mc); //null
}

var mc:Object = new MyObject();
trace(mc); //[object MyObject]







2011年7月18日 星期一

[AS3] 變數預設值


※ 以var陳述式宣告變數之後,初始化賦值之前,變數依其宣告時之資料型態會有不同之預設值。
※ 未初始化的變數依其資料型態不同所包含預設值,如下:





資料類型
預設值
Boolean
false
int
0
Number
NaN
Object
null
String
null
uint
0
未宣告 (相當於類型註釋 *)
undefined
所有其它類別,包括使用者定義的類別。
null


變數宣告為 Boolean、Number、int 和 uint 以外的資料類型,其未初始化的預設值都是 null
不論AS3定義或自訂義的類別皆如此。
未宣告資料類型 (相當於類型註釋 *)則為undefined

2011年7月17日 星期日

函數運算式的特性


學習 ActionScript 3.0 / ActionScript 語言和語法 / 函數

適用於 Adobe  Flash  Professional CS5 的 ActionScript  3.0 參考__最上層__●Function

一、函數運算式有時又稱為函數常值或匿名函數
二、var 函數名稱:Function = function(參數,...){函數主體}
三、函數運算式不能獨自存在,通常是指定陳述式的一部分
四、在嚴謹模式中,不能使用點語法叫用函數運算式宣告的方法
五、函數運算式更適合用來進行著重執行階段或動態行為方式的程式設計
六、若偏好使用嚴謹模式,但也需要呼叫用函數運算式宣告的方法 :
A. 使用方括號 ([]) 而不使用點 (.) 運算子來呼叫方法,如,myInstance["methodExpression()"]();
B. 將整個類別宣告為動態類別,這樣可以讓您使用點運算子呼叫方法
七、在特定情況下,函數運算式很有用。函數運算式的其中一個常用用法,就是供只用一次就捨棄的函數使用
八、在記憶體管理和記憶體回收方面,函數運算式不會做為物件獨立存在。換句話說,當您將函數運算式指定至另一個物件 (例如陣列元素或物件屬性) 時,您在程式碼中建立該函數運算式的唯一參考。若函數運算式所附加的陣列或物件超出範圍,或是因其它原因無法再使用,您無法再存取該函數運算式。若刪除該陣列或物件,函數運算式所使用的記憶體可供進行記憶體回收,也就是說,該記憶體可開始回收,重新做為其它用途。
九、就函數運算式而言,一旦刪除了運算式所指定的屬性,就不能再使用該函數 (delete)
十、如果函數先用函數陳述式加以定義,則可以做為自身的物件而存在,而且即使刪除所附加的屬性之後,也會繼續存在。delete 運算子只會針對物件的屬性作用,因此即使是刪除函數 stateFunc() 本身的呼叫也沒有作用。
十一、函數陳述式在所定義的範圍中一直都存在,包括出現在函數陳述式之前的陳述式中。對照之下,函數運算式則只為後續陳述式定義。函數運算式在定義之前無法使用。

2011年7月16日 星期六

動態產生函數運算式及以Delete刪除

※ 動態建立函數運算式,以trace()觀察this在函數運算式內部與外部的不同
※ 對於繫結方法,this 關鍵字會指向實作該方法的原始物件。 對於函數來說,this 則會在叫用該函數時指向關聯物件。
※ 此例,在top.aFunc 函數運算式內部trace(this)則this指向top的類別物件[object MovieClip] ; trace(this.name)則指向top的name屬性topMC ; 在top.aFunc 函數運算式外部trace(this)則指向[object MainTimeline]
※ 動態產生的函數可被delete刪除
在元件庫內,AAA是個圓形MovieClip,綁定AAA內建資源類別

1000715_function_test_1.swf


var top:MovieClip = addChild(new MovieClip()) as MovieClip;
top.name = "topMC";

/*動態建立函式運算式*/
top.aFunc = function():DisplayObject{
trace("----------------------------------");
trace("@@@在top.aFunc()之內的trace");

/*以下這兩行雖然是trace(),但都會先new出AAA的實體,再trace出來*/
trace("@top.aFunc() / addChild(new AAA()) : " + addChild(new AAA())); //[object AAA]
trace("@top.aFunc() / getQualifiedClassName(addChild(new AAA())) : " + getQualifiedClassName(addChild(new AAA()))); //AAA

/*1118: 靜態類型 flash.display:DisplayObject 的值
以隱含方式強制轉型成可能不相關的類型 AAA。*/
/*var aaa:AAA = addChild(new AAA());*/

/*以下這行可以*/
/*var aaa:AAA = addChild(new AAA()) as AAA;*/

var aaa:AAA = this["addChild"](new AAA());
aaa.x=aaa.y=200;

/*this 會在此函數(top.aFunc()函數) 被叫用時,指向關聯物件*/
/*top.aFunc()函數 - 動態建立給top實體的函數運算式*/
trace("@top.aFunc() / this : " + this); /*[object MovieClip]*/
trace("@top.aFunc() / this.name : " + this.name); //topMC
trace("@top.aFunc() / getQualifiedClassName(this) : " + getQualifiedClassName(this)); //flash.display::MovieClip
trace("@top.aFunc() / getQualifiedSuperclassName(this) : " + getQualifiedSuperclassName(this)); //flash.display::Sprite
trace("----------------------------------");

return aaa;
}


trace("----------------------------------");
trace("@@@在top.aFunc()之外的trace");
trace("@this : " + this); //[object MainTimeline]
trace("@this.name : " + this.name); //root1
trace("getQualifiedClassName(this) : " + getQualifiedClassName(this)); //_1000715_function_test_1_fla::MainTimeline
trace("getQualifiedSuperclassName(this) : " + getQualifiedSuperclassName(this)); //flash.display::MovieClip
trace("----------------------------------");

trace("top.aFunc : " + top.aFunc); //function Function() {}
/*在以下這行會先調用了top.aFunc(),之後才trace出來*/
trace("※※※top.aFunc() : " + top.aFunc()); //[object AAA]
/*top.aFunc();*/
trace("----------------------------------");

/*delete 動態產生的top.aFunc 函數運算式*/
delete top.aFunc;
trace("@@@在delete top.aFunc之後的trace");
/*top.aFunc = null;*/
trace("top.aFunc : " + top.aFunc); //undefined
/*底下這行會先調用top.aFunc(),之後再trace出來*/
trace("top.aFunc() : " + top.aFunc()); //TypeError: Error #1006: aFunc 不是函數。at _1000715_function_test_1_fla::MainTimeline/frame1()
/*top.aFunc();*/

2011年7月15日 星期五

文字欄位的捲動_TextField.scrollV

TextField.scrollV
垂直捲動的單位是字行,水平捲動的單位則是像素。 如果顯示的第一個字行是文字欄位中的第一個字行,scrollV 便會設定為 1 (而非 0)。
URLLoader.load()方法
public function load(request:URLRequest):void
從指定的 URL 傳送並載入資料。根據 dataFormat 屬性值,能以文字、原始二進位資料或 URL 編碼之變數的形式接收此資料。dataFormat 屬性的預設值為文字。
bottomScrollV屬性
bottomScrollV:int [唯讀]
整數 (從 1 開始的索引),指出目前在指定之文字欄位中,可以看見的最底端字行。 將文字欄位視為文字區塊上的視窗。 scrollV 屬性是視窗中,最頂端之可見字行的索引 (從 1 開始)。
在文字欄位中,scrollV 與 bottomScrollV 字行間的所有文字目前都是可見的。

※ 載入外部文字檔,由TextField讀取,倆顆按鈕控制向下和向上捲動文字行

1000714_TextField.scrollV.swf


package  {
 
 import flash.display.MovieClip;
 import flash.text.TextField;
 import flash.net.URLRequest;
 import flash.net.URLLoader;
 import flash.events.Event;
 import flash.display.SimpleButton;
 import flash.events.MouseEvent;
 import flash.display.DisplayObject;
 import flash.net.URLLoaderDataFormat;
 import flash.events.IOErrorEvent;
 import flash.errors.IOError;

 public class Main extends MovieClip {
  
  public var dynTF:TextField;
  public var str:String;
  public var nextBtn:SimpleButton;
  public var preBtn:SimpleButton;
  
  public function Main() {
   this.initURLLoader();
   
   /*滑鼠滾輪開關*/
   /*Boolean 值,指出當使用者按一下文字欄位並滾動滑鼠滾輪時,Flash Player 是否會自動捲動多行文字欄位。
   根據預設,這個值為 true。 如果想要防止滑鼠滾輪捲動文字欄位,或實作您自己的文字欄位捲動,這個屬性就會很有用。*/
   this.dynTF.mouseWheelEnabled = true;
   
   this.nextBtn.addEventListener(MouseEvent.MOUSE_DOWN,readNextLOOP);
   this.nextBtn.addEventListener(MouseEvent.MOUSE_UP,removeReadNextLOOP);
   this.preBtn.addEventListener(MouseEvent.MOUSE_DOWN,readPreLOOP);
   this.preBtn.addEventListener(MouseEvent.MOUSE_UP,removeReadPreLOOP);
   return;
  }
  
  private function initURLLoader():void{
   var urlReq:URLRequest = new URLRequest("http://dl.dropbox.com/s/y0eun5z88xxqw5e/1000714_TextField.scrollV_textStr2.txt");
   var urlLoader:URLLoader = new URLLoader();
   /**/
   urlLoader.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
   /**/
   urlLoader.dataFormat = URLLoaderDataFormat.TEXT;
   urlLoader.addEventListener(Event.COMPLETE,readData);
   /**/
   try{
    urlLoader.load(urlReq);
   }catch(error:Error){
    trace("Unable to load requested document.");
   }
   
   return;
  }
    
  private function readData(event:Event):void{
   var tmpLoader:URLLoader = event.currentTarget as URLLoader;
   /*this.str = tmpLoader.data.split("\r\n").join("\n");*/
   this.str = tmpLoader.data;
   trace(this.str);
   showText();
   return;
  }
  
  private function showText():void{
   this.dynTF.htmlText = this.str;
   trace("this.dynTF.maxScrollV : " + this.dynTF.maxScrollV);
   trace("this.dynTF.scrollV : " + this.dynTF.scrollV );
   trace("this.dynTF.bottomScrollV : " + this.dynTF.bottomScrollV );
   return;
  }
  
  private function readNextLOOP(event:MouseEvent):void{
   this.addEventListener(Event.ENTER_FRAME,this.readNext);
   return;
  }
  
  private function removeReadNextLOOP(event:MouseEvent):void{
   this.removeEventListener(Event.ENTER_FRAME,this.readNext);
   return;
  }
  
  private function readNext(event:Event):void{
   this.dynTF.scrollV += 1;
   trace("this.dynTF.scrollV : " + this.dynTF.scrollV );
   trace("this.dynTF.bottomScrollV : " + this.dynTF.bottomScrollV );
   return;
  }
  
  private function readPreLOOP(event:MouseEvent):void{
   this.addEventListener(Event.ENTER_FRAME,this.readPre);
   return;
  }
  
  private function removeReadPreLOOP(event:MouseEvent):void{
   this.removeEventListener(Event.ENTER_FRAME,this.readPre);
   return;
  }
  
  private function readPre(event:Event):void{
   this.dynTF.scrollV -= 1;
   trace("this.dynTF.scrollV : " + this.dynTF.scrollV);
   trace("this.dynTF.bottomScrollV : " + this.dynTF.bottomScrollV );
   return;
  }
  
  private function tween1(_targetObject:DisplayObject,_now:Number,_new:Number):void {
   return;
  }
  
  /**/
  private function ioErrorHandler(e:IOErrorEvent):void{
   trace("ioErroerHandler : " + e);
   return;
  }
 }
 
}

2011年6月23日 星期四

Flash執行階段錯誤

適用於 Adobe® Flash® Platform 的 ActionScript® 3.0 參考
下列是可能在執行階段發生的錯誤。
無論您在嚴謹模式或警告模式中進行編譯,ActionScript 3.0 都會進行執行階段類型檢查。

執行階段錯誤




2011年6月22日 星期三

載入外部swf__父層子層雙向取用類別定義

LoaderContext()建構函式
public function LoaderContext(checkPolicyFile:Boolean = false, applicationDomain:ApplicationDomain = null, securityDomain:SecurityDomain = null)

getDefinitionByName()全域函數
public function getDefinitionByName(name:String):Object
會傳回 name 參數所指定之類別的類別物件參照。
參數
name:String — 類別的名稱。
傳回值
Object — 會傳回 name 參數所指定之類別的類別物件參照

※ 本例著眼於 main.swf 載入外部 child.swf,透過LoaderContext類別物件予以設定,則child.swf 中所有的ActionScript 3定義,同時將被載入至main.swf所在的目前應用程式網域,並能被main.swf所取用。事實上,child.swf 中的ActionScript 3定義被合併至main.swf所在的目前應用程式網域,導致main.swf與child.swf 彼此擁有對方類別定義的能見度。


※ main.swf 載入child.swf 之後,可調用child.swf 的Child 類別裡的 weicom()方法。
而,child.swf 則可調用 Main 類別裡的 hello()方法,與 Ball 類別裡的 ballFunc()方法。





※ 這個測試,將main.swf及child.swf隔開在兩個不同的套件根目錄中,以避免相同套件內的存取造成誤判。










Main.as
package  {
 
 import flash.display.Loader;
 import flash.display.Sprite;
 import flash.events.*;
 import flash.events.EventDispatcher;
 import flash.net.URLRequest;
 import flash.system.LoaderContext;
 import flash.system.ApplicationDomain;
 import flash.display.MovieClip;
 import flash.display.LoaderInfo;
 import flash.utils.getDefinitionByName;

 public class Main extends Sprite {
  
  public static const LOADED:String = "loaded";
  public var testVar:String;
  private var ldr:Loader;
  
  public function Main() {
   this.testVar = "abc";
   ldr = new Loader();
   var req:URLRequest = new URLRequest("../external/Child.swf");
   
   /*透過LoaderContext 指定 - 將外部Child.swf的公用類別定義載入到目前應用程式網域*/
   /* ***藉由將載入的 SWF 檔置於相同的應用程式網域中,便可以直接存取其類別。*** */
   var ldrContext:LoaderContext = new LoaderContext(false,ApplicationDomain.currentDomain);
   ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
   ldr.load(req,ldrContext);
  }

  private function completeHandler(event:Event=null):void {
   trace("@Main / completeHandler() / event.target.content : " + event.target.content);
   
   /*A法 : 使用ApplicationDomain.currentDomain.getDefinition()方法*/
   /*取得Child的類別參照,調用其建構式*/
   /*var getClass:Class = ApplicationDomain.currentDomain.getDefinition("Child") as Class;
   trace("@Main / completeHandler / getClass : " + getClass);*/
   
   /*B法 : 使用getDefinitionByName(name:String):Object*/ 
   /*public function getDefinitionByName(name:String):Object*/
   /*傳回 name 參數所指定之類別的類別物件參照*/
   /*參數   name:String — 類別的名稱。*/
   /*傳回值   Object — 會傳回 name 參數所指定之類別的類別物件參照。*/
   /*使用getDefinitionByName()函數,取得Child的類別參照,代表子層類別可見度ok*/
   var getClass:Class = getDefinitionByName("Child") as Class;
   trace("@Main / completeHandler / getClass : " + getClass);
   
   /*載入完成後, 建構一個Child類別實體, 指定給childObj - B法*/
   var childObj:* = new getClass();
   this.addChild(childObj);
   
   /*載入完成後發送自訂事件*/
   var loadedEvent:Event = new Event(LOADED);
   childObj.dispatchEvent(loadedEvent);
   trace("@Main / completeHandler() / this.dispatchEvent(loadedEvent) : " + this.dispatchEvent(loadedEvent));
   
   /*調用childObj實體的welcome()方法, */
   var message:String = childObj.welcome("Alice");
   trace("***********************************");
   trace("從Main調用Child的welcome()方法 - 以下這行");
   trace(message);
   trace("***********************************");
   return;
  }
  
  public function hello():String{
   var helloMessage:String = "@Main : Hello!!! Baby!!!";
   return helloMessage;
  }
 }
}



Child.as
package {

 import flash.display.Sprite;
 import flash.events.Event;
 import flash.system.ApplicationDomain;
 import flash.utils.getDefinitionByName;
 
 public class Child extends Sprite {
  
  public var getMainClass:Class;
  
  public function Child() { 
   if(ApplicationDomain.currentDomain.hasDefinition("Main")){
    /*A法 : 使用 ApplicationDomain.currentDomain.getDefinition()方法*/
    /*this.getMainClass = ApplicationDomain.currentDomain.getDefinition("Main") as Class;*/
    
    /*B法 : 使用getDefinitionByName(name:String):Object,取得Main的類別參照,代表父層類別可見度ok*/
    this.getMainClass = getDefinitionByName("Main") as Class;
    
    trace("@Child / Child() / getMainClass : " + this.getMainClass);
    this.monitor();
   }
   return;
  }
  
  public function monitor():void{
   /*偵聽Main.LOADED 之載入完成事件*/
   this.addEventListener(getMainClass.LOADED,loadedHandler);
   this.addEventListener(Event.ADDED_TO_STAGE,addedToStage);
   return;
  }
  
  public function loadedHandler(event:Event):void{
   this.removeEventListener(getMainClass.LOADED,loadedHandler);
   trace("@Child / loadedHandler() / event.type : " + event.type);
   
   /*取得父類別實體*/
   var myParent:* = getMainClass(this.parent);
   trace("@Child / loadedHandler() / myParent : " + myParent);
   
   /*調用Main的hello()方法*/
   trace("***********************************");
   trace("從Child調用Main的hello()方法 - 以下這行");
   var message:String = myParent.hello();
   trace(message);
   trace("***********************************");
   
   /*A法 : 使用 ApplicationDomain.currentDomain.getDefinition()方法*/
   /*取得Ball的類別參照,調用其建構式*/
   /*var getBallClass:Class = ApplicationDomain.currentDomain.getDefinition("Ball") as Class;*/
   
   /*B法 : 使用getDefinitionByName(name:String):Object,取得Ball的類別參照,代表父層類別可見度ok*/
   var getBallClass:Class = getDefinitionByName("Ball") as Class
   
   trace("@Child / loadedHandler() / getBallClass : " + getBallClass);
   var myParentBall:* = new getBallClass(160,200);
   trace("@Child / loadedHandler() / myParentBall : " + myParentBall);
   this.parent.addChild(myParentBall);
   return;
  }
  
  public function addedToStage(event:Event):void{
   this.removeEventListener(Event.ADDED_TO_STAGE,addedToStage);
   this.addEventListener(Event.REMOVED_FROM_STAGE,removedFromStage);
   return;
  }
  
  public function removedFromStage(event:Event):void{
   this.removeEventListener(Event.REMOVED_FROM_STAGE,removedFromStage);
   return;
  }

  public function welcome(_name:String):String {
   return "@Child : Hello, " + _name;
  }
 }
}


Ball.as
package  {
 
 import flash.display.SimpleButton;
 import flash.events.Event;
 
 public class Ball extends SimpleButton {
  
  public var thisX:Number;
  public var thisY:Number;
  
  public function Ball(_x:Number,_y:Number) {
   this.addEventListener(Event.ADDED_TO_STAGE,addedToStage);
   this.thisX = _x;
   this.thisY = _y;
   return;
  }
  
  public function addedToStage(event:Event):void{
   this.removeEventListener(Event.ADDED_TO_STAGE,addedToStage);
   this.addEventListener(Event.REMOVED_FROM_STAGE,removedFromStage);
   this.x = this.thisX;
   this.y = this.thisY;
   return;
  }
  
  public function removedFromStage(event:Event):void{
   this.removeEventListener(Event.REMOVED_FROM_STAGE,removedFromStage);
   return;
  }
  
  /*此例, Ball類別的這個ballFunc()方法,將在child.swf 被Main.swf 載入後,被Child類別實體調用*/
  public function ballFunc():void{
   trace("@Ball / ballFunc : I am from Ball Class");
  }
 }
 
}





值得注意這件事......

若把Main類別的Main建構函數的以下這行刪掉 :
var ldrContext: LoaderContext = new LoaderContext(false,ApplicationDomain.currentDomain);

且把Main類別的Main建構函數的 ldr.load(req,ldrContext); 的 「,ldrContext」刪掉

[Ctrl+enter]測試影片, 將出現錯誤
ReferenceError: Error #1065: 變數 Child 未定義。
at global/flash.utils::getDefinitionByName()
at Main/completeHandler()

可見, 透過LoaderContext類別物件指定ApplicationDomain.currentDomain
將被載入child.swf 的公用類別定義置於目前載入器根swf所處的應用程式網域
就是本實例能夠正確運作的最大關鍵 ─ 父層子層雙向取用類別定義

若有人真的仔細看了code, 將會發現......
在main與Child裡, 由於處於父層子層彼此類別定義的透視度中
所以, 皆採用 [B法] 來取得對象的類別參照
即 getDefinitionByName(name:String):Object

然而, [A法] 的 ApplicationDomain.currentDomain.getDefinition()方法
則是,未取得父層子層彼此類別定義的透視度時的最佳利器.
透過 ApplicationDomain類別的[靜態]屬性currentDomain傳回目前應用程式網域物件(ApplicationDomain物件),
再調用getDefinition()方法取得類別參照.
很大的好處是,因為 ApplicationDomain.currentDomain為靜態屬性,
可在父層或子層直接呼叫, 達到子層取得父層各類別的目的
否則還真難達成.

前此, 那個 [大誤] 的例子, 最大的錯誤在於......
誤以為從相同網域載入的swf, 不需設定LoaderContext, 就立即與載入器根swf擁有相同應用程式網域
因此彼此擁有相互類別可見度. 其實不然啦.
再者, 沒有將main.as和child.as分開在不同套件目錄
則造成測試的混淆. 大誤阿 !!!