- ベストアンサー
Flashでアニメーションとサウンドを違うタイミングでループさせる方法
- Flashを使用してHPにアップするSWFファイルのアニメーションとサウンドを異なるタイミングでループさせる方法を教えてください。
- アニメーションの長さとサウンドの長さが異なり、正しくループさせる方法がわかりません。
- 現在のスクリプトでは、サウンドが重なって鳴る問題が発生しています。どう修正すればよいでしょうか?
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
いわゆる BGM の ON / OFF ボタンの作り方は、以前、他の質問で紹介したことがありますので、よろしければご参考になさってください。 ・BGMのon/offボタンについて http://okwave.jp/qa1789705.html この作例では、ON / OFF ボタンであるムービークリップをクリックするまでは音が鳴りません。 最初から音を鳴らす場合は、onClipEvent(load){ … } の部分を以下のように変更してください。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください) onClipEvent(load) { //サウンドを挿入 snd = new Sound(); snd.attachSound( "○○○" ); //無限ループ再生設定 snd.onSoundComplete = function() { this.start(); }; //サウンドを再生 snd.start(); //再生状況を保持する変数 //再生時true、それ以外はfalse play_flg = true; //再生状況に応じたフレームを表示 gotoAndStop( Number( play_flg ) + 1 ); } ------------------------------------------------------------- Flash では音であっても、ムービークリップやボタンと同様に”サウンドシンボルのインスタンスを作る”と考えます。 目に見えないものなので想像しにくいのですが、サウンドシンボルのインスタンスが存在している分だけ音が鳴ると思ってください。 音の鳴らし方は、イベント・スタート・ストリーミングの3種類があります。 イベントは、再生の命令が出されるたびにサウンドシンボルのインスタンスを作成する鳴らし方です。 この鳴らし方では、前に再生した音が再生中、つまり先に作られたインスタンスがまだ存在している時に再度再生命令を出すと、サウンドシンボルのインスタンスがもう1つ作られて、結果的に音が重複して鳴ることになります。 ****************************** スクリプトでの鳴らし方はイベントになります。 Sound クラスの start メソッドを実行するたびにインスタンスが作られ、指定した回数だけ再生が済んだインスタンスは削除されて音が止まります。 ですから、先に start により作られたインスタンスがまだ存在している間に start を実行すると、その都度インスタンスができて輪唱のようになります。 ご質問文のスクリプトですと、ボタンをクリックした時にボリュームを操作して音を出したり聞こえなくしているようですが。 ボリュームが 0 の間は単に音が聞こえなくなるだけで、再生はずっと続いています。 つまり、フレーム1で作られたサウンドシンボルのインスタンスは 999 回ループ再生が済むするまで存在しています。 この間にフレーム1に戻ると、フレームに書かれているスクリプトの _root.soundA.start(0,999); によりサウンドシンボルのインスタンスが作られるため、音が重複して鳴ってしまいます。 重複再生を防止するには、再生中の音を一旦止めてから再生する・再生中は再生の命令を出さないようにする、といった、同じサウンドシンボルのインスタンスを複数存在させない工夫が必要です。 Sound クラスの stop メソッドを使うと、稼動中のインスタンスを削除して音を止めることができます。 先述の作例では、再生中であるかどうかの情報を変数(フラグといいます)に記録しておき、ボタンがクリックされるたびにこの情報を見て、再生中であれば stop で音を止め、停止している時は start で再度音を鳴らしています。 stop で先に作られたサウンドシンボルのインスタンスが削除されて音が止まっているので、start を実行しても前の音は鳴りません。 なお、重複して音が鳴るのは、要するに、前に鳴らした音の再生中に start が実行されることが原因です。 従って、例えばフレーム1のフレームアクションで音を鳴らし、以降はフレーム1に戻らずフレームアクションが実行されないようにする、という手もあります。
お礼
お礼つけわすれてました;; とっても参考になりました~!! ありがとうございます!
補足
回答ありがとうございました! 過去の回答なども参考にためしてみます!ものすごく勉強になります。 この回答をいただく前に試行錯誤をしつつなんとか形になったスクリプトがあったのですが、ごちゃごちゃしてしまいました。眺める程度に見てやってください・・・。 ON・OFFムービークリップ内にレイヤーを3つ作って 「一番下のレイヤー」 ●1フレーム目OFFシンボル配置以下スクリプト on (release) { gotoAndPlay(14); } ●12フレーム目OFFシンボル配置以下スクリプト on (release) { sample.setVolume( 0 ); gotoAndPlay(13); } ●13フレーム目ONシンボル配置以下スクリプト on (release) { sample.setVolume( 100 ); gotoAndPlay(12); } ●14フレーム目ONシンボル配置 ●15フレーム目ONシンボル配置以下スクリプト on (release) { sample.setVolume( 0 ); gotoAndPlay(12); } 「真ん中のレイヤー」 ●12、13、15フレーム目の空白キーフレームに以下スクリプト stop(); 「一番上のレイヤー」 ●11フレーム目の空白キーフレームに以下スクリプト sample = new Sound(); sample.attachSound("○○○○"); sample.start(0,999); sample.setVolume( 100 ); ●14フレーム目の空白キーフレームに以下スクリプト sample = new Sound(); sample.attachSound("○○○○"); sample.start(0,999); sample.setVolume( 0 ); という感じです(すいません・・・とってもわかりづらいですね;)。 あっちこっちに指示を出しまくりました;汗と涙の結晶です・・・ しかしDPEさんの回答を参考にするとこんなにいろんなところに指示をしなくてもいいのですね。 上司から、サウンドは再生したままON・OFFがしたい(音がOFFのときも再生時間が経過している状態)ってことで混乱してしまいました・・・ 長々とすみません。本当にありがとうございました! では参考しつつ試行錯誤してみます!