Reinit_creative log Reinit_creative log rss

Reinit_creative log

about ActionScript3 and Design memo.

FuncコマンドをParallelListで処理すると

2009.04.12

Progressionに実装されているコマンドクラスの代表的なコマンド、Funcコマンドの自分用の確認メモを書いておこうと思います。 Funcコマンドは、通常このように記述して実装します。

new Func(
func:Function,
args:Array = null,
dispatcher:IEventDispatcher = null,
eventType:String = null,
initObject:Object = null
).execute();

もしくは、addCommand内や、SerialList、ParallelList内に以下のように記述するのではないかと思います。

new SerialList(null,
function():void
{
//処理内容
}
).execute();

僕は、Progressionのコマンドの中で一番好きなのは、Funcコマンドです。非同期処理も簡潔なコードで書けるし、見通しが良いのがすばらしいです。
今までdispatcherを利用して処理待ちさせるような使い方をしていたFuncコマンドをParallelListで使ったことがなかったので、メモ。

構成のコマンドは以下のような感じです。
func1
func2
func3
 - func3_1
 - func3_2
func1~3までの関数があって、func3のみ入れ子で func3_1, func3_2がある状態です。 func1とfunc2は、ParallelListで同時実行します。どちらの処理も完了したら、func3を実行するというコマンドです。 func1~3はそれぞれ処理を開始するとWaitコマンドが実行され、func1~3にそれぞれ設定している時間を待ってから処理が完了します。 処理待ち時間は以下のようになっています。
func1 ---- 3000
func2 ---- 200
func3 ---- 2000
 - func3_1 ---- 3000
 - func3_2 ---- 1000
僕の実行処理の想像はこんな感じです。
func1実行
func2実行
func2実行完了
func1実行完了
func3実行
 - func3_1実行
 - func3_2実行
 - func3_2実行完了
func3実行完了
 - func3_1実行完了
------------------
処理終了
結果はどうなるか?
[処理の内容]
package  
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.trace.Trace;
	import jp.progression.commands.Func;
	import jp.progression.commands.SerialList;
	import jp.progression.commands.Wait;
	
	/**
	 * ...
	 * @author Shunsuke Ohba
	 */
	public class FuncTest extends Sprite
	{
		
		public function FuncTest() 
		{
			var scope:FuncTest = this;
			new SerialList(null,
				[
					new Func(doFunc1,null,scope,"func1Complete"),
					new Func(doFunc2,null,scope,"func2Complete")
				],
				new SerialList(null,
				[
					new Func(doFunc3, null, scope, "func3Complete"),
					new SerialList(null,
					[
						new Func(doFunc3_1,null,scope,"func3_1Complete"),
						new Func(doFunc3_2,null,scope,"func3_2Complete")
					])
				]	
				),
				function():void
				{
					trace("------------------\n処理終了")
				}
			).execute();
		}
		
		//func1~3の処理関数
		private function doFunc1():void
		{
			new SerialList(null,
				new Func(trace,["func1実行"]),
				new Wait(3000),
				function():void
				{
					trace("func1実行完了");
					dispatchEvent(new Event("func1Complete"));
				}
			).execute();
		}
		
		private function doFunc2():void
		{
			new SerialList(null,
				new Func(trace,["func2実行"]),
				new Wait(200),
				function():void
				{
					trace("func2実行完了");
					dispatchEvent(new Event("func2Complete"));
				}
			).execute();
		}
		
		private function doFunc3():void
		{
			new SerialList(null,
				new Func(trace,["func3実行"]),
				new Wait(2000),
				function():void
				{
					trace("func3実行完了");
					dispatchEvent(new Event("func3Complete"));
				}
			).execute();
		}
		private function doFunc3_1():void
		{
			new SerialList(null,
				new Func(trace,[" - func3_1実行"]),
				new Wait(3000),
				function():void
				{
					trace(" - func3_1実行完了");
					dispatchEvent(new Event("func3_1Complete"));
				}
			).execute();
		}
		
		private function doFunc3_2():void
		{
			new SerialList(null,
				new Func(trace,[" - func3_2実行"]),
				new Wait(1000),
				function():void
				{
					trace(" - func3_2実行完了");
					dispatchEvent(new Event("func3_2Complete"));
				}
			).execute();
		}
	}
}
[出力結果]
func1実行
func2実行
func2実行完了
func1実行完了
func3実行
 - func3_1実行
 - func3_2実行
 - func3_2実行完了
func3実行完了
 - func3_1実行完了
------------------
処理終了
想像通りの結果でした。 オチはありません。
やはりFuncコマンドいいですね。

update 2010.01.02...

[関連記事]

My Icon

Flash+デザインを仕事としています。
info[at]reinit.info
>>detail

レコメンド

ActionScript3アニメーション

ActionScriptアニメーション

アニメーションに関する基礎が得られる本。
コレを読んで、ASが楽しくなった。