Pay for Hesitation: code

Pages

顯示具有 code 標籤的文章。 顯示所有文章
顯示具有 code 標籤的文章。 顯示所有文章

2011年2月14日 星期一

A rest for your SWF

試過了, 可以work.
好用的trick!


http://imagineric.ericd.net/?p=353
Well, it works for a SWF, but if you’re deploying a projector it doesn’t want to work correctly. It loads nothing in the projector’s viewport. It works if you launch the SWF as a standalone or in a browser.

2011年1月19日 星期三

Trick on iterating array concatenation

nice trick!!
http://blog.eddie.com.tw/2011/01/18/faster-array-concatenation-in-as3/

array1.push.apply( array1, array2);


2010年12月15日 星期三

Codrops - useful drops of code

http://tympanus.net/codrops/

看起來像是在收集 jQuery 程式的網站
有code
有demo

2010年11月11日 星期四

My idiom - Number to Digital MovieClip

My Singleton Template

How to Compare Two Array

以下轉自ptt flash版

作者  cjcat2266 (CJ Cat)                                         看板  Flash
 標題  Re: [問題] 我想比較兩個陣列的不同?
 時間  Sat Oct  9 21:02:33 2010
───────────────────────────────────────

※ 引述《kaiyine (yumi)》之銘言:
: 陣列a是5,2,6,8,4
: 陣列b是0,1,2,3,4,5,6,7,8,9,10
: 我要如何列出陣列a缺少0,1,2,3,7,9,10呢?

這就是"集合"的問題了
同上一篇回文所說的,可以用associative array
(如果是AS3就可以用Dictionary class,相當於C++的map class)

其實可以更簡短的寫
(以下code未經過測試,可能有錯字)

        var a:Array = [5, 2, 6, 8, 4];
        var b:Array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

        //集合物件
        var obj:Object = new Object();

        var i:Number, len:Number;

        //讓a的元素作為key,跟true值產生關連
        for (i = 0, len = a.length; i < len; ++i) {
                obj[a[i]] = true;
        }

        //尋找"a沒有,b有的元素"
        for (i = 0, len = b.length; i < len; ++i) {

                //若obj[b[i]]沒有關聯值,那就是undefined,!undefined == true
                if (!obj[b[i]]) {
                        trace("a沒有含" + b[i]);
                }
        }


==========================================================
作者  etrexetrex (moonet)    

也可以存 inverse A,不過其實是一樣的
多花了點記憶體,得到了一些加速

假設:

  A陣列中沒有重複出現相同的值


程式:

var i:Number;
var a:Array = [5, 2, 6, 8, 4];
var b:Array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var aLength : Number = a.length;
var bLength : Number = b.length;


//建立A的反向表 此處inverseA的型態是陣列
var inverseA:Array = [];
for (i = 0 ; i < aLength; i++ )
    inverseA[a[i]] = i;
var inverseALength : Number = inverseA.length;

//多花的記憶體在 inverseA
trace("aLength = " + aLength);                  //aLength = 5
trace("bLength = " + bLength);                  //bLength = 11
trace("inverseALength = " + inverseALength);    //inverseALength = 9


//尋找"a沒有,b有的元素"
for (i = 0; i < bLength; i++ )
{
    //加速在這裡
    if(b[i] >= inverseALength)
        trace("a沒有含" + b[i]);

    //基本上 Array 的存取也會比 Object 快些
    else if(inverseA[b[i]] == undefined)
        trace("a沒有含" + b[i]);
}



為了確認Array 的空值是 undefined
只好打開 flash cs4
所以上面的程式已經測過了


========================================================
作者  cjcat2266 (CJ Cat)   

※ 引述《etrexetrex (moonet)》之銘言:
:     //加速在這裡
:     if(b[i] >= inverseALength)

補充說明一下
其實這裡不一定會完全加速喔

:     //基本上 Array 的存取也會比 Object 快些

要看你的array是不是sparse array
意思就是你是否每一個element都有明確給值

一個Array物件內部底層其實分成一個陣列和一個binary search tree (dictionary)
從第0個開始的元素到最後一個連續的元素,是存在陣列
剩下的元素則是存在binary search tree裡面
這樣才不會浪費記憶體去存取undefined元素

如以下的code

        a[0] = 0;
        a[1] = 1;
        a[2] = 2;

那麼三個連續元素是儲存在底層陣列沒錯
存取起來速度會很快

但是以下code

        a[0] = 0;
        a[10] = 1;
        a[12] = 2;
只有a[0]是存在底層陣列
a[10]和a[12]是存在底層的binary search tree
存取起來的效能量級就是跟Object和Dictionary一樣的

再如

        a[10000] = 1;

所消耗的記憶體不是10000個Number
而是只有一個Number而已,是用底層的binary search tree在存

所以如果真的要龜毛
你應要一開始把aInverse的所有元素都先初始化成-1或其他值
才可以真正得到array效能上的優勢


我記得以上豆知識是在Senocular的blog上看到的 :)



p.s. 我找不到Spare Array 在AS3的底層是以BST實作的證實.







2010年11月2日 星期二

[API Bug] Differences between Sound.length and SoundChannel.position in ActionScript 3

Bug with Sound channel position and mp3s less than 128kbps
Differences between Sound.length and SoundChannel.position in ActionScript 3
soundchannel.position 和 sound.length有误差

2010年10月21日 星期四

Vector Initialization with an Inline Array as Source

private const vec:Vector.<Number> = new Vector.<Number>( [0.1, 0.2, 0.3, 0.4] );
The Vector initialization fails silently, i.e. the compiler will not throw any error during the compile time, when you put the identifier "new" prior to the Vector initialization statement.

2010年8月27日 星期五

Display Frame Rate

