Macromedia Flash非公式テクニカルノート Sound.loadSoundメソッドでイベントサウンドを読込んで再生する
Platform: All 'Sound.loadSound'メソッドは、外部MP3ファイルをイベントサウンドとしてロードすることもできます。しかし、イベントサウンドを再生する場合には、考慮すべき点があります。 イベントサウンドはデータを完全にロードしないと、再生できません。したがって、外部MP3ファイルを読込んで再生するには、ロードの完了を待たなければなりません。サウンドのロードを確認するメソッドとして、Soundオブジェクトには'Sound.onLoad'イベントハンドラメソッドがあります。 1. Sound.onLoadメソッドの定義 my_sound = new Sound(ターゲットMovieClip); // [1]インスタンスの生成 [1]'Sound.loadSound'は、Soundオブジェクトのメソッドですので、第1ステートメントでまずオブジェクトのインスタンスを生成しています。Soundオブジェクトのメソッド(たとえば'Sound.onLoad')は、そのインスタンスをターゲットとして実行する必要があります。 インスタンスの生成というのは、サービスへの会員登録のようなものです。あるいは、銀行の口座開設と思ってもよいでしょう。会員登録や口座開設を済ませると、会員/口座番号が与えられます。以降は、そのID番号を使って、サービスを受けることができる訳です。インスタンス生成の処理を実行すると、ID番号の替わりに「インスタンス(の参照)」が返されます。その参照を変数に代入しておけば、以降変数に代入されたインスタンスをターゲットとしてSoundオブジェクトのメソッドを使用することができます。 'new Sound(ターゲットMovieClip)'がインスタンス作成の処理です。DateやArray、Objectなどのオブジェクトと同じく、インスタンスは'new'演算子で生成します。オブジェクトに対するこの処理を、一般に「コンストラクタの実行」といいます。コンストラクタを実行すると、オブジェクト(今回はSoundの)インスタンス(の参照)が返されます。その参照を変数に代入して、後のメソッドの実行に使います。変数名は任意です。上記のサンプルでは"my_sound"という変数名にしました。 なお、Soundオブジェクトのコンストラクタは、引数としてターゲットとなるMovieClipインスタンスを指定します。Soundオブジェクトを使ったサウンドの操作は、MovieClip(タイムライン)単位の処理になるのです。この引数を省くと、ムービー内のすべてのサウンドを対象として処理されます。 [2]第2ステートメントでは、'Sound.onLoad'メソッドに対して、ロード完了時に行う処理を'function'として設定しています。'function'を設定するには、イベントハンドラメソッドに(別途定義した)'function'名を代入するか、'function'を(「名前のない関数(匿名関数/関数リテラル)」で)直接記述します。 イベントハンドラメソッドを定義すると、イベント(この場合は変数のロード完了)が発生するたびにその'function'が呼出されて実行されます。イベントハンドラメソッドへの'function'定義というのは、'function'をそのイベント用のメモリに保存する操作です。これは、携帯の着メロ設定と同じです。サウンドを着メロのメモリに登録すると、着信(イベントが発生)するたびにメモリしたサウンド('function')が再生(実行)される訳です。 [3]Flash MXの「ActionScript辞書」に記載はありませんが、このメソッドが呼出されるときには、ブール(論理)値が引数として一緒に渡されます。サウンドのロードが正常に完了すると引数が'true'、そうでないときは'false'となります。ロード完了時の処理は、この値が'true'であることを確認したうえで行った方が確実です。また、'false'の場合の処理を加えると、トラブルが生じたときのエラー回避ができます。第3ステートメントでは、この引数の判定を行っています。 2 サウンドをロード後再生するスクリプトサンプル イベントサウンドは、データをすべてロードし終わってから再生します。データのサイズによっては、再生が可能になるまでに時間のかかる可能性があります。しかし、一旦読込んでしまえば、再生はスムーズです。また、Soundオブジェクトによるコントロール(メソッドの実行やプロパティの操作)を、すべてサポートします。 サウンドをロードするには、'Sound.loadSound'メソッドを使います。このメソッドの引数は、2つあります。第1引数が、ファイルのURLです。第2引数は、ブール(論理)値で指定します。'true'はストリーミングサウンド、'false'がイベントサウンドになります。 イベントサウンドは、読込んだだけでは自動的に再生されません。サウンドの再生には、'Sound.start'メソッドを使います。サウンドの再生は、データのロードが完了したときに実行します。したがって、'Sound.start'メソッドは、'Sound.onLoad'イベントハンドラメソッドに定義した'function'内に記述するのが適切でしょう。 使用するメソッドのご紹介は、すべて済みました。以下が、サウンドをロードして再生するスクリプトサンプルです。 // MovieClip: サウンド読込み用 [1]コンストラクタで生成したSoundオブジェクトのインスタンスを、変数に格納します。 最後に、大事な注意が1点あります。'Sound.onLoad'イベントハンドラメソッドの定義は、'Sound.loadSound'の実行前に設定する必要があるということです。'Sound.loadSound'メソッドによる外部MP3サウンドファイルのロードを'Sound.onLoad'メソッドの定義より先に実行してしまうと、定義を処理したときにはすでに'onLoad'メソッドの呼出しが終わってしまっている可能性があります。 MP3サウンドファイルのサイズが比較的小さいときに、ローカルで実行したり、ブラウザのキャッシュに残っている場合には、'onLoad'メソッドが呼出されないという状況が発生しやすいです。いつまで経ってもロードが完了しないと勘違いしたり、'onLoad'が呼出されないバグだと早合点しがちです(「Sound.onLoadが実行されない」参照)。 このような場合には、'onLoad'メソッドを定義したときには、すでにロードが終わって'onLoad'メソッドの呼出しも済んでしまっているのです。これを避けるには、'Sound.onLoad'メソッドの定義をまず行ってから、'Sound.loadSound'を実行するのが確実です。 _____ 作成者: 野中文雄 Copyright © 2001-2006 Fumio Nonaka. All rights reserved. |
|||