• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:とめたBGMをもう一度ならしたい)

BGMを再生する方法とは?

このQ&Aのポイント
  • メインのswfファイルと外部swfファイルのBGMがダブらないようにするための方法は?
  • アニメーションを閉じてメインのswfに戻ってきた時に、停止してしまったBGMを再生する方法は?
  • closeBTをクリックしてメインのswfのBGMを再開する方法は?

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

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

音を細かく制御したい時は、タイムラインに挿入するよりも ActionScript の Sound クラス( Flash MX 以前はオブジェクト)で動的に挿入して鳴らした方が、融通が利きます。 ActionScript で音を鳴らす手順ですが。 基本的には、Sound クラスの attachSound でサウンドシンボルのインスタンスを挿入し、音を鳴らしたいところで、同じく Sound クラスの start を実行すれば音が鳴ります。 一度 attachSound で挿入した音は、好きな時に止めたり鳴らしたりできるほか、タイムラインで鳴らしている音にはできない、細かいエフェクトをかけることも可能です。 attachSound を利用するには、リンケージという設定が必要です。 「ライブラリ」でサウンドシンボルを選び、右クリック( Mac では control +クリック)でメニューを出してください。「リンケージ...」という項目があるので、これをクリックしますと、「リンケージのプロパティ」パネルが開きます。 「リンケージ:」のところにある「 ActionScript に書き出し」にチェックを入れると、「識別子」などの項目も設定できるようになります。 「識別子」は、attachSound でどのサウンドデータを挿入するかを指定する際に必要です。日本語はトラブルの原因になりやすいので、できるだけ英数字と半角の記号だけで、分かりやすい名前を付けてください。 なお、「最初のフレームに書き出し」という項目がありますが、サウンドの場合はチェックを入れない方がいいかも知れません。 「最初のフレームに書き出し」を有効にすると、パブリッシュの時に、サウンドのデータがフレーム1に書き出されます。 フレーム1に書き出されていても音は鳴らないのですが、例えばフレーム1から Now Loading のアニメを作っている場合は、フレーム1の容量が大きくロードに時間がかかるため、Now Loading のアニメがなかなか始まらなくなってしまいます。 しかし、最初のフレームに書き出さない場合は、スクリプトで利用していてもサウンドシンボルは書き出されず、音は鳴りません。 タイムラインに挿入してあれば、サウンドシンボルは書き出されます。この点を利用して、フレーム1以外のフレーム、Now Loading 画面を作っている場合はロード画面終了後のフレームなどに仮にサウンドを挿入し、「同期」のリストから「ストップ」を選んで止めておく、という方法がオススメです。 この方法なら Now Loading アニメの障害にもなりませんし、サウンドデータが書き出されているわけですから、Sound クラスで制御できます。 例えば、メインの swf ファイルで鳴らす BGM は、リンケージの識別子に「 Main_BGM 」という名前を付けてあるとします。 この BGM を ActionScript で鳴らすスクリプトは、大体、次のようになります。 (↓各行頭に全角のスペースが入っています。コピーして利用する際はご注意ください)  //オブジェクトを生成  main_bgm = new Sound();  //BGMを挿入  main_bgm.attachSound( "Main_BGM" );  //演奏終了時、自動的にループ  main_bgm.onSoundComplete = function()  {   this.start();  };  //演奏開始  main_bgm.start(); onSoundComplete は Flash MX 以降で使えるイベントで、Sound.start で鳴らした音の再生が終了した時に発生します。 よって、このイベントが発生した時にもう1度最初から演奏させると、BGM が無限ループになります。 main_bgm.start(); 以外の処理は、1度だけ実行すれば充分です。何か初期設定をしているフレームなどがあれば、そちらで済ませておいても構いません。 あとは、main_bgm.start(); を実行するたびに BGM が鳴ります。止めたい時は、  main_bgm.stop(); で、止めることができます。PlayBT がクリックされて読み込みを始める時などに、実行してください。 読み込まれたムービーの BGM は、closeBT で削除される時に自動的に止まりますので、特に問題はないと思います。 最後に、level3 の closeBT からメインの BGM を制御する方法ですが。 ActionScript は、目的のインスタンスや変数・関数などの位置にうるさい言語です。位置の指定が間違っていると、エラーにはならないものの、期待した動作にはなりません。 しかし、位置の指定さえ間違っていなければ、他の階層にあるインスタンスや変数・関数であっても利用することができます。 メインの BGM を管理しているのは、level0 のムービーが持っている main_bgm という Sound オブジェクトです。このオブジェクトを level3 のムービーから制御するには、  _level0.main_bgm.・・・ このように、レベルを指定することで利用できます。 つまり、closeBT からメインの BGM を鳴らすスクリプトは、  on(release)  {   /*ここにアニメムービーの削除処理を書く*/   //メインのBGMを再開   _level0.main_bgm.start();  } といった具合になります。 Sound.start(); で鳴らす音は「イベント」サウンドです。 編集画面で「同期」の項目から選べる「スタート」は、1度鳴らしたら、その再生が終わるまで次の再生は行われません。 しかし「イベント」は、前の再生が終わっていなくとも、再生命令が出るたびに再生されます。 例えば、全てのアニメムービーが消えている時に closeBT が押されますと、もう1度メインの BGM の再生命令が出て、メインの BGM がダブって鳴ってしまいます。 そうならないように、メインの BGM が鳴っている時は closeBT を押せないようにするか、あるいは if 文で条件を監視し、_level0.main_bgm.start(); を実行しないようにするなどの工夫も必要になるかと思います。 長くなってすみませんでした。 不明な点がありましたら、補足してください。

