享受視覺,

享受音樂,

泡杯咖啡,

再來細細品嘗每一篇文章不是很棒的一件事嗎 ?

請移到新部落格喔~ zzz

2010年1月26日 星期二

[教學] 如何在時間軸上減少全域變數

我想大家都知道,在 flash 第 1 個影格上宣告一個變數如 var a:int = 0; 則flash 第 2 個影格、第 3 個影格,甚至後方的影格都能存取該變數 a。有時候變數設多了很容易搞混,哪些變數是重要的,哪些變數不是重要的很難分清楚。

假設我需要在flash第一影格動態繪製黑色圓形圖並顯示,一般會這樣寫:

var bmpData:BitmapData = new BitmapData(50,50,true,0x00FFFFFF);//50x50透明圖
var image:Bitmap = new Bitmap(bmpData);
var circle:Shape = new Shape;
var circleGraphic:Graphic = circle.graphics;
circleGraphic.beginFill(0);
circleGraphic.drawCircle(0, 0, 25);//半徑25的圓
circleGraphic.endFill();
bmpData.draw(circleGraphic, new Matrix(1,0,0,1,25,25));//繪製圓
addChild(image);//顯示於畫面

突然多了好多變數,重點變數應該是image變數而已,而其它3個全域變數不會再用到。

從新設計一下,

var image:Bitmap = (function():Bitmap{
 var bmpData:BitmapData = new BitmapData(50,50,true,0x00FFFFFF);//50x50透明圖
 var circle:Shape = new Shape;
 var circleGraphic:Graphic = circle.graphics;
 circleGraphic.beginFill(0);
 circleGraphic.drawCircle(0, 0, 25);//半徑25的圓
 circleGraphic.endFill();
 bmpData.draw(circleGraphic, new Matrix(1,0,0,1,25,25));//繪製圓
 return new Bitmap(bmpData);
})();

addChild(image);//顯示於畫面

上面直接執行匿名函數回傳 new Bitmap(bmpData),而 function 內設置的變數都變成了區域變數了。所以後面的影格只能存取 image 變數,而不會存取到其它不會再用到的變數,大大的減少全域變數產生。

帥吧XD~

[教學] switch 特別用法 ~ 模擬迴圈

我想這個題目大家都作過,請在 output 面板輸出:

x
xx
xxx
xxxx


假設上題迴圈設計如下:
for(var i:int = 0; i<4 ;i++){
 str = "";
 for(var j:int = 0;j<=i;j++)
  str+="x";

 trace(str);
}

該如何用 switch 表達,請參考下方(注意沒有break關鍵字):

for(var i:int = 0; i<4 ;i++){
 str = "";
 switch(i)
 {
  case 3: str+="x";
  case 2: str+="x";
  case 1: str+="x";
  case 0: str+="x";
 }

 trace(str);
}

經過測試發現
上面方法執行效率略差,不管執行多寡數量設計上較有彈性,譬如執行100次只要改i<100。下面方法執行效率較好,但是執行數量多時設計上較沒彈性,譬如用100個case慢慢拷貝會累死, 但是適當時機使用上述 switch 用法也是很棒的選擇,站長舉個不錯的使用範例:

 口
 口 口
口口 口  口
口口口口  口
口口口口口 口口
口口口口口口口口 口  口
口口口口口口口口口口口口口口口口口

假設上方是聲音頻譜圖,程式該怎麼用 switch 設計,大家可以思考一下 :D?

如果覺得站長的主題很無聊或想提出一些flash設計上的問題歡迎留言

2010年1月18日 星期一

[教學] AS3中如何改變 SimpleButton 內的動態文字















AS3 的 SimpleButton 內加入文字後,該如何用程式修改文字呢 ? 還記得 AS2 的程式寫法是 myBtn.label.text = "button",非常簡易的存取方式。而 AS3 程式存取寫法是完全不一樣的,因為跟 AS2 的按鈕設計方法完全不一樣。若是在 AS3 中用 myBtn.label 會發現不能存取。

若您了解 SimpleButton 的類別用法,SimpleButton 有三個狀態,upState、overState、downState。

要存取文字應該要這樣寫

(((myBtn.upState as Sprite).getChildAt(1)) as TextField).text = "1";
(((myBtn.overState as Sprite).getChildAt(1)) as TextField).text = "2";
(((myBtn.downState as Sprite).getChildAt(1)) as TextField).text = "3";

getChildAt(1) 是存取上圖 label 圖層的動態文字物件
getChildAt(0) 是存取上圖 graphic 圖層的 Shape 物件

我想這樣應該很清楚了 :D