• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:異なるsoundを続けて再生する方法は?)

異なるsoundを続けて再生する方法は?

このQ&Aのポイント
  • FLASH MXを使い始めた初心者です。ボタンをクリックすると異なる音が連続して再生されるようにしたいです。どのようなアクションスクリプトを書けば良いでしょうか?
  • test.wavとtest2.wavという2つの音声ファイルをライブラリに取り込み、ボタンのアクションスクリプトでそれぞれ再生するようにしていますが、ほぼ同時に再生されてしまいます。より良い方法があれば教えてください。
  • ボタンをクリックしたときに異なる音を順番に再生したい場合、アクションスクリプトで新しいサウンドオブジェクトを作成し、それぞれの音声ファイルを指定して再生することができます。しかし、現在のアクションスクリプトではほぼ同時に再生されてしまう問題があります。解決策を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

サウンドを鳴らす start は”音を鳴らせ”という命令を出すだけで終了し、次のスクリプトがすぐに実行されます。 start を実行したら、そのサウンドが終了するまでスクリプトの実行が中断しているのではありません。 音を鳴らす命令を立て続けに出すと、複数の音が同時に再生されます。 同様の理由で、再生中に再度 Sound.start を実行すると同じ音が重複して鳴ってしまいます。 test1 が終了したら test2 を再生する・・・という場合は、test1 の再生の終了を待って test2 を鳴らす命令を出すようにします。 再生が終了したかどうかは、Sound オブジェクトの onSoundComplete というイベントを利用すると検出できます。 このイベントは、Sound.start によるサウンドの再生が終了した時に発生します。 onSoundComplete は、  objSound.onSoundComplete = function()  {   /*ここに、再生終了後に実行したい処理を書く*/  }; というように、行いたい処理を予め定義しておきます。 Sound.start による再生が終了した時は、onSoundComplete = function ・・・で定義した関数が自動的に呼び出されます。 ○○の次に△△の曲を再生するといった場合(同時に2種類以上鳴らさない場合)は、Sound オブジェクトを2つ用意する必要はありません。 attachSound で別のサウンドシンボルを関連付けると、次からは違う音が鳴ります。 test1 の後に test2 を鳴らすなら、test1が終了した時に attachSound で test2 に切り替えればいいだけなので、Sound オブジェクトは1つで済むのです。 ------------------------------------------------------------------ サウンドの制御ではいろいろなことができて作品も様々ですが、とりあえず  ・ test1 が終了したら test2 を再生する  ・ test2 が終了した時は音を止める  ・曲の再生中はボタンを押しても再生されないようにする  ・ボタンを押した時は必ず test1 から再生する という作例を考えます。 ステージにボタンシンボルのインスタンスがあるとします。 ボタンがムービークリップになっている時はターゲットパスが変わります。 ターゲットパスの話は、今回は割愛させていただきます。 下記のスクリプトをコピーする際は、必ずボタンシンボルで作ってください。 スクリプトは、メインのタイムラインのフレームとボタンインスタンスの2箇所に設定します。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります)  ●フレームに設定するスクリプト  //再生している曲のリンケージ識別子を保持  play_bgm = "test1";  //再生中かどうかを管理するフラグ  //再生時true、それ以外はfalse  play_flg = false;  //Soundオブジェクトの作成と再生終了後の処理の定義  objSound = new Sound();  objSound.onSoundComplete = function()  {   //test2が再生されている時は停止   if( play_bgm == "test2" )   {    play_flg = false;   }   //次の曲がある場合はそれを再生   else   {    this.attachSound( "test2" );    this.start();    //再生している曲名を記録    play_bgm = "test2";   }  };  ●ボタンに設定するスクリプト  on(release)  {   //既に再生中でなければ再生する   if( ! play_flg )   {    play_bgm = "test1";    objSound.attachSound( play_bgm );    objSound.start();    //重複再生防止:再生中であることを記録する    play_flg = true;   }  } 冒頭に書きました通り、ActionScript では Sound.start を実行するたびに音が鳴る仕組みになっていますから、ボタンが押された時に無条件で start が実行されると音が重複して鳴ってしまいます。 上記の例では、play_flg という変数に再生中かどうかの情報を記録し、これを見て再生するかどうかを判断します。 再生中は true 、停止している時は false です。 ボタンがクリックされた時、play_flg の値が false の場合に限り test1 から再生します。 test1 の再生が終了すると、フレームで定義しておいた onSoundComplete = function の部分が実行されます。 この中で、次に再生する曲を test2 に切り替えます。 test1 を鳴らしたのと同じ objSound という Sound オブジェクトですが、鳴らす音を attachSound で変更すると次からは test2 が鳴ります。 実は、test2 の再生が終了した時も onSoundComplete イベントが発生します。 今回は test2 が再生されたら音を止めるので、test2 が終了した時に再度 test2 が鳴ってしまっては困ります。 そこで、現在再生している曲の名前(リンケージ識別子)を、変数 play_bgm で管理することにします。 最初は test1 を再生しますから、play_bgm には” test1 ”という文字列を入れておきます。 test1 が終了し test2 に切り替わった時は、play_bgm の文字列も” test2 ”に書き換えます。 すると、onSoundComplete で定義した処理が両方の曲の終了時に呼び出されたとしても、どちらの曲が再生されていたのかが分かりますから、曲ごとに処理を分けることができます。 上記のスクリプトでは、test1 が再生されていた時は次の曲である test2 を再生し、test2 の場合は再生を終了します。 再生中かどうかを管理している変数 play_flg の値は、サウンドの再生が終了したからといって自動では変わってくれません。 ボタンをクリックすると、play_flg には true が入ります。 この値が false にならない限り、ボタンをクリックしても音は鳴りません。 test2 が終了した後は再びボタンで test1 から再生されるようにするには、test2 の終了時に play_flg の値を false にリセットすることをお忘れなく。 今回は2曲だけの例を考えましたが、例えば配列変数で曲のリストを作って順番に再生したり、コンボボックスから選んだ曲を再生するといったこともできます。 鳴っている曲や次に鳴らす曲を上手く管理すると、かなり凝ったミュージックプレイヤーも作れます。 ここでは使いませんでしたが、鳴っている音を途中で止めるには Sound.stop を使います。 繰り返しますけれど Sound.start は実行するたびに音が鳴りますので、再生中に違う音を鳴らしたい時は stop で先に鳴っている音を止めてください。 サウンドの制御は意外と奥が深く、このサイトでも様々な作例やサウンドに関するトラブルが話題になっています。 興味がありましたら探してみてください。

iou3
質問者

お礼

懇切丁寧な説明ありがとうございます。 おかげで、サウンドを続けて鳴らすことができました。 とても参考になりました。 ありがとうございました。

関連するQ&A