- ベストアンサー
サウンドのフェードイン・アウト
製作環境はXPのMXです。 サウンドをattachSoundでライブラリから呼び出して流しているのですが、一番最初にフェードインさせて流したいときはどのように書けばいいでしょうか? また、on/offボタンを設置していて、今はstart/stopで制御しているのですが、これもフェードイン・アウトさせるようにしたいのですが、どう書けばいいしょでしょうか? 詳しい方がいましたら教えてください。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
一番最初にフェードインするとき,フェードインだけを考えると上の方法で良いかもしれません。 on/offボタンの件は下の方法です。 ---簡単なフェードイン(フレームで制御)--- フレームにサウンドを追加するか、既にサウンドを含んでいるフレームを選択します。 「プロパティ」を選択「プロパティインスペクタ」の右側にある 「編集」 ボタンをクリックします。 表示される音の波形の任意の位置をクリックするとエンベロープハンドルという四角いのが出てくるので, それで音量の線を / こんな傾斜にするとフェードイン, \ こんな傾斜にするとフェードアウトします。 また同じエンベローブの編集ボックスで上の「効果」を「フェードイン」や「フェードアウト」にすると 音全体が「フェードイン」や「フェードアウト」するようになります。 ---スクリプトで制御--- ※こうしたらできると言うだけで何か形が変です。 他の人ならもっとスッキリしたスクリプトにできるかもしれません。 一例として見てください。 ライブラリに入っている(読み込んだ)サウンドを右クリック→「リンケージ」で 識別子に任意の名前( ongaku1 としておきます)を記入し, 「ActionScriptに書き出し」と「最初のフレームに書き出し」にチェックを入れ「OK」をクリックします。 フレームのスクリプトとして mySound = new Sound(); mySound.attachSound("ongaku1"); として"a_thousand_ways"にmySoundというインスタンス名を与えておきます。 フェードインボタンには on (release) { mySound.stop(); mySound.start(0,100); mysound.setVolume(0); this.onEnterFrame = function() { V = mySound.getVolume(); mysound.setVolume(V+3); if (V >= 100) { this.onEnterFrame = null; } }; } と書けば,音がスタートすると同時に音量がフレームレート毎に 3 6 9 12 …と上がって行きます。 フェードアウトボタンに on (release) { this.onEnterFrame = function() { V = mySound.getVolume(); mysound.setVolume(V-3); if (V <= 0) { mySound.stop(); } }; } と書けば,徐々に音量が下がります。 音量が0になったら,音は止めるようにしてあります。 他のインスタンスの制御のように, mysound._Volume += 3 のように出来ないのがどうもしっくり来ませんが, そういうものなのかもしれませんし,もっと良いスクリプトを考えつく方がいらっしゃるかもしれません。
その他の回答 (1)
- DPE
- ベストアンサー率85% (666/776)
フェードイン/アウトは要するに、Sound オブジェクトの setVolume メソッドで連続的にボリュームを変更していくだけです。 スクリプトで連続的に処理したい場合は、フレーム間をループしてフレームアクションを何度も実行するか、ムービークリップのイベント enterFrame を利用するかになります。 今回のような作品は、enterFrame イベントを利用する方が簡単です。 ボリュームの操作は普段は必要がなく、フェードイン/アウトが必要な時だけボリュームを操作すればいいので、変数(フラグといいます)を用意して指令を出し、この変数の値を enterFrame イベントで監視して、指令があった時だけボリュームを調節する処理を実行してはいかがでしょう。 ボリュームは別に用意した変数で管理します。フェードイン/アウトの実行指令が出ている間のみ、この変数の値を加算・減算して setVolume に渡し、徐々にボリュームを上げる、または絞っていきます。 Flash MX からは、ムービークリップでもボタンと同じく、press や release イベントが検出できるようになりました。 サウンドの ON/OFF ボタンをムービークリップにし、フェードエフェクトの指令を出す変数や Sound オブジェクトも全てこのムービークリップのものにしておくと、スクリプトが1箇所にまとまる上、変数のターゲットパスも省略できて便利です。 なお、Sound オブジェクトで鳴らすサウンドはイベントサウンドです。イベントサウンドの特徴により Sound.start が実行される度に再生が始まりますので、再生中に Sound.start が実行されるとダブって再生され、まるで輪唱のようになって聞きにくくなります。 閲覧者が、ON/OFF ボタンを押されては困る状況の時には、ボタンを絶対にクリックしないという保証はありません。再生中およびフェードアウト時は、Sound.startが実行されないようにしたり、ボタンを押せなくするなど、クリックされても重複再生されないように、対策を講じておきましょう。 --------------------------------------------- スクリプトは次のように考えます。 まず、サウンドの再生状況を1つの変数で管理します。 仮にこの変数を play_status という名前とし、値を次のように決めます。 0:停止中 1:再生中 2:フェードイン 3:フェードアウト enterFrame イベントを利用して play_status の値を常時監視し、2または3の時だけ、ボリュームを操作します。 play_status の値は次のように変化します。( )の中は値の変化です。 ・停止している状態でボタンがクリックされた時、フェードイン開始(0→2) ・フェードイン終了時、通常再生に戻る(2→1) ・通常再生時、もしくはフェードイン中にボタンがクリックされた時、フェードアウト開始(1または2→3) ・フェードアウト終了時、サウンドを停止(3→0) 上記のように考えると、スクリプトは大体、次のようになります。 このスクリプトは、ON/OFF ボタンとして使うムービークリップに設定してください。 なお、サウンドシンボルのリンケージの識別子は、とりあえず”BGM”としてあります。作品でご利用している名前に変更してください。 (↓各行頭に全角のスペースが入っています。コピーして利用する際は、全て半角のスペースかタブに置き換えてください) /*初期設定*/ onClipEvent(load) { //サウンドの設定 bgm = new Sound( this ); bgm.attachSound( "BGM" ); bgm.onSoundComplete = function() { this.start(); }; //サウンドの再生状況を管理するフラグ //0:停止 1:再生中 2:フェードイン 3:フェードアウト play_status = 2; //エフェクトのスピードを保持 fade_spd = 5; //ボリュームを保持する変数(0~100) volume = 0; //ボリュームを設定し、再生開始 bgm.setVolume( volume ); bgm.start(); } /*フェードイン/アウトの処理*/ onClipEvent(enterFrame) { switch( play_status ) { //停止中および通常再生時は何もしない case 0: case 1: break; //フェードイン case 2: volume += fade_spd; //最大ボリュームに達したら通常再生に戻す if( volume >= 100 ) { play_status = 1; volume = 100; } //ボリュームを設定 bgm.setVolume( volume ); break; //フェードアウト case 3: volume -= fade_spd; //最小ボリュームに達したら停止・クリック可能に戻す if( volume <= 0 ) { play_status = 0; volume = 0; bgm.stop(); this.enabled = true; } //ボリュームを設定 bgm.setVolume( volume ); break; default: break; } } /*クリック時の処理*/ on(release) { //停止している時のみ、フェードインでスタート if( play_status == 0 ) { play_status = 2; bgm.start(); } //再生中の場合、フェードアウトで停止させる //この間、クリックを禁止する else if( play_status == 1 || play_status == 2 ) { play_status = 3; this.enabled = false; } } このスクリプトでは、フェードイン/アウト時のボリュームは、1回の実行で5ずつ変化( 20 フレームでエフェクト終了)するようになっています。 変化のスピードは fade_spd という変数で指定していますので、お好みの速さに変更してください。 ムービークリップやボタンには、enabled というプロパティがあります。クリックやロールオーバー/ロールアウト等のイベントを検出するかどうかの設定で、true で検出、false で検出不可になります。 上記のスクリプトでは、enabled を操作して単にクリックできなくなるだけです。 これでは閲覧者には、ボタンが押せるのかどうか、今クリックすると ON になるのか OFF になるのかが分かりにくいと思います。 ムービークリップにサウンド ON の絵と OFF の絵を描いたフレームを作って、必要に応じて gotoAndStop で表示するフレームを切り替えたり、ボタンがクリックできない( enabled プロパティが false になっている)間は _alpha を調節して薄い表示にするなどの配慮を入れておくと、分かりやすい設計になります。 ちなみに最初のフェードインは、ボリュームを0に設定し、play_status を2にしてフェードインの指令を出しておくと、あとは enterFrame イベント発生時の処理に従ってフェードインしながら始まります。 長くなってすみませんでした。 不明な点がありましたら、補足してください。
お礼
#1さんの回答でうまく動いてくれたので、今それで流していますが、一つだけじゃなく、二つも、三つも方法があると思うと、こうして教えていただけるととても勉強になります。次に製作するときにはこの方法でも作ってみたいと思います。コピーするだけじゃなくて自分の力でもいろいろ作れるように頑張ります。 細かい点まで説明していただきありがとうございました。
お礼
さきほどやってみってみましたら、思っていたような形になりキレイにフェードイン・アウトするようになりました。 昨日まで音が出なかったり、イン・アウトできてなかったりで悪戦苦闘してたのがあっさり出来てしまいまだまだだなと実感しました。 ありがとうございました。