• ベストアンサー

soundのon/offボタンの作成について

WinXP Flash MX 2004でflashのコンテンツを作っています。 音が出るようになっているのでサウンドのon/offボタンを作りました。 on/offの切り替えは出来るのですがそのボタンに現在の状況を表示させたいと思っています。 サウンドonの時・・・ボタンの絵が「音がでている絵」 サウンドoffの時・・・ボタンの絵が「音がでていない絵」 フラグを立てて、ボタンの中に絵が二種類入っているmcを入れて、フラグをチェックするようにしたのですがボタンの中に入っているmcをうまく制御することは出来ませんでした。 (同じmcをボタンの外にだすと、フラグによって絵が変わるのは確認しました。) ちなみにボタンの絵は、 アップの時、黒い絵 オーバーの時、赤い絵 ダウンの時、赤い絵で右に1px、下に1pxずれます。(ボタンを押し込んだ感じです。) サンプルやヒントになるものがありましたらご教授ください。 よろしくお願いします。

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

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

ActionScript には階層という考え方があり、基本的には階層単位で操作します。 階層とは簡単に言いますと、個々のタイムラインのことと考えてください。 ボタンシンボルは特殊なフレームが4つあるだけで、タイムラインがありません。 ですから、ボタンのインスタンスは1つの階層とは見なされず、変数や関数、他の階層を子として持つこともできません。 ボタンシンボルのフレームにはムービークリップを配置できますが、このムービークリップにインスタンス名を付けても、スクリプトでは制御できないことになっています。 Flash MX 2004 の1世代前にあたる Flash MX からは、ムービークリップもボタンと同様に扱えるようになりました。 ご質問のようなボタンは、ボタンシンボルではなくムービークリップで作った方が簡単だと思います。 ただし、ボタンはマウスカーソルが重なった時やクリックした時に自動的にフレームを切り替えてくれる機能がありますが、ムービークリップにはそのようなサービスがありません。 マウス操作に応じてフレームを切り替えるには、スクリプトでその機能を自前で作る必要があります。 フレームの切り替えは gotoAndStop でフレームを移動するだけですから、それほど難しい話ではありませんのでご安心ください。 ------------------------------------------------- まず、ボタンをムービークリップシンボルとして作ります。 フラグにサウンドの ON / OFF を記録しているとのことですから、この値を利用してフレームを切り替えられるような構成にすると、スクリプトもスッキリまとまります。 仮にフラグを play_flg とし、サウンド再生中は true 、それ以外の時は false を入れるものとします。 Number というアクションを使うと、指定の表現を数値に変換することができます。Number アクションでは、ブール値である true は 1 に、false は 0 に変換されます。 ムービークリップのタイムラインは、フレーム1から始まります。 合わせて考えますと、フラグに ON / OFF の状況を true と false で記録し、サウンド OFF の時の絵をフレーム1に、ON の時の絵をフレーム2に描いておくと、フラグの値を数値に変換した値 + 1 のフレームを表示させることで、該当する絵を表示できることになります。 今回はロールオーバーでも色を変えたいとのご希望ですので、もう少し考えてみましょう。 ロールオーバー時に色を変えるには、ロールオーバーの時の絵と、カーソルが重なっていない通常時の絵が必要です。 また、それぞれサウンド ON とサウンド OFF の2種類の絵が必要ですから、ダウンの時も合わせますと、合計6つの絵が必要です。 これらの絵も先の方法と同様に考えて、先のフレームに OFF の絵、その次のフレームに ON の絵というように、ON / OFF の絵を対にしてフレームに配置します。 例えば、  フレーム1:「アップ」時のサウンドOFF  フレーム2:「アップ」時のサウンドON  フレーム3:「オーバー」時のサウンドOFF  フレーム4:「オーバー」時のサウンドON  フレーム5:「ダウン」時のサウンドOFF  フレーム6:「ダウン」時のサウンドON このようなフレーム構成にするとしますと、表示するフレームは、  ・通常時     :play_flg + 1  ・ロールオーバー時:play_flg + 3  ・ロールアウト時 :play_flg + 1  ・クリックした時 :play_flg + 5  ・ボタンを離した時:play_flg + 3 として、算出できます。 スクリプトにしてみますと、大体、次のようになります。 サウンドの ON / OFF はできているとのことですから、おそらく、スクリプトでのサウンドの制御は完成していると思います。 仮に、サウンドを制御する Sound オブジェクト” snd ”と再生状況を管理するフラグ” play_flg ”がメインのタイムライン( _root 階層)で定義されており、play_flg には再生中の時 true でそれ以外は false が入るものとします。 このスクリプトは、ボタンとして使うムービークリップのインスタンスに設定してください。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください)  /*最初に表示するフレームを決める*/  onClipEvent(load)  {   //今の再生状況に応じた「アップ」の絵を表示   gotoAndStop( Number( _root.play_flg ) + 1 );  }  /*ロールオーバー/アウト時の処理*/  on(rollOver)  {   //再生中の時は停止、停止中の時は再生の、「オーバー」の絵を表示   gotoAndStop( Number( _root.play_flg ) + 3 );  }  on(rollOut)  {   //今の再生状況に応じた「アップ」の絵を表示   gotoAndStop( Number( _root.play_flg ) + 1 );  }  /*クリックされた時の処理*/  on(press)  {   //サウンドのON/OFFと、表示するフレームの切り替え   with( _root )   {    //再生中の時はサウンドを止める    if( play_flg )    {     snd.stop();     play_flg = false;    }    //停止中の時はサウンドを再生    else    {     snd.start();     play_flg = true;    }   }   //再生状況に応じた「ダウン」の絵を表示   gotoAndStop( Number( _root.play_flg ) + 5 );  }  on(release)  {   //再生状況に応じた「オーバー」の絵を表示   gotoAndStop( Number( _root.play_flg ) + 3 );  } スクリプトは長いですが、やっている内容は単純です。 ムービークリップの各フレームには、サウンド OFF と ON の順にして、アップ→オーバー→ダウンの順にそれぞれの絵を描いておきます。 あとはマウスの操作に応じて、フラグの値をもとに該当するフレームに移動するだけです。 press イベントはボタンをクリックした瞬間に、release イベントはそのボタンを離した時に発生します。 ボタンシンボルでいうところの「ダウン」フレームは、press イベント発生時に表示されます。 普通に考えると、release イベントが起きた時はカーソルはボタンに重なっているかと思いますので、上記のスクリプトでは、release イベント発生時は「オーバー」にあたるフレームを表示するようにしています。 違和感があるようでしたら、on(release) の中で play_flg に加算する値を 1 にして、「アップ」に相当するフレームを表示してください。 なお、フラグは最初に、必ず初期値( true か false )を入れておいてください。 上記の例ですと、最初からサウンドを鳴らすのであれば true 、鳴らさない時は false です。

chachachar
質問者

お礼

ありがとうございます。 丁寧に説明していただきとても良く理解できました。 >ボタンシンボルのフレームにはムービークリップを配置できますが、 >このムービークリップにインスタンス名を付けても、 >スクリプトでは制御できないことになっています。 そういうことだったんですね。 これが分かっただけでも今回の疑問は自分のためになりました。 ありがとうございます。

その他の回答 (1)

  • suzuko
  • ベストアンサー率38% (1112/2922)
回答No.1

う~~ん。ボタンでMCつけるなら、ボタンの機能を持ったムービークリップ(ボタンムービークリップ)にしてはどうでしょうか? やり方は参考URLにあります。

参考URL:
http://homepage3.nifty.com/ginga-b/MX/btnmc.html
chachachar
質問者

お礼

ありがとうございます。 こんなこと出来るんですね。

関連するQ&A