- ベストアンサー
シーンをまたいでのサウンド再生
初めて質問させて頂きます。flash初心者です。 今アニメーションを作っていまして、場面ごとにシーン分けをしています。 アニメーションの全体にBGMを流そうと思うのですが、シーン1でBGMは止まってしまいシーン2へ移るとサウンドは流れません。 何かActionScriptでやり方があるのでしょうか? どなたか回答をお願いします。 制作環境は Mac, FlashMX2004です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
サウンドをタイムラインに挿入すると、簡単に鳴らせますけれど、あまり融通が利きません。 スクリプトで鳴らすには、いろいろと下準備も必要で少々難しいのですが、細かい制御ができるのでオススメです。 スクリプトでサウンドを鳴らす時は、「リンケージ」という設定が必要です。 「ライブラリ」ウィンドウで、BGMとして鳴らしたいサウンドを選び、control +クリックで出すメニューから「リンケージ... 」を選択してください。「リンケージのプロパティ」パネルが開きます。 「リンケージ:」の項目にある「 ActionScript に書き出し」にチェックを入れると、他の項目も編集可能になります。 「識別子」の項目に、何か分かりやすい名前を入力してください。この名前は、スクリプトでサウンドを扱う時に必要になります。日本語はトラブルの元になりやすいので、半角の英数字と” _ ”だけで付けるといいでしょう。 ここでは仮に、「 bgm 」と付けたとします。 なお、「最初のフレームに書き出し」の項目は、チェックを外しておくことをおすすめします。 チェックを入れると、サウンドのデータが最初のフレームに書き出されます。 データが書き出されるだけで音は鳴らないのですが、フレーム1の容量が大きくなるので、Now Loading のアニメを作っている場合は、フレーム1のダウンロードに時間がかかり、このアニメがなかなか始まらなくなってしまいます。 しかし、ここにチェックを入れなければサウンドデータがムービーに書き出されず、スクリプトで鳴らそうとしても音が鳴らなくなってしまいます。 簡単な対策としては、Now Loading アニメの邪魔にならないフレームに仮にサウンドを挿入しておき、「プロパティ」パネルの「同期:」のリストから「ストップ」を選んで、最初は止めておく方法があります。 フレームに挿入されているのでデータは書き出されますが、スクリプトで指示するまでは音は鳴らない、という仕組みです。 以上で下準備は完了です。 次は、サウンドを鳴らすスクリプトを設定します。 BGMを鳴らしたい最初のフレームにキーフレームを作り、次のようなスクリプトを設定します。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります) //BGMを動的に挿入し、再生する bgm_obj = new Sound(); bgm_obj.attachSound( "bgm" ); bgm_obj.start(); //演奏終了時、自動的にループ bgm_obj.onSoundComplete = function() { this.start(); }; スクリプトでサウンドを操作するには、Sound クラスを使います。ヘルプで調べる時は、「 Sound クラス」の項目をご参照ください。ここでご紹介した以外にも様々な機能があり、タイムラインではできない面白い演出も可能です。 ムービーにデータを書き出すためにタイムラインにサウンドを仮に挿入していても、これはスクリプトでは制御できません。 スクリプトで制御するには、まず、attachSound でサウンドシンボルのインスタンスを挿入します。 この時に必要になるのが、先ほど「リンケージのプロパティ」で設定した識別子です。 あとは、Sound クラスの start メソッド(関数のようなもの)を実行すれば、音は鳴ります。 しかし、何も指示しなければ、BGMは1回再生されただけで終了してしまいます。 Flash MX からは、Sound.start(); での再生が終了した時にイベントが発生して、終了を検出できるようになりました。 この時に実行する処理を予め登録しておくと、再生終了時に自動的に実行されます。 この登録をしているのが、上記のスクリプトの bgm_obj.onSoundComplete = function ・・・ の部分です。 再生終了時に、再度サウンドを最初から再生するように定義することで、無限ループ再生になります。 上記のスクリプトで鳴らしたサウンドは、シーンが変わっても再生され続けます。 止めたい時は、 bgm_obj.stop(); というスクリプトを設定してください。 フレームでも、ボタンやムービークリップのインスタンスに設定するスクリプト(オブジェクトアクションといいます)でも構いません。 ただし、ムービークリップのインスタンスに設定する場合は、 _root.bgm_obj.stop(); となりますので、ご注意ください。 長くなってすみませんでした。 不明な点がありましたら、補足してください。
その他の回答 (1)
ぱっと思いついた方法です。 (思いついただけで,実験してないのですみません。) (また,他に良い方法があるとは思います。) まず,サウンド入りのムービーを用意して,そのムービーにムービークリップを用意します。 そのムービークリップ(のインスタンス名)をターゲットとして,作られた複数シーンをもつムービーをロードムービーされてはいかがでしょうか。 最初,HTMLの方で流し続ければ良いように思ったのですが,Flash的ではないので,上の方法を書いてみました。
お礼
回答いただいてありがとうございました。
お礼
とてもよく分かりました。ありがとうございます!早速実践してみます。