• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【Flash】レベル0に配置したムービーのボタンを非アクティブにするには)

Flashでムービーのボタンを非アクティブにする方法

このQ&Aのポイント
  • Flashで作成したムービー中に配置されたボタンがアクティブになってしまう問題があります。この問題を解決するために、同一レベルでの読み込みや特定のボタンの挙動制御などの方法を試してみましたが、うまくいきませんでした。バグや仕様上の制約なども考えられますが、解決策についてアドバイスをいただければ幸いです。
  • また、ムービー中に共通の音楽を再生/停止するボタンを配置する予定ですが、レベル1で読み込んでいるムービーについて、トップのムービーに記述すれば有効になるのか疑問です。共通のデザイン要素としてフッタに配置する予定ですので、効果的な実装方法についても助言をいただければ助かります。
  • 質問がやや複雑で、解決策が見つからず困っています。Flashで作成したムービー中のボタンが意図せずアクティブになってしまう問題を抱えています。同一レベルでの読み込みや特定のボタンの制御などの方法を試しましたが、解決に至りませんでした。また、共通の音楽再生/停止ボタンの実装方法についても迷っています。解決策が分かる方がいらっしゃいましたら、アドバイスをお願いします。

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

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

Flash MX 以降をお使いでしたら、ボタンとしての機能を操作する enabled というプロパティがあります。true でオン、false でオフになります。 このプロパティを、ムービーを読み込む前に false に、読み込んだムービーが削除される前に true に直しておくという方法はいかがでしょう。 例えば、load_btn というボタンがあるとしますと、  load_btn.enabled = false; とすると、クリックやロールオーバー・ロールアウトの検出が行われなくなります。 なお、ボタンのターゲットパスは、on*** = function() のスタイルで書く場合と on アクションの中で書く時とでは違いますので、注意が必要です。 この件は以前他の質問で詳しく説明したことがありますので、よろしければご参照ください。  ・ボタンの無効化   http://okweb.jp/kotaeru.php3?q=1245949 Flash では、目的のもの(変数・関数・インスタンスなど)までのターゲットパスさえ正しければ、どの階層からでも他の階層にあるターゲットを操作することができます。 レベル1に読み込まれた 2.swf から、レベル0の top.swf にあるボタン load_btn は  _level0.load_btn.enabled = true; このように、レベルを指定してターゲットパスを書くことで操作できます。 --------------------- サウンドの制御には様々な方法がありますが、ボタン操作でオン・オフを切り替える場合は、タイムラインに挿入せず ActionScript で動的に挿入し、制御する方法がオススメです。 ActionScript で音を鳴らすには、リンケージという設定が必要です。 ライブラリのサウンドシンボルを選び、右クリック( Mac では control +クリック)のメニューから「リンケージ...」を選択してください。「リンケージプロパティ」パネルが開きます。 「 ActionScript に書き出し」にチェックを入れ、識別子に名前を入力してください。 「最初のフレームに書き出し」のチェックは外した方がいいでしょう。ここのチェックを入れると、サウンドデータがフレーム1に書き出されるため、ロード画面を作っている場合はロードのアニメがなかなか始まらなくなってしまいます。 しかし、データをフレーム1に書き出さない場合は、別途サウンドシンボルを読み込む、あるいは他のフレームに書き出しておくなどの処理をしなければ、音が鳴らなくなってしまいます。 簡単な対策としては、ロードアニメの邪魔にならないフレームに、タイムラインを使ってサウンドインスタンスを仮に挿入し、「同期:」のリストから「ストップ」を選んで停止しておくといった方法があります。 スクリプトで音を鳴らすには、まず Sound クラス( Flash MX 以前はオブジェクト)を1つ作り、attachSound でサウンドを挿入します。 あとは、音を鳴らしたいところで Sound.start 、止めたいところで Sound.stop を実行するだけです。 また、Flash MX からは onSoundComplete というイベントが使えるようになりました。 再生が終了した時に発生するイベントで、予め処理を定義しておくと、再生終了時に自動的に呼び出されます。 これを利用して、再生終了後に再び start を実行するように定義すると、サウンドを無限ループ再生にすることもできます。 1つの Sound オブジェクトでは、1つの音しか管理できません。 例えば、top.swf と 2.swf とでは別々の BGM を鳴らしたい場合は、両方に1つずつ Sound オブジェクトを作ってそれぞれのムービーの BGM を管理し、再生・停止ボタンで操作する時は、レベルを指定して Sound オブジェクトを呼び出すといった方法があります。 ちなみに、レベル1にムービーを読み込んでいても、レベル0で演奏中の BGM は、特に明示的に止めない限り演奏は続きます。top.swf と 2.swf とで同じ BGM を鳴らしておきたい時に利用してください。 スクリプトはいろいろ考えられますが。 top.swf と 2.swf で同じ名前の Sound オブジェクトを作り、これとは別に変数をもう1つ用意して、現在アクティブになっているレベルを管理します。 仮にこの変数を active_level 、Sound オブジェクトを snd すると、  //アクティブになっている方のBGMを鳴らす  this[ "_level" + active_level ].snd.start(); という使い方もできます。 active_level の値は、最初は0、2.swf が読み込まれる時に1、2.swfが削除される前に0に戻しておきます。 ( 2.swf から操作する時は、_level0.active_level というターゲットパスになります) すると、再生・停止ボタンはレベル0の top.swf に1つしかなくても、top.swf と 2.swf の BGM をそれぞれ制御できるようになります。 ところで、ActionScript の Sound オブジェクトは  snd = new Sound(); このようにして作りますが。 Sound(); の ( ) の中には、サウンドを管理するムービークリップの名前を指定します。省略した場合は、ムービー全体のサウンドを管理するオブジェクトになります。 2.swf で作る Sound オブジェクトでは、  snd = new Sound( _root ); または  snd = new Sound( this ); このようにターゲットを指定してください。 指定しないと、top.swf で読み込まれた時に音が鳴らなくなります。 ActionScript で鳴らす音は、イベントサウンドといって、start を実行する度に再生されます。 いつでもクリックできる再生ボタンを作る場合は特に、ボタンが押される度に start を実行されるようになっていると、輪唱のように音が同時にダブって鳴ってしまう可能性があります。 回避策としては、演奏中かどうかの情報を変数に保存し、その値を見て start を実行するかしないかを決めるといった方法があります。 これについても、以前他の質問でご紹介しましたので、よろしければご参照ください。  ・音の再生について   http://okweb.jp/kotaeru.php3?q=1230063 長くなってすみませんでした。 不明な点がありましたら、補足してください。

5tanda
質問者

お礼

詳しい解説ありがとうございます! とても参考になりました。。。

すると、全ての回答が全文表示されます。

関連するQ&A