サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

Sound.loadSoundメソッドでイベントサウンドを読込んで再生する

ID: FN0303001 Product: Flash

Platform: All
Version: MX and Above

'Sound.loadSound'メソッドは、外部MP3ファイルをイベントサウンドとしてロードすることもできます。しかし、イベントサウンドを再生する場合には、考慮すべき点があります。

イベントサウンドはデータを完全にロードしないと、再生できません。したがって、外部MP3ファイルを読込んで再生するには、ロードの完了を待たなければなりません。サウンドのロードを確認するメソッドとして、Soundオブジェクトには'Sound.onLoad'イベントハンドラメソッドがあります。

1. Sound.onLoadメソッドの定義
'Sound.onLoad'メソッドを使用するスクリプトの基本スタイルは、つぎのとおりです。

my_sound = new Sound(ターゲットMovieClip);   // [1]インスタンスの生成
my_sound.onLoad = function(success) {   // [2]イベントハンドラメソッドの定義
  if (success == true) {   // [3]ロードが正常に行われたことを確認
    // ロード完了時に行う処理
  }
};

[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: サウンド読込み用
// フレームアクション
my_sound = new Sound(this);   // [1]インスタンスの生成
my_sound.onLoad = function(success) {   // [2]イベントハンドラメソッド定義
  if (success) {   // [3]ロード結果の判定
    this.start();   // [4]サウンド再生
  }
};
my_sound.loadSound("test.mp3", false); //[5]サウンドファイルのロード

[1]コンストラクタで生成したSoundオブジェクトのインスタンスを、変数に格納します。
[2]Soundオブジェクトインスタンスに、'Sound.onLoad'イベントハンドラメソッドを定義します。
[3]サウンドのロードが、問題なく完了したかどうかを判定します。なお、'if'条件で変数successが'true'の場合という判定は、if (success == true)としなくてもif (success)のみで可能です(参考: [F-site: ActionScript 倶楽部]>[マニア]>[if (condition=1)] )
[4]ロードが無事完了したら、サウンドを再生します。
[5]ムービーと同階層のMP3ファイル"test.mp3"をイベントサウンドとしてロードします。

最後に、大事な注意が1点あります。'Sound.onLoad'イベントハンドラメソッドの定義は、'Sound.loadSound'の実行前に設定する必要があるということです。'Sound.loadSound'メソッドによる外部MP3サウンドファイルのロードを'Sound.onLoad'メソッドの定義より先に実行してしまうと、定義を処理したときにはすでに'onLoad'メソッドの呼出しが終わってしまっている可能性があります。

MP3サウンドファイルのサイズが比較的小さいときに、ローカルで実行したり、ブラウザのキャッシュに残っている場合には、'onLoad'メソッドが呼出されないという状況が発生しやすいです。いつまで経ってもロードが完了しないと勘違いしたり、'onLoad'が呼出されないバグだと早合点しがちです(「Sound.onLoadが実行されない」参照)。

このような場合には、'onLoad'メソッドを定義したときには、すでにロードが終わって'onLoad'メソッドの呼出しも済んでしまっているのです。これを避けるには、'Sound.onLoad'メソッドの定義をまず行ってから、'Sound.loadSound'を実行するのが確実です。

_____

作成者: 野中文雄
作成日: 2003年3月1日


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.