• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【複数の音声】スタート&ストップ)

複数の音声をスタート&ストップする方法とは?

このQ&Aのポイント
  • 簡潔にソースのどこが悪いか教えてください。
  • 音を複数出すために2種類の再生ボタンとストップボタンを用意したい。
  • ストップボタンを押すと対応した音が消えるようにしたいが、どうすればいい?

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

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

#1です。 Sound オブジェクト自身のターゲットパスや new Sound の引数のターゲットパスに誤りがないことを前提に、話を進めます。 他にも、Sound オブジェクトがあるムービークリップのものになっている場合、持ち主のムービークリップがステージから消えると Sound オブジェクトも一緒に消えてしまい、以降はこの Sound オブジェクトを利用できなくなります。 こんなことにならないように、ムービー全編にわたって使う Sound オブジェクトは、メインのタイムラインのフレームアクションで new Sound を実行して _root に用意しておくといいでしょう。 以下は、この手のミスではないものと仮定しての話です。 スクリプトで音を鳴らしたいフレームに、ムービークリップ” sound_mc ”が存在していますでしょうか? Flash では、ムービークリップが音を出力するチャンネルの役割を果たします。 new Sound は、”このムービークリップの音を制御する”という定義であると同時に、”この Sound オブジェクトで扱う音はこのムービークリップを介して出力する”と約束するもの、とも言えます。 new Sound を実行するフレームに引数で指定したムービークリップがあれば、そのムービークリップから音を出力する Sound オブジェクトが作られます。 ムービークリップがステージから消えると、Sound オブジェクトだけ残っていても、音を出力するチャンネルが失われるために音が鳴らなくなってしまいます。 ***************************** #1に書きました通り、スクリプトで単純に音を出すだけならムービークリップの内容は関係ありません。 絵や音が挿入されていないムービークリップでも、音を出すチャンネルとして使うことができます。 createEmptyMovieClip や attachMovie などで後から動的に追加したムービークリップは、removeMovieClip で破棄されるまでステージに存在し続けます。 つまり、1度  _root.createEmptyMovieClip( "○○○" , 0 );  snd = new Sound( "○○○" ); というように定義しておくだけで、タイムラインの進行を気にせずどのフレームからでも snd を通して音を制御できるので、扱いは楽です。 タイムラインで配置したムービークリップをチャンネルにする場合は、タイムラインの構成によってはステージからなくなってしまうことがありえますから、注意が必要です。 例えば、フレーム1~ 15 までのムービーで、全編を通じて sound_mc の音を制御する Sound オブジェクト mySound で音を制御したいのなら、sound_mc もフレーム1~ 15 まで、常にステージに存在するようにタイムラインを構成しなければなりません。 sound_mc がステージに存在しないフレームでは音が鳴らなくなります。 レイヤーを分けて sound_mc を配置した時は、フレームを追加し忘れていて、フレーム2に移った途端に sound_mc がステージから消える構成になっていた・・・ということもあります。 sound_mc がタイムラインで配置したムービークリップでしたら、このあたりを確認してみてください。 なお、シーンを移動するなど同じ sound_mc を続けて配置できない場合でも、何かムービークリップを配置して” sound_mc ”とインスタンス名を付けておくと、この sound_mc が音を出すチャンネルになります。

dizzdive
質問者

お礼

基本的な概念が理解できました。 本当に助かりました。 ありがとうございます。

その他の回答 (1)

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

