プロが教えるわが家の防犯対策術!

軍艦島(http://www.ambixious.co.jp/g3/flash2.htm)のような、フラッシュで音楽をジュークボックスのように鳴らすにはどうすればよいでしょうか?

要するに、他の音楽が鳴っているときに、別の音楽を鳴らしたら前の曲が消え、鳴らそうとした音楽が鳴るようにすればよいのですが……。

その作り方を説明しているサイトを教えて下さい。

A 回答 (3件)

できて良かったですね。

パチパチ(^-^)//"
できた後に言っても同じかもしれませんが,
#2の補足です。

>> ただ、このやり方だとメインのムービーは流れないのでしょうか?

意味が良くわかりませんが,
メインのアニメーションはどうなっても良いように,全てMCに入れてあるのですぅ…。
MCを使わなくても,メインのアニメーション上のタイムラインを,

gotoAndPlay();

などで行きまくれば,タイムラインにも複数の音楽を置くことができます。
その場合,メインのアニメーションを無視して,

例えば

gotoAndPlay(5);

gotoAndPlay(15);

gotoAndPlay(1);

などと無茶苦茶に飛び,メインのアニメーションがうまく行かなくなるので,
MCの中にいれたのです。

つまり,
「音は別に複雑に考えなくても,
MC内でコントロールすれば
普通のJPEGなどと同じように,
表示非表示させたり,動かしたりするように変えられますよ。」
と言いたかったわけなのです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
すみません、少し勘違いしてました。
#2のやり方でも上手くいきましたのでご報告させていただきます。
お手数かけてすみませんでした、ありがとうございました。

お礼日時:2005/08/01 21:05

MC(ムービークリップ)を複数作って,その中にsoundを置き,


_rootのボタンから,そのMCを止めたり動かしたりすると簡単に出来ます。

「ファイル」→「読み込み」で,「任意の音楽」をFlash内に読み込みます。
MCを作って,そのMCを2フレーム,2レイヤーにします。

             1
 □レイヤー2 ・・・|○ []|
 □レイヤー1 ・・・|○ []|

こんな感じ。
上のレイヤー(レイヤー2)をスクリプトのレイヤーにしましょうか。
レイヤー2のフレーム1の ○ を選択,そこに

-------------
stop();
------------

と書いて,このMCを止めておきます。
下のレイヤー1のフレーム2の [] を選択,
「右クリック」→「キーフレームに変換」でキーフレームにします。
そのレイヤー2のフレーム2を選択した状態で,「ウィンドウ」→「ライブラリ」で「ライブラリ」を表示させて,
読み込んだ「任意の音楽」をステージ上にドラッグします。

             1
             a
 □レイヤー2 ・・・|○ [] |
 □レイヤー1 ・・・|○|○|
              ↑音波みたいな物が見える

音波みたいなものが少し見えるレイヤー1のフレーム2を選択,
下のプロパティパネルの右下,「同期」を「スタート」にして,ループ回数を適当(1以上)に入力してください。
_root(メインアニメーション)の編集にもどって,このMCにインスタンス名を付けてください。
この説明では,「musicMC1」というインスタンス名にしておきます。
これで,1つの音楽のMCが完成です。
音楽が4つある場合,この作業を4回してください。
インスタンス名は「musicMC2」,「musicMC3」など全てのMCで変えてください。


メインアニメーションにボタンを音楽の数だけ作ります。
「musicMC1」に入れた音楽を流したいボタンには,

-----------------------------
on (release) {
stopAllSounds();
musicMC1.gotoAndStop(2);
musicMC2.gotoAndStop(1);
musicMC3.gotoAndStop(1);
musicMC4.gotoAndStop(1);
   … … …
}
------------------------------

と書けば,「musicMC1」がフレーム2に進むので音が鳴り始めます。
わかると思いますが,「musicMC2」に入れた音楽を流したいボタンには,

-----------------------------
on (release) {
stopAllSounds();
musicMC1.gotoAndStop(1);
musicMC2.gotoAndStop(2);
musicMC3.gotoAndStop(1);
musicMC4.gotoAndStop(1);
   … … …
}
------------------------------

となるわけです。


~別法~

外部に音楽(mp3に限る)を用意しておいて,

-----------------------------------
my_sound = new Sound ();
my_sound.loadSound ("○○.mp3", false);
-----------------------------------

などで,操作する方法もありますが,
mp3に限定されていますし,
音楽ファイルの容量も数もわかりませんし,
音楽がコロコロ変わるのでうまく動作するかどうかわかりません。
今回は,上で書いた方法や,#1さんの書かれている方法の方が無難だと思います。
もし,loadSound を使いたい場合は,下記URLなどを参考にしてみてください。

参考URL:http://hakuhin.hp.infoseek.co.jp/main/as/import. …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
記号を使っての説明でとても分かりやすかったです。
ただ、このやり方だとメインのムービーは流れないのでしょうか?
質問のURLのサイトを見れば分かると思いますが、メインムービーを中心としてフレームを動かし、なおかつそれに邪魔されないよう独自で音楽を鳴らせるような方法が知りたかったので、swfファイルを二つ(メインと音楽再生専用のswf)作ればこれでも問題はないと思いますが……説明不足ですみませんでした。
でも、このやり方もとても参考になりました。ありがとうございました。

お礼日時:2005/08/01 09:23

ジュークボックスのように鳴らすにはタイムラインでは無理で、スクリプトで制御して音を鳴らします。


サウンドの制御には Sound というクラス( Flash MX 以前はオブジェクト)を使います。


スクリプトで音を鳴らすには、”リンケージ”という設定が必要です。
「ライブラリ」パネルでサウンドシンボルを選び、右クリック( Mac では control +クリック)で出すメニューから「リンケージ...」を選択してください。「リンケージプロパティ」パネルが開きます。
「 ActionScript に書き出し」にチェックを入れると「識別子」の項目が編集可能になりますので、何か名前を付けてください。ここで付けた名前は、スクリプトで音を鳴らす時に必要になります。
仮に曲が3曲あるとし、MUSIC1 ~ MUSIC3 と識別子を付けたとします。

「 ActionScript に書き出し」にチェックを入れた時に、「最初のフレームに書き出し」という項目にも同時にチェックが入りますが、サウンドを扱う時はこのチェックを外すことをおすすめします。
「最初のフレームに書き出し」にチェックが入っていると、サウンドシンボルのデータがフレーム1に書き出されます。フレーム1から Now Loading のアニメを作っている場合は、フレーム1の容量が大きくなって読み込みに時間がかかり、ロードのアニメがなかなか始まらなくなります。

しかし、このチェックを外したシンボルはムービーに書き出されないので、スクリプトで挿入しようとしても利用できません。
リンケージを設定したシンボルでも、タイムラインに挿入してあれば、シンボルが初めてステージに登場するフレームにデータが書き出されます。
この点を利用して、ロードアニメの次のフレームにダミーとしてシンボルのインスタンスを配置し、実際のムービーはその次のフレームから作って、ムービーの読み込みが済んだらダミーのフレームを飛ばして本編を始めると、シンボルをフレーム1以外のフレームに書き出すことができます。
ダミーとして挿入したサウンドデータは、「同期:」の項目を「ストリーミング」以外に設定してください。
サウンドは1つのレイヤーの同フレームには1つしか挿入できませんので、レイヤーは曲の数だけ必要になります。曲が多い場合は、ダミーのフレームを増やすなどして対応してみてください。
なお、MP3 形式のサウンドであればライブラリに入れずに動的に読み込むことも可能ですが、今回は扱いません。
以上で、リンケージの設定は完了です。


音を鳴らす基本的なスクリプトは、次のようになります。
このスクリプトはフレームに設定してください。

(↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください)


 //オブジェクトを生成
 bgm = new Sound();

 //曲を挿入し、再生する
 bgm.attachSound( "リンケージの識別子" );
 bgm.start();


止めたい時は

 bgm.stop();

とすれば止まります。
Sound クラスで鳴らす音はイベントサウンドです。Sound.start を実行する度にサウンドシンボルのインスタンスが作られ、前のインスタンスの再生が終了していなくとも再生が始まりますので、ご注意ください。

Sound クラスには、Flash Player 6 から登場した onSoundComplete というイベントがあります。
Sound.start での再生が終了した時に行う処理を定義しておくもので、


 bgm.onSoundComplete = function()
 {
  //再生終了時、自動的にループ
  this.start();
 };


このように定義すると無限ループ再生になります。
Sound クラスでは、onSoundComplete をはじめボリュームなどの様々な設定が可能ですが、これらは1度設定しておくと次に変更するまで有効です。


ところで、1つの Sound オブジェクトで鳴らせるサウンドシンボルは1種類だけですから、attachSound で別のシンボルを挿入すると、次からは違う音が鳴ります。
ただし、先に再生中のインスタンスはそのまま演奏が続いてしまいますので、曲を変える前に Sound.stop で止めておきましょう。

仮に、ステージにボタンシンボルのインスタンスが3つあるとします。
例えば MUSIC1 を演奏するボタンのスクリプトは、次のようになります。


 on(release)
 {
  //再生中の曲を止める
  bgm.stop();

  //曲を挿入し、再生する
  bgm.attachSound( "MUSIC1" );
  bgm.start();
 }

他のボタンのスクリプトは、attachSound に渡す識別子を変えてください。


基本的には、このようにして曲を切り替えることができます。
ご提示のサイトもそうですが、上記のスクリプトでは、例えば MUSIC1 が再生中にこの曲を再生するボタンが押された時は、今鳴っている音を一旦止めて、もう1度最初から再生するスタイルになっています。
もう少し工夫すると、再生中の曲と同じ曲を再生しようとした時は何もしないといった機能を付けることもできます。
興味がありましたら、こちらも研究してみてください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
まだ「リンケージ」というものを活用した事がなかったので、これを機に研究してみたいと思います。
ご丁寧な解説で何とか上手く出来ました。ありがとうございました。

お礼日時:2005/08/01 09:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!