[AS]progression4 Load系コマンド(LoadURLとかLoadSoundとか)で読み込んだデータをインスタンス変数に参照させて取り扱うときの注意
題名のまんまをprogression forumに質問したらすぐに回答を頂けたのでその補足メモ。
まずLoad系のコマンドで読み込んだデータを扱う際の定石は
//※要点を抜粋したコード var _sound:Sound; addCommand( new LoadSound(new URLRequest("./sound.mp3")) ,function(){ _sound = this.latestData; trace(_sound)//出力:[Object Sound] } )
と思ってましたが、progression4からは、getResourceByIdというものを使った方が便利とのこと。
↑のコードを書き換えると
//※要点を抜粋したコード var _sound:Sound; addCommand( new LoadSound(new URLRequest("./sound.mp3")) ,function(){ _sound = getResourceById( "./sound.mp3" ).data; trace(_sound)//出力:[Object Sound] } )
getResourceById()の便利なところは、一度読み込めば、読み込んだデータがどこからでも参照できるというところみたい。
getResourceById( “./sound.mp3” )と書くことでstaticは変数みたいな扱いができるということかな。
↓ざっくり書くとこんな感じ。
//※要点を抜粋したコード var _sound:Sound; addCommand( new LoadSound(new URLRequest("./sound.mp3")) ,function(){ _sound = getResourceById( "./sound.mp3" ).data; trace(_sound)//出力:[Object Sound]; new Test(); } ) // class Test { function Test(){ trace(getResourceById( "./sound.mp3" ).data)//出力:[object Sound] } }
あとgetResourceByGroupというものもあって同様な扱いができるそうです。
上記の検証で参考になった記事
参考:_level0.KAYAC:Progression4の新機能Resourceを試してみる
でタイトルの本題については、forumに書いたけど↓ではSerialList内のtraceはnullになり
addCommand( new LoadSound(new URLRequest("./sound.mp3")) ,function(){ _sound = getResourceById( "./sound.mp3" ).data; trace(_sound)//出力:[Object Sound]; new Test(); } ,new SerialList(null ,new Trace(_sound)//出力:null ) )
SerialListをfinctionでくくると参照がとれました。
addCommand( new LoadSound(new URLRequest("./sound.mp3")) ,function(){ _sound = getResourceById( "./sound.mp3" ).data; trace(_sound)//出力:[Object Sound]; new Test(); } ,function(){ new SerialList(null ,new Trace(_sound)//出力:[Object:Sound] ).execute() } )
最後にこれらの集大成的なコード(ドキュメントクラス)
(functionで括らないSerialList内でのTraceでnullになるのは、イマイチ理解できてないけど)
package { import flash.display.Sprite; import flash.media.Sound; import flash.net.URLRequest; import jp.progression.commands.media.DoSound; import jp.progression.commands.display.*; import jp.progression.commands.lists.*; import jp.progression.commands.net.*; import jp.progression.commands.tweens.*; import jp.progression.commands.*; import jp.progression.data.getResourceById; /** * @author 393 */ public class Test extends Sprite{ private var _sound:Sound; private var number:int = 0; public function Test() { var slist:SerialList = new SerialList(); slist.addCommand( new LoadSound(new URLRequest("./sound.mp3")) ,function(){ _sound = getResourceById( "./sound.mp3" ).data; trace("_sound : " + _sound); new DoSound(_sound).execute(); number = 100; } ,new SerialList(null ,new Trace("SerialList number : " + number)//出力:0 ,new Trace("SerialList sound : " +_sound)//出力:null ) ,new Func(next) ); slist.execute(); } private function next():void{ trace("number : " + number);//出力:100 trace("nextの_sound : " + _sound);//出力: [object Sound] new Test2() } } } import jp.progression.data.getResourceById; class Test2{ public function Test2() { trace("Test2のgetResourceById( \"./sound.mp3\" ).data : " + getResourceById( "./sound.mp3" ).data); } }
Tweet