pochi-pocchi
質問者

補足

お返事遅くなって申し訳ございません&ありがとうございます。 最初はいろいろできるようにとSoundオブジェクトを作っていたのですが、 いろいろするためのActionScriptが分からず、フレームに入れてたんですが、 ぜひ試してみたいと思います。 一つ疑問があるので質問させてください。 私が作ったやつは、 シーン1: Now Loading シーン2: Nenu画面 シーン3&4: 内容 シーン5&6: 内容 シーン7: ED 実際とは違いますが、こんな感じのシーンの分け方になっているんです。 前にSoundオブジェクトを作ってたのは、シーン2からEDまで同じBGMを鳴らしていたかったため、 シーン2の1フレーム目に作っていました。 シーンが変わっても止めない限り、ずっとなり続けてると聞いていたので、最初だけに作ったんです。 PlayBTがあるのは、シーン5&6なんです。(書いてあるActionScriptも、loadされるswfファイルも全く同じものです) PlayBTでムービーを読み込んでcloseBTで閉じた場合、表示されるのは当然、シーン5のPlayBTで読み込んだならシーン5のPlayBTがあるフレームだし、シーン6のPlayBTならシーン6のPlayBTがあるフレームってなっています。 Soundオブジェクトを作ったのはシーン2のみでcloseBTで閉じて表示されるシーン5や6には、Soundオブジェクトがないわけですけど、 それでもできるのでしょうか? 分かりづらい説明で申し訳ございませんが、お願いします。

その他の回答 (1)

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

シーン2で定義した Sound オブジェクトが、シーン5や6でも利用できるかどうか、ということですよね。 もちろん、利用できます。 シーンは、ロード画面や選択画面などの場面ごとに分けてムービーを制作・管理できるようにと、取り入れられている概念です。 しかし、複数のシーンで区切られているムービーでも、Flash の中では一続きのムービークリップ(ムービーそのものもムービークリップの1つです)と同じ扱いです。あるシーンにあった変数や関数などが、シーンを移動した時にクリアされてなくなってしまうようなことはありません。 ただし、当然のことながら、利用したい変数や関数、今回の場合はサウンドシンボルが、利用する場所よりも先に定義されていることが条件です。 ActionScript で鳴らした音も、特に明示的に止めない限りは、シーンが変わってもスクリプトの設定に従って再生され続けます。 単純に Sound.start(); としますと、サウンドデータの最初から1回限りの再生となりますが、#1に書きました通り、onSoundComplete を利用して無限ループ再生にすることもできます。 ( onSoundComplete は、Flash MX 以降、プレイヤーは Flash Player 6 以降で使用可能です。それ以前の Flash にはないスクリプトですので、ご注意ください) 1度定義した Sound オブジェクトや attachSound ・ onSoundComplete の設定は、削除・変更等の指示をしなければ、シーンが変わっても有効です。1回定義しておくだけで、あとはどのシーンが再生されていても、いつでも Sound.start(); や Sound.stop(); で再生・停止させることができます。

pochi-pocchi
質問者

お礼

ありがとうございました!! 教えてもらったとおりのスクリプトを書き込んだら、ちゃんとできました。 前々からの疑問も解けてスッキリです! 本当助かりました。ありがとうございます。 初心者の私にも分かるように、詳しく書いてくださって本当、感謝しております。

関連するQ&A