8月 6, 2009
Commands(AS2.0用)をクソ分かりやすく解説する!
久しぶりのActionScriptネタ
一度でも、Progressionとかで仕事したことがあるなら、
「addCommand」みたいな同期・非同期処理の便利さに感動を覚えたはず。
・関数1を実行する
・0.5秒後に関数2を開始
とか、間隔をあげて処理することがよくあるので、
addCommandみたいなのがないと
仕事できない・したくない体になってしまった。
ということで、CommandのAS2.0バージョンを必死で探してみた。
まず、非同期処理の元祖? そーめん = Thread はAS2.0用バージョンがあるが、
資料が少なく、書き方を調べるのが面倒だから、パス!(Beinteractiveの中の人ごめんなさい)
Spark ProjectにCommands(2.0用)があったら、早速使ってみる。
まず基本
以下で新規コマンド(SerialCommand)を作る
[as]
var sCmd:SerialCommand = new SerialCommand().execute();
[/as]
new SerialCommand()の括弧の中に、
実行したいコマンドをどんどん追加していく
[as]
var sCmd:SerialCommand = new SerialCommand(
new TraceCommand(“コマンド1”),
new TraceCommand(“コマンド2”)
).execute();
[/as]
オイラはいつも怒濤のコピペで、
うっかり最後のコマンドも「,」を入れちゃったままで
コンパイラーに怒られる。
そして肝心のコマンドだが、いろいろ用意されてるみたい。
とりあえずよく使いそうなもの
TraceCommand
名前通り、traceだけ
[as]new TraceCommand(“FuseCommand スタート”)[/as]
TimerCommand
時間指定で関数を実行。下記引数の内約は
・this = 実行場所、thisで多分大丈夫(無責任!)
・fun1 = 実行する関数
・[“hoge”,karaMC] = 実行関数に渡す引数。型は何でもOK。
複数の場合は「,」で区切る。
下記の例では「hoge」というストリングと「karaMC」というmcを渡す。
何も渡さないときはnull。
・1500 = 1.5秒後に実行
・1 = 実行回数1回
[as]//引数を渡す
new TimerCommand(this,”fun1″,[“hoge”,karaMC],1500,1)
//引数を渡さない
new TimerCommand(this,”fun1″,null,1500,1)[/as]
LoaderCommand
mcに何かロードする(試してないけど、多分swfも行ける、多分…)
下記引数の内約は
・http://farm3.〜 = ロードするもののURL、ここは絶対パスだが、相対でもOK。
・karaMC = 入れ物。先に用意しておこう!
[as]//karaMCというMovieClipに「http://farm3.〜」という画像をロードすること。
new LoaderCommand(“http://farm3.static.flickr.com/2555/3755792762_824380999f_m.jpg”, karaMC)[/as]
実行
二つの書き方
[as]//その1 書いてすぐ実行!
var sCmd:SerialCommand = new SerialCommand(
new TraceCommand(“コマンド1”),
new TraceCommand(“コマンド2”)
).execute();
//その2 書いといて、実行部分は別に!
var sCmd:SerialCommand = new SerialCommand(
new TraceCommand(“コマンド1”),
new TraceCommand(“コマンド2”)
);
//実行するのだぁ!
sCmd.execute();[/as]
残念はことに
Progressionなら、[]でコマンドをまとめたら
[]内のコマンドは同時に実行するが、
このCommandsでは動かない…
ソースを読むと、ちゃんと機能として書いてあるが
実行できなかった。バグかな?
[as]//このソースだとコマンド1で止まっちゃう。
var sCmd:SerialCommand = new SerialCommand(
new TraceCommand(“コマンド1 FuseCommand スタート”),
[
new TraceCommand(“コマンド2 同時実行”),
new TraceCommand(“コマンド3 同時実行”)
],
new TraceCommand(“コマンド4 FuseCommand 終了”)
);[/as]