1. create a TextField named "frameRate_txt"
2. put following codes in the first frame of a flv file.

2010年8月16日 星期一

"down to" operator

2010年7月15日 星期四

capture the screenshot from the stage of Flash Player

2010年3月3日 星期三

Using String Variables to Call Functions in AS3

http://asgamer.com/2009/using-string-variables-to-call-functions-in-as3

var myfunc:String = "functionFromVariable";

public function functionFromVariable() : void {      trace("I was ran from a string"); }

主要是下面這句, 酷!
this[myfunc]();

root and stage

var rec1:Shape = new Shape();
var rec2:Shape = new Shape();
var rec3:Shape = new Shape();

var spriteOnDisplayList:Sprite = new Sprite();
var spriteNotOnDisplayList:Sprite = new Sprite();
var spriteOnMainClass:Sprite = new Sprite();

spriteOnDisplayList.addChild(rec1);
spriteNotOnDisplayList.addChild(rec2);
spriteOnMainClass.addChild(rec3);
stage.addChild(spriteOnDisplayList);
//stage.addChild(spriteNotOnDisplayList);
this.addChild(spriteOnMainClass);

trace(rec1.root); //[object Stage]
trace(rec2.root); //null
trace(rec3.root); //[object MainTimeline]



一個display物件在它的constructor中, 其parent, root, stage等instance variable都是null值.
因為它尚未加入display list.

利用 ExternalInterface 完全暫停 Flash Movie 程序

http://ticore.blogspot.com/2008/05/externalinterface-pause-flash-player.html

2008年4月9日 星期三

Custom Dialog via PopupManager and TitleWindow (2)

第二種方式,我認為比較適合我們這種大型程式架構。
將TitleWindow,也就是欲彈出的視窗獨立寫成一個MXML Component,
在Flex Builder中, New一個新的MXML Component時,可以在下方選擇"Base on",選TitleWindow。
接著,所產生的mxml檔,會以<mx:TitleWindow>框起來,裡面的內容就跟一般寫mxml一樣囉!
而在mainFrame中只要將mxml檔案名稱當作參數設在PopUpManager.createPopUp()就可以了!
(有種朝我們的目標:只有一個url入口,又更接近的感覺 XD, 這是上禮拜有聊到的)
DEMO: http://140.112.31.185/flextest/popUpMain.swf

popUpMain.mxml
CustomTitleWindow.mxml

Custom Dialog via PopupManager and TitleWindow (1)

客製化與使用者互動的彈出視窗的方法,有兩種。
第一種方式為直接在主框架下透過PopUpManager將設置好的children加入TitleWindow,
也就是被客製的彈出視窗。
DEMO: http://140.112.31.185/flextest/popUpFrame.swf

2008年4月8日 星期二

Bitmap倒影效果

主要是藉由Bitmap支援混合多張影像的模式.
DEMO: http://140.112.31.185/flextest/imageReflection.swf

source code + 說明

2008年4月6日 星期日

Embed asset class

[Embed(source="assets/logo.png")]
上面這行標籤你一定不陌生..

他的用法很酷,功能也非常強大!!!
它常常搭配下面這行用法,
private var Image:Class;

型態是Class,API的定義如下:
Package: Top Level
Class: public dynamic class Class
Inheritance Class: Inheritance Object

A Class object is created for each class definition in a program. Every Class object is an instance of the Class class.

用來宣告了一個高抽象的class變數,很像是polymorphism的用法。但我不確定他明確的稱呼是?
所以Embed asset class 可以載入資源並bind到這個class上。
有趣的是下面這行,
//前面我們自行定義的class 可以拿來new object而且用Bitmap的變數去接它~~
var img:Bitmap = new Image();

我不知道為什麼Bitmap可以接受Image class的instance.
(在java裡, 需先做downcasting,如: MyObject a = (MyObject)c.clone();
clone時會回傳Object Reference,需先downcasting成MyObject, 才可assign給MyObject物件)

很特別,但在ActionScript裡是相當常用的做法.



之所以說Embed asset class強大,
是因為它可以load 圖, swf, 音樂, 字型,還可以套用CSS!!!

如果load一張圖,不需做額外的處理(如剪裁,scale等..)
用下面這種作法是最乾淨俐落的..

你一定要看一下中文官方文件的例子,就會愛上Embed asset class這個用法
http://www.adobe.com/tw/devnet/flex/quickstart/embedding_assets/#EmbeddingImagesCSS

之前po過一篇Flex metadata tags
Embed asset class只是其中的一種,之前也介紹過bindable,威力也是相當強大..
我想Flex 4,metatdata flags應該會是重頭戲之一..
畢竟這是很多語言沒有的特色..

天女散花的效果

利用bitmap,控制pexel的顏色,來達到天女散花的效果。
(我覺得這招有很多玩法, 如按滑鼠就拿掉馬賽克, 做法是底層放一張美女圖, 然後上層幾個重點部位用著色的bitmap蓋住,
使用者在著色的bitmap上click時,就用這招來隨機將pixel變透明, 那馬賽克就漸漸消散了..XD )

(在canvas上按滑鼠左鍵..)
demo:http://imlab.cs.nccu.edu.tw/~pie/spray.swf

同樣的效果其實用隨機drawCircle其實也做的到, 但每個shape都是會佔記憶體的display object, 所以可想而知效能會隨著shape增加而遞減. 用bitmap的pixel來做特效則沒有效能的問題.
此外注意到下面這行:
bmp.filters = [new BlurFilter(2, 2, 3)];
若拿掉上面blurFilter, 這些點將不會那麼萌... XD


2008年4月3日 星期四

Add Sprite into Canvas

[方法一] 先將Sprite加到UIComponent, 再把UIComponent加到Canvas中

[方法二] 使用Canvas.rawChildren