- ベストアンサー
BGMのon/offボタンについて
はじめまして flashでサイトを制作しているのですが 行き詰まってしまったので 質問させてください。 http://namatamago.com/index_f.shtml ↑上記サイト様において、右下にあるような BGMのon/offがひとつのボタンでできる 切り替えボタンを作りたいのですが いまいち作り方がわかりません。 このようなボタンの作り方を教えて下さい。 よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
任意のタイミングでサウンドを鳴らしたり止めたりするのはタイムラインでは難しいので、スクリプトでサウンドを制御する方が簡単です。 お使いの Flash のバージョンが分かりませんが、とりあえず Flash MX 以降として話を進めます。 スクリプトでサウンドを鳴らすには、まず、リンケージという設定が必要です。 「ライブラリ」パネルのサウンドシンボルを選択した状態で、右クリック( Mac では control +クリック)のメニューから「リンケージ...」を選択してください。「リンケージプロパティ」パネルが開きます。 「 ActionScript に書き出し」にチェックを入れると、他の項目が編集可能になります。「識別子」の項目に、何か名前を付けてください。この名前は、スクリプトでサウンドを扱う時に必要になります。 ここでは仮に、” BGM ”と付けたとします。 「 ActionScript に書き出し」にチェックを入れた時に、同時に「最初のフレームに書き出し」の項目にもチェックが入ります。 このシンボルをフレーム1に書き出すかどうかの設定ですが、サウンドシンボルの場合はこのチェックを外しておいた方がいいかもしれません。 フレーム1から読み込みのアニメ( Now Loading 画面)を作っている場合は特に、サウンドの巨大なデータがフレーム1に書き出されると読み込みのアニメがなかなか始まらなくなってしまいます。 しかし、この項目にチェックを入れなかったシンボルはムービーに書き出されなくなるため、このままでは使用できません。 シンボルのデータはタイムラインに挿入してあれば、最初に登場するフレームに書き出されるという特徴があります。 この点を利用して、読み込みのアニメの邪魔にならないフレームにサウンドを挿入しておき、「同期:」の項目から「ストップ」を選んで再生されないようにしておくと、任意のフレームにサウンドシンボルを書き出すことができます。 以上で、リンケージの設定は完了です。 ----------------------------------------------------------- スクリプトでサウンドを制御するには、Sound クラス( Flash MX 以前はオブジェクト)を使います。 1つのボタンでBGMの ON / OFF を切り替えるには、クリックした時にBGMが再生中かどうかの情報が必要です。 Sound クラスが持っている様々な機能(メソッドといいます)で音を鳴らしたり止めたりすることはできますが、今、再生中かどうかを判別するメソッドはありません。 そこで、変数を1つ用意して、再生中かどうかの情報を記録しておきます。仮にこの変数を” play_flg ”とし、再生中であれば true 、停止している時には false を入れるとします。 1つのボタンで ON / OFF を切り替えるなら、このボタンは再生中の時と停止中の場合とで絵を変えた方が、見ている人にも分かりやすくなります。 この仕掛けは、ON / OFF ボタンをムービークリップとして作り、マウス操作に応じてフレームを切り替えて作ると簡単です。 再生中かどうかの情報は、play_flg という変数の中に記録されています。 せっかくこのような情報があるのですから、この変数の値を利用してフレームを切り替えられるようにムービークリップを作っておきましょう。 play_flg の中身は true か false (ブール値といいます)で、このままではフレームの番号には使えません。 しかし、Number というアクションを使うと、ブール値も数値に変換できます。true は 1 に、false は 0 に変換されます。 つまり、ON / OFF ボタンをムービークリップとして作り、フレーム1に OFF、フレーム2に ON の時に表示する絵を描いておけば、play_flg + 1 で再生状況に応じたフレームを算出できます。 ムービークリップができたら、これをステージに配置します。 ON / OFF ボタンがステージに常に存在していて、ムービーが再生されている間は消えることがないとしますと、BGMの ON / OFF を切り替えるスクリプトは大体、次のようになります。 このスクリプトは、ON / OFF ボタンとして使うムービークリップのインスタンスに設定してください。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください) onClipEvent(load) { //サウンドを挿入 snd = new Sound(); snd.attachSound( "BGM" ); //無限ループ再生設定 snd.onSoundComplete = function() { this.start(); }; //サウンドの再生状況を保持する変数 //再生時true、それ以外はfalse play_flg = false; //再生状況に応じたフレームを表示 gotoAndStop( Number( play_flg ) + 1 ); } on(release) { //サウンド再生時は止める if( play_flg ) { snd.stop(); play_flg = false; } //停止中の場合は再生する else { snd.start(); play_flg = true; } //再生状況に応じたフレームを表示 gotoAndStop( Number( play_flg ) + 1 ); } リンケージで設定したサウンドシンボルは、Sound クラスの attachSound メソッドでムービーに挿入できます。 attachSound はサウンドシンボル(のインスタンス)を挿入するだけで、これではサウンドは鳴りません。 再生には Sound クラスの start メソッドを使います。 start で鳴らしたサウンドは、stop メソッドで止めることができます。 上記のスクリプトでは最初は音を鳴らさず、ムービークリップをクリックすると再生、次にクリックすると止まります。 クリックするごとにBGMの ON / OFF を切り替えるとともに変数 play_flg の値を書き換え、再生状況を更新します。 ON / OFF ボタンのムービークリップがステージから消えると Sound クラスのオブジェクト(上記の例では snd )も消えてしまい、ややこしいことになります。 ON / OFF ボタンがタイムラインから消える場合は、Sound クラスのオブジェクトや play_flg をメインのタイムライン( _root 階層)に置いてください。 ただし、この場合はターゲットパスが必要になります。 ターゲットパスについては、今回は割愛させていただきます。解説書や解説サイト等をご参考になさってください。 ちなみに、別の質問でロールオーバーやクリックした時にも絵を変える ON / OFF ボタンの作り方をご紹介しましたので、よろしければご参照ください。 #2で、回答しております。 今回と同じ発想ですが、Sound オブジェクトや再生状況を管理する変数が _root 階層にあるものとしています。 ・soundのon/offボタンの作成について http://okwave.jp/kotaeru.php3?q=1771670
お礼
DPEさんの仰るとおりにやってみたら なんとかできました! とても丁寧に解説して頂いて感謝しています 本当にありがとうございました。