2011年1月6日

gQuery's Commands 介紹

Flash開發一陣子後,想必大家都有屬於自己的libs了,這次要來介紹的是自己寫的libs,姑且就先命名為gQuery吧!!這次要介紹的內容是 Command ,跟Design Pattern的Command Pattern又不大一樣,因為主要是參考CJcat文章後自己嘗試寫出來的。雖然有算是練習的作品,不過來來去去也修改了不少次;也算是小弟我的一點點心血,所以就拿出來介紹一下,順便也幫自己複習一下。

因為CJcat的文章已經對原理有完整的介紹了,所以我就不在這方面有其他的琢磨了,就直接介紹如何使。

Commands
Commands,我主要是把它當作一個容器,可以存放多個命令,讓命令依序/同時進行,使用方式有addCommand、setCommand,建議只使用addCommand就可以了。
/**
 * @param ... $Commands 加入的命令必須是 commands 或是 array 所包覆之 function 或 commands 
**/
addCommand( ... $Commands);
//example
addCommand( 
    function():void{trace("step1");},
    [function():void{trace("step2-1");},
     function():void{trace("step2-2");  ],
    function():void{trace("step3")}
);

其中用"[...]"(array)包起來的動作,是同時執行的(並聯);其他的則是串聯(一個結束後,接續下一個)的執行方式,下面就是完整的範例程式碼。

import gquery.command.Commands;
import gquery.command.DoNomalCommand;
import gquery.command.DoTweenNanoTo;
import gquery.events.CommandEvent;

var cast1 = new Sprite();
var cast2 = new Sprite();
cast1.graphic.beginFill( 0x000000 );
cast1.graphics.drawRect(0, 0, 100, 100);
cast1.graphics.endFill();
cast2.graphic.beginFill( 0x000000 );
cast2.graphics.drawRect(0, 0, 100, 100);
cast2.graphics.endFill();
cast2.y = 110;
addChild( cast1 );
addChild( cast2 );

var com:Commands = new Commands();
//為com加上監聽器,在com執行完畢的時候觸發
com.addEventListener(CommandEvent.COMPLETE , onCommandCompleteHandle);
com.addCommand(
    new DoTweenNanoTo( cast1 , 1 , {x:100} ),
    new DoTweenNanoTo( cast2 , 1 , {alpha:0} ),
    [new DoTweenNanoTo( cast1 , 1 , {x:0} ),
     new DoTweenNanoTo( cast2 , 1 , {alpha:1} )]
);
//開始執行 com
com.execute();

function onCommandCompleteHandle(e:CommandEvent):void
{
    //這邊可以做command完成後的動作
    trace("com 執行完畢");
}

下面來介紹幾個command的用法:

DoTweenNanoTo
DoTweenMaxTo
相信大家看到這個都覺得很眼熟, 這是使用greensock的Tween libs所建立的,所以他的使用方式也跟原本的差不多。
ps.如果要同時對同一個物件使用這Class的話,可能會有tween overwrite的問題需要注意一下
DoTweenNanoTo( $target:DisplayObject , $duration:Number , $vars:Object );
DoTweenMaxTo( $target:DisplayObject , $duration:Number , $vars:Object );

DoFrameCommand
/**
 * @param $target 目標
 * @param $startFrame 開始影格(int or FrameLabel) 
 * @param $EndFrame 結束影格(int or FrameLabel)
 */
DoFrameCommand($target:MovieClip , $startFrame:* , $EndFrame:* )

DoNormalCommand
/**
 * 建立命令容器實體
 * @param $function 要執行的Function
 * @param $delay 要延遲秒數 
 */
DoNomalCommand($function:Function , $delay:Number = 0)

到這邊,就是目前整理出來比較完整的部分了,希望能對大家有些許的幫助。

參考網址:CJ's Blog Thinking in Commands
範例檔案: 點我下載 (libs也包進去了)
在這邊囉嗦一下,其實再發這篇文章的時候內新是挺掙扎的,畢竟這個libs說起來也不難,只是一個簡單的小概念;比起cjcat的詳細介紹,覺得自己寫這篇沒甚麼意義;最後決定還是要寫,一方面是記錄,另外也是學習著寫自己的libs,不過在文章內容上就偏向使用方面去介紹,就不再解說相關的概念。
最後希望大家再使用方面如果有遇到什麼bug可以跟我說一下,也期許自己能夠繼續進步,最後2011年啦,在這邊跟大家補個新年快樂~~~

沒有留言:

張貼留言