- ベストアンサー
actionscript2のmp3再生について
- ファイルの読込み完了時点でSoundオブジェクトがundefinedになってしまいます。
- 動作としましては、ファイルの読込みが完了し、loadCompleteが呼ばれ、読み込んだmp3ファイルを再生し、再生終了時点でendSoundが呼ばれ、次の音声ファイルを読み込み。。。という流れを望んでいるのですがloadComplete以降Soundオブジェクトがundefinedになってしまう為上手く動作しません。
- 有識者の方、ご回答頂けますと幸いです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
Sound オブジェクトである soundCtl が消えたのではなく、this が指す対象の変化に伴い、loadComplete メソッド内で soundCtl を参照できていないことが原因だと思います。 onLoad イベントハンドラにより loadComplete メソッドが呼び出されると、その中での this は、呼び出した者である soundCtl を指します。 すると、loadComplete メソッド内の this.soundCtl.start は soundCtl.soundCtl.start を指定していることになってしまい、これは存在しないので何も起こらない、というわけです。 この問題は、this が指す対象を他の変数に保護しておき、匿名関数とこの変数を使ってイベント処理関数を呼び出すと回避できます。 SoundUtil メソッド(コンストラクタ)内に //thisが指す対象(=SoundUtilクラス自身)を保護 var owner:SoundUtil = this; ↑ このように、this が指している対象を保護する変数を追加し、イベント処理の定義を this.soundCtl.onLoad = function( success:Boolean ):Void { owner.loadComplete( success ); }; this.soundCtl.onSoundComplete = function():Void { owner.endSound(); }; に、変更してみてください。 (各行頭に全角のスペースが入っています。コピーする際はご注意ください) イベントハンドラに登録した匿名関数の中にある owner には、SoundUtil クラスのオブジェクト自身の参照が入っています。 onLoad イベントハンドラによりまず呼び出されるのはこの匿名関数で、この中では owner の値を参照できます。 匿名関数の中で owner を介して loadComplete メソッドを呼び出すと、loadComplete メソッドを呼び出した者は変数 owner で示される者、つまり SoundUtil クラスのオブジェクト自身になるので、this もクラスのオブジェクト自身を指します。 従って、this.soundCtl や、this を省略して soundCtl とした時も、soundCtl を参照することができます。 onSoundComplete イベントハンドラの場合も同様です。 - - - - - ところで、クラスファイルの冒頭の public var soundCtl:Object; の型は、Object 型ではなく Sound 型ではないでしょうか。 それから、コンストラクタの引数は、ボリュームなどを音声ごとに細かく設定できるようにするチャンネル分けのためと思いますが。 その場合は、 this.soundCtl = new Sound(); ↑ この部分は this.soundCtl = new Sound( target ); でなければ、意味がないと思います。
お礼
>this が指す対象の変化 >loadComplete メソッド内の this.soundCtl.start は soundCtl.soundCtl.start を指定している こちらの考えに至らず、思考がずっと同じところをぐるぐる回っておりました。 上で記して頂いた通りに修正しましたところ、問題なく希望通りの動作を確認できました。 また、ソースの不備にもご指摘下さいましてありがとうございます。 ご指摘の通りだと思います。 お忙しい中、丁寧な解説でご回答下さいまして誠にありがとうございました。 心より御礼申し上げます。