まずは解決方法ですが、方法は3つあります。 分かりやすいのは、” bgm01 ”と” bgm02 ”というインスタンス名を持つムービークリップを配置することです。 スクリプトで空っぽのムービークリップを作ることもできます。 フレームのスクリプトの最初に (↓各行頭に全角のスペースが入っています。コピーする際はご注意ください)  //ダミーのムービークリップを作る  _root.createEmptyMovieClip( "bgm01" , 1 );  _root.createEmptyMovieClip( "bgm02" , 2 ); というスクリプトを追加してみてください。 既に a と b というムービークリップのインスタンスがあるのですから、わざわざムービークリップを作らずに、new Sound の引数を  //サウンド・クラスのインスタンスを生成  _root.a.bgm01 = new Sound( _root.a );  _root.b.bgm02 = new Sound( _root.b ); このように書き換える方法もあります。 最後の方法は、細かいことを言うと少々問題アリではありますが、停止するボタンにある stop の部分を  _root.a.bgm01.stop( "bgm01" ); と  _root.b.bgm02.stop( "bgm02" ); に変えてみてください。 他のところをいじらなくても、それぞれに対応したボタンでのみ止まるようになります。 ------------------------------------------------------------------- Sound オブジェクトを作る new Sound に指定する引数は、どのムービークリップの音を制御するかの指定です。 ですから、ここに指定するのは”ムービークリップのターゲットパス”です。 省略した場合、もしくは指定されたインスタンスが存在しないなど初期化に不備があった場合は、_root 、つまりムービー全体の音を制御する Sound オブジェクトが作成されます。 ご質問文のスクリプトですと、Sound オブジェクト a.bgm01 はムービークリップ bgm01 の、b.bgm02 はムービークリップ bgm02 の音を制御することにする、という意味になります。 しかし、実際には bgm01 と bgm02 というインスタンス名を持つムービークリップは存在しません。 従って、この2つの Sound オブジェクトは両方とも _root の音を制御する Sound オブジェクトになります。 ここでは詳しくは書きませんが、_root の音を制御する Sound オブジェクトの stop(); を使うと、ムービー内で鳴っている全ての音が停止します。 どちらのボタンをクリックしても両方とも音が止まってしまうのは、このためです。 そこで、3通りの解決方法が出てくるわけです。 1つは、Sound オブジェクトが制御することになっている、bgm01 と bgm02 というムービークリップを作ってあげることです。 指定したムービークリップがないためにどちらも _root の音を制御する Sound オブジェクトになっていて問題が起きているのですから、これらのムービークリップが存在していれば解決です。 2つめは、既存のムービークリップを使う方法です。 スクリプトで動的に音を鳴らすだけなら、制御するムービークリップは現在ステージに存在しているムービークリップでさえあれば何でもいいのです。 絵があるか、サウンドシンボルがタイムラインに挿入されているかどうかなどは全く関係ありません。1番めの方法で空っぽのムービークリップを作っても上手くいくことからみても、ムービークリップの内容が無関係であることが分かるかと思います。 先述の通り、原因は new Sound に指定したムービークリップが存在しないことです。 1番めの方法が指定した名前を持つムービークリップを作ることに対し、この方法は、実際に存在しているムービークリップを利用するように引数の方を変更するという発想です。 3つめは、動作はともかく、ちょっと問題含みの方法です。 bgm01 と bgm02 というムービークリップがない場合、2つの Sound オブジェクトはともに _root の音を制御するオブジェクトになります。 しかし、もしも複数の Sound オブジェクトが同じムービークリップの音を扱っていたとしても、stop にリンケージ名を指定すれば特定の音だけを止めることができます。 この件は、以前、別の質問で説明したことがあります。少々複雑な話ですが、よろしければご参照ください。#2で説明しております。  ・ActionScriptで対象外の音まで止まる・・・。   http://okwave.jp/qa2164298.html ただ、今回の件では、意図した通りの初期化が行われていないけれど何とか帳尻を合わせるという感じです。 不正な初期化を行ってしまったために内部で調整された結果を利用し、たまたま上手くいっているようなスクリプトは、それだけで問題があります。 Flash の音の制御は意外と奥が深く、このサイトでもしばしば、いろいろな作例や音に関するトラブルの質問が出ています。 興味がありましたら調べてみてください。

dizzdive
質問者

補足

違う方法で自分が思った通りのことができたのですが、 まず、フレーム1に bgm1とつけたリンケージの音楽素材を ストップさせておきます。 再生のボタンを作ります。 ASは下記の通り↓ on (release) { mySound = new Sound(sound_mc); mySound.attachSound("bgm1"); mySound.start(); } ストップのボタンは↓ on (release) { mySound.stop("bgm1"); } これでbgm2の分もつくればOKなんですが サンプルテストで判りやすいと思って やったことですが、 私が処理したいタイミング。 ボタンなしで、 フレームが切り替わった時に 鳴らしたいのです。 ボタンの中のASでは音がなりますが ボタン以外でフレームに書き込んだ場合は 音が鳴らないのは何故でしょうか??