Progression4の新コマンドあれこれ
Progression4.0.1 Beta1.1がリリースされWonderflにも組み込まれています。
4.0以降ではリスト系コマンドのショートハンドなど少し機能が変わっているのでその辺をまとめてみます。
commands内のパッケージ構成が大幅に変わってます
- commands.display.* : AddChildなどの表示系
- commands.lists.* : SerialListなどリスト系
- commands.manager.* : Gotoなど遷移系
- commands.media.* : サウンド系
- commands.net.* : 通信系
- commands.tweens.* : Tween系
といふうに構成としてはわかりやすくなりました。インポート文が増えてしまいましたが、入力保管機能のあるエディタを使えば、さほど不便はしないと思います。
また増えたコマンド減ったコマンドもたくさんあります。
・増えたコマンド一覧
- RemoveChildAt
- RemoveChildByName
- RemoveChildFromParent
- LoaderList
- LoopList
- ShuttleList
- TweenList
- Jumpto
- DownloadFileRef
- LoadBitmapData
- LoadScene
- LoadSound
- LoadSWF
- NavigateToURL
- SendToURL
- UploadFileRef
- DoExecutor
- Return
- Stop
・減ったコマンド一覧
- Listen
- LoadChild
- LoadChildAt
- LoadChildAtAbove
- UnloadChild
主にnetパッケージ周りの統廃合が大きく、FileReferenceを扱うものがふえたり、方針としてもLoadCommandとAddChildを分離する方向になったようです。またList系のイベントが強化されています。
時間の指定方法がミリ秒から秒に変更になってます
Tweenのtime値、delay値などの指定は、1秒だったら1、0.5秒だったら0.5と指定する形になります。ここはうっかりすると1秒のつもりが1000秒待ったりしちゃいそうなので注意が必要ですね。
ショートハンドが増えています。
- 関数だったらFuncコマンドに変換する
- 数値だったらWaitコマンドに変換する
- 配列だったらリスト系コマンドに変換する
- それ以外はTraceコマンドに変換する
ということで、WaitとTraceが新しいショートハンドとなります。見た目がスッキリしますが後から見てぱっとみわかりにくいという弱点もありますので、スクラッチ目的か保守目的化で書き方のスタンスが変わってくるでしょう。
詳しく読みたい方はjp.progression.core.utils.CommandUtilクラスのconvert()メソッドをあたってください。
中断処理から非同期処理がなくなってる
わかりにくい変更ですが、Ver3のときはCommand.interrupt()を呼び出したときに時に中断にも何かしてから終わるといったような非同期処理が差し込み可能でしたが、Ver4からはいきなり終わります。
これによって中断中に不具合がおきたり処理の干渉が起きることが軽減されるのでは、と思います。
中断処理をはさむ場合は、中断したコマンドの親(SerialListなど)にintsertCommandなどで代替となる演出用のコマンドを動的に追加するかたちがよいと思います。
イベントや例外の補助機能が廃止されている
今まではCommandインスタンスにlisten, error, before, afterなどの便利メソッドがありましたがすべて廃止になっています。
- listen → Funcコマンド使う
- error → catchErrorプロパティをセットする
- before, after →おそらく代替するものはないのでExecuteEventで普通にイベント処理する
Error処理はcatchErrorにエラー処理をする関数をセットし、そこで中断するとか処理します。
var com:Command = new AddChild( this, child ); com.catchError = function ( target:Object, error:Error ):void { // targetはCommand.scopeプロパティ。何もしなければエラーが発生したコマンド if( /*解決したら*/ ) target.executeComplete(); else /*解決しなかったら*/ target.interrupt(); } com.execute(); // initObjectで生成時にセットすることも可能 var com:Command = new AddChild( this, child, { catchError:function ( target:Object, error:Error ):void { // targetはCommand.scopeプロパティ。何もしなければエラーが発生したコマンド if( /*解決したら*/ ) target.executeComplete(); else /*解決しなかったら*/ target.interrupt(); } }); com.execute();
また同期用のショートハンド用メソッドが設定可能になっています。
onStart、onComplete、onError、onInterrupt、とありますが、これらはイベントの簡易な書き方であって、エラーのときに中断するなどのコマンドのフローに影響を与えるためのものではありません。
var com:Command = new AddChild( this, child ); com.onStart= function ():void { // 開始したらやること } com.onComplete= function ():void { // 終了したらやること } com.onError = function ():void { // エラーのときやること } com.onInterrupt = function ():void { // 中断したときやること } com.execute(); // initObjectで生成時にセットすることも可能 var com:Command = new AddChild( this, child, { onStart:function ():void { // 開始したらやること }, onComplete:function ():void { // 終了したらやること }, onError:function ():void { // エラーのときやること }, onInterrupt:function ():void { // 中断したときやること } }); com.execute();