- ベストアンサー
A.swf→B.swfへのジャンプして音楽再生 Flash MX6
- A.swfを再生後、A.swfの最後のタイムフレームからB.swfにジャンプして再生を終了する方法について教えてください。
- D.htmlとC.htmlという二つのフレームで表示されているファイルで、A.swfの動画が終了するとB.swfにジャンプして音楽を再生したいです。
- 目標はA.swfの動画が終了するとB.swfへジャンプし、音楽が流れ続けることです。どのように実現すれば良いでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
まず、B.swf でのBGMの処理についてですが。 B.swf では、スクリプトでBGMを無限ループ再生しています。 このBGMは B.swf が画面に存在している限り、また、B.swf で snd.stop(); が実行されるまで再生され続けます。 B.swf は HTML のフレームで見えない位置に配置されており、サイトの他のページは違うフレームに表示されるのですから、表示するページが変わっても B.swf は常に存在しています。 ですから、トップとサブページ間を行き来しても、何もしなければBGMは途切れることなく再生されます。 #2の例では、A.swf のフレーム3で必ずBGMを止めています。 BGMを止める snd.stop(); が実行されるのは、B.swf の LocalConnection オブジェクトが持っている” BGM_Stop ”メソッドが呼び出された時です。 #2のスクリプトでは A.swf のフレーム3でこのメソッドを呼んでいますから、サブページからトップに戻って A.swf が再生された時にBGMは必ず止まります。 A.swf のオープニングムービーにもBGMが付いていると、サブページからトップに帰ってきた時には B.swf のBGMを止めないと、2種類のBGMが重複して鳴ってしまいます。 そのような意味で A.swf のフレーム3で B.swf で鳴らす音を止める例をご紹介したのですが、サブページからトップに戻った時もBGMを鳴らしたままでいいのでしょうか? それでしたら、A.swf のフレーム3の //強制的にBGMを止めて、先に進む a_lc.send( "B_swf" , "BGM_Stop" ); このスクリプトを削除してください。 最初は、A.swf の最後で B.swf の BGM_Play メソッドを呼ぶまで、音が鳴りません。 サブページからトップに戻った時はBGMは再生されていますので、A.swf を再生している間もBGMは途切れることなく鳴り続けます。 次に、動画のスキップボタンを A.swf 内に置く場合ですが。 #1でも少し書きましたように、BGM_Play メソッドを呼び出した次の瞬間に getURL でページを移動すると、B.swf に送信が終わらないうちに A.swf が画面から消えるため、送信が失敗してしまいます。 つまり、BGMを鳴らしてページを移動するためには、最低でも2フレームは必要です。 安全にいくなら、3フレームくらいは見た方が無難です。 この処理は、スキップボタンを3フレームのムービークリップとして作ると簡単です。 スキップボタンとして使うムービークリップのフレーム1に stop(); を入れて、普段はフレーム1を表示しておきます。 フレーム2は空欄にして、フレーム3に getURL と stop(); を書き、ページを移動します。 このスキップボタンは、ステージにはフレーム4から登場させます。 スキップボタンのインスタンスには、 on(release) { //音楽再生指令を送信 _root.a_lc.send( "B_swf" , "BGM_Play" ); //タイムラインを動かす this.gotoAndPlay( 2 ); } というスクリプトを設定してください。 BGMを鳴らし、動画をスキップして指定のページに移動します。 --------------------------------------------------------- トップページに Flash で作ったオープニングムービーを入れる時は、ムービーをスキップするボタンを HTML のテキストや画像のリンクで用意するのが一般的です。 ムービーの中に作ると、Flash を表示しないようにしている人や読み込みが済むまで待てない人はスキップボタンを利用できません。 もっとも、Flash を表示できない・表示しない環境では B.swf が再生されないためにBGMも鳴りませんが、とりあえずそのようなケースは考えないことにします。 HTML のリンクで A.swf をスキップしてサブページに移動した場合、問題は B.swf が読み込み終わっているかどうかの判定です。 トップページでは、A.swf の先頭3フレームで、B.swf だけは必ず読み込み終わったことを確認してから先に進んでいます。 A.swf 内にスキップボタンを付ける場合も、フレーム4からこのボタンを登場させることで、B.swf への通信は可能になります。 しかし、HTML のリンクで B.swf のロードが完了する前にサブページに移動してしまった場合は、BGMを鳴らして先に進むことができません。 B.swf のロード完了を確認する件もそうですが、何より、HTML で作られたリンクと Flash 間でのやりとりには LocalConnection は使えませんので、JavaScript を介して通信することになります。 ただし、JavaScript はセキュリティ対策等の理由で受け入れないようにしている人も多く、また、ブラウザによっては期待通りに動かない場合もあります。 つまり、JavaScript 経由では難関が多々あって難しいです。 そこで、LocalConnection は swf ファイル同士でなら通信できるという点を、ここでも利用します。 BGMを専用にコントロールする別の swf ファイルを1つ、用意します。 このムービーの役目は、”サブページに移動してきた時に必ずBGMを鳴らす”ことだけですから、ページデザインの邪魔にならない、10 × 10 ピクセル程度の最低限の swf ファイルで構いません。 サイトの閲覧中、BGMが鳴りっぱなしなのは気になる、という意見も多いようですので、どうせならただのダミーではなく、#1の最後に書きましたBGMの ON / OFF ボタンとして作るのも1つの方法です。 ついでですから、ON / OFF ボタンの作例をご紹介します。 このムービーを仮に” play_btn.swf ”とし、各サブページには必ずこの swf ファイルをどこかに配置してください。 --------------------------------------------------------- play_btn.swf でも B.swf と情報をやりとりし、B.swf のロード完了率やBGMの制御ができるように LocalConnection オブジェクトを用意します。 それに伴い、今までの A.swf と B.swf にも少々変更が必要になります。 まず、B.swf からロード完了率を送ってもらう” Send_LoadProgress ”メソッドについてですが。 今回は、A.swf と play_btn.swf の両方から完了率の送信要求を受け付けられるように変更します。 LocalConnection の send メソッドの書式は、 send( "接続名" , "メソッド名" , 必要なパラメータ , … ) このようになっています。 A.swf の LocalConnection オブジェクトは、接続名が A_swf でした。 現時点では A_swf としか送信できないようになっていますが、これを、A.swf から要求された時は A.swf に、play_btn.swf からの要求の時は play_btn.swf に送信するように変更します。 B.swf のフレーム1にある、A.swf からの完了率送信要求を受け付けるメソッド b_lc.Send_LoadProgress = function()・・・を、次のように変更してください。 //他のムービーからの完了率送信要求を受け付けるメソッド b_lc.Send_LoadProgress = function( connect_name ) { //完了率を算出 loaded = _root.getBytesLoaded(); total = _root.getBytesTotal(); per = Math.floor( loaded / total * 100 ); //完了率を発信元のムービーに送信 this.send( connect_name , "Tell_LoadProgress" , per ); }; A.swf と play_btn.swf では、このメソッドを呼び出すことで B.swf の完了率を把握します。 今回はこの呼び出す時に、自分の接続名をパラメータとして渡すように変更します。 すると、B.swf では受け取ったパラメータで接続名を判別し、送信者に完了率を折り返し送信できる仕組みになります。 B.swf の Send_LoadProgress メソッドを変更したため、A.swf でこのメソッドを呼ぶ部分も変更が必要です。 A.swf のフレーム3の //B.swfに、完了率の送信要求を出す a_lc.send( "B_swf" , "Send_LoadProgress" ); この部分を、 //B.swfに、完了率の送信要求を出す a_lc.send( "B_swf" , "Send_LoadProgress" , "A_swf" ); このように変更してください。 play_btn.swf は、次のような構成にします。 フレーム1:初期設定 フレーム2:B.swf のロード完了を待つフレーム。スクリプトはなし。 フレーム3:B.swf のロード完了判定 フレーム4:ON / OFF ボタンを配置し、タイムラインを止めて普段はここを表示する ON / OFF ボタンは1つのボタンで切り替えるタイプにもできないこともないのですが、諸事情により、BGMを鳴らすボタンと止めるボタンの、2つを用意してください。 play_btn.swf の先頭3フレームでは、A.swf と同じ要領で B.swf のロード完了を確認します。 play_btn.swf には通信の担当者として” btn_lc ”という LocalConnection オブジェクトを作り、接続名を” Btn_swf ”、A.swf と同じく” Tell_LoadProgress ”メソッドを用意します。 ●フレーム1 //通信の準備をする btn_lc = new LocalConnection(); btn_lc.connect( "Btn_swf" ); //BGM用swfファイルのダウンロード状況を把握するメソッドを定義 //引数はロード完了率(%) btn_lc.Tell_LoadProgress = function( loaded_per ) { //受信した内容を、自分の変数に保存 b_per = loaded_per; }; //BGM用swfのロード完了率を管理する変数 b_per = 0; ●フレーム3 //B.swfの読み込み完了を待つ if( b_per < 100 ) { //B.swfに、完了率の送信要求を出す btn_lc.send( "B_swf" , "Send_LoadProgress" , "Btn_swf" ); gotoAndPlay( _currentframe - 1 ); } else { //強制的にBGMを鳴らして先に進む btn_lc.send( "B_swf" , "BGM_Play" ); gotoAndStop( _currentframe + 1 ); } play_btn.swf のフレーム3では、BGMを鳴らす BGM_Play メソッドを必ず呼び出すようにします。 B.swf ではBGMが再生中かどうかを情報として持っており、BGM_Play メソッドが呼び出された時はこの情報を確認して、再生中でない場合に限りBGMを鳴らします。 つまり、A.swf でBGMを鳴らした時は、play_btn.swf でこのメソッドを呼び出してもBGMは全く変化しません。 HTML のリンクからページを移動したなどで A.swf で鳴らさずにサブページに来た場合は、play_btn.swf 側で呼び出した BGM_Play メソッドの働きでBGMが鳴ります。 ON / OFF ボタンはフレーム4に配置します。 (不要でしたら、play_btn.swf のタイムラインはフレーム3で止めてください) このボタンへのスクリプトは、ON ボタンで BGM_Play メソッド、OFF ボタンで BGM_Stop メソッドを呼ぶ処理だけです。 ● ON ボタンのスクリプト on(release) { //BGM再生指令を送信 _root.btn_lc.send( "B_swf" , "BGM_Play" ); } ● OFF ボタンのスクリプト on(release) { //BGM停止指令を送信 _root.btn_lc.send( "B_swf" , "BGM_Stop" ); } 各サブページに play_btn.swf を配置した場合は、この swf ファイルが B.swf と通信してBGMを鳴らします。 A.swf のスキップボタンが押された時にBGMを鳴らしてからサブページに移動させる処理は不要で、スキップボタンからは、単純に on(release) 内に書いた getURL で移動できます。 各サブページで鳴らすようにするのであれば、実は、A.swf から各サブページに行く前にBGMを鳴らす処理も不要になります。
その他の回答 (2)
- DPE
- ベストアンサー率85% (666/776)
#1です。 何やら複雑で、難しいのですが ^^; #1でご紹介しました例は、要するに何かと言いますと。 A.swf で B.swf にあるBGMを鳴らす時までには、当然、B.swf のロードが完了していなければなりません。 ですから、B.swf の完了率を A.swf でも把握し、B.swf が 100 %読み込まれている確信が欲しいのです。 しかし、A.swf と B.swf は違う HTML ファイルで別々に再生されているため、A.swf からは B.swf のロード完了率を直接取得することはできません。 そこで、LocalConnection で B.swf から完了率を送信してもらうことで、B.swf のロードが完了しているかどうかを A.swf 側でも判断できるようにする、というのが基本的なコンセプトです。 #1では、A.swf の先頭で A.swf 自身のロード完了も合わせて待つことにしていますけれど、このあたりの事情が少々違うのだと思います。 要は B.swf のロードが終わっていることを A.swf で確認できればいいので、A.swf の最初では、A.swf 自身はともかく、B.swf だけは必ずロードの完了を待って先に進むようにしてはいかがでしょうか。 サブページを表示している間、B.swf でBGMを鳴らすには、A.swf の動画をスキップしたとしても、BGMをまず鳴らしてからサブページに移動、という流れになるかと思います。 となると、BGMに関する制御を全て持っている B.swf は、いずれにせよ早い段階で読み込みの完了を確認しておく必要があります。 #1の例では B.swf は、自分がロード中に一方的に A.swf に完了率を送信していました。 今度は、A.swf の方から B.swf に要求を送り、A.swf の都合に合わせて B.swf の完了率を取得し、B.swf が完全に読み込まれたことを確認してから先に進むようにします。 A.swf の都合で B.swf から情報を送信してもらうには、まず、B.swf に用意したメソッドを A.swf が呼び出し、B.swf はその呼び出されるメソッドの中で A.swf に情報を送信するという、少々面倒な手順になります。 LocalConnection は相手を呼び出すことでしか通信できない一方向の通信なので、今回のようなケースではその弱さが見えるところです。 --------------------------------------------------------- B.swf ではロード完了を待つ処理が不要になります。 B.swf を、次のような構成に変更してください。 フレーム1:初期設定 フレーム2:サウンドシンボルを書き出すためのダミー。スクリプトはなし。 フレーム3:BGMの制御の定義など BGMのサウンドシンボルはリンケージを設定してフレーム2に挿入し、「同期:」の項目から”ストップ”を選択してください。 シンボルのデータはフレーム2に書き出されます。 スクリプトは、次のように変わります。 ●フレーム1 //A.swfと通信するためのオブジェクトと接続名を定義 b_lc = new LocalConnection(); b_lc.connect( "B_swf" ); //A.swfからの完了率送信要求を受け付けるメソッド b_lc.Send_LoadProgress = function() { //完了率を算出 loaded = _root.getBytesLoaded(); total = _root.getBytesTotal(); per = Math.floor( loaded / total * 100 ); //完了率をA.swfに送信 this.send( "A_swf" , "Tell_LoadProgress" , per ); }; //BGMの再生状況を保持 //再生時true、それ以外はfalse play_flg = false; ●フレーム3 //Soundオブジェクトを作成し、サウンドを挿入 snd = new Sound(); snd.attachSound( "BGM" ); //無限ループ再生設定:再生終了時、自動的にループ snd.onSoundComplete = function() { this.start(); }; //BGMを再生するメソッド b_lc.BGM_Play = function() { //再生中でない場合のみ、再生する if( ! play_flg ) { //BGMを再生し、再生中であることを記録 snd.start(); play_flg = true; } }; //BGMを停止させるメソッド b_lc.BGM_Stop = function() { snd.stop(); play_flg = false; }; //タイムラインを止めておく stop(); B.swf のタイムラインでは、あえてロード完了を待つ必要はありません。 今回は、A.swf から要求があった時だけ、完了率を計算して送信するようにします。 当然ながら、100 %完了していれば 100 を送信します。 #1の作例では” B.swf がロード中の場合だけ送信”する仕組みだったので、一旦完了率が 100 %に達すると送信は行われなくなります。 今回は” A.swf から要求があるたびに送信”なので、100 %に達した後でも、何度でも送信は行われます。 #1の例ではBGMを止めるメソッドはありませんでしたが、トップページに戻ってきた時はBGMを止める機能も必要かと思います。 サウンドシンボルをフレーム2に書き出し、BGM関連のスクリプトをフレーム3に書くのは、シンボルが読み込まれてからでないと attachSound などのスクリプトが失敗して音が鳴らなくなるためです。 スクリプトで鳴らす音は、Sound.start が実行されるたびに再生されます。 上記のスクリプトでは、play_flg という変数にBGMが再生中かどうかの情報を記録し、再生中に BGM_Play メソッドが呼び出されても重複して音が鳴らないようにしています。 --------------------------------------------------------- 問題の、A.swf ですが。 A.swf の先頭では、B.swf のロード完了だけを確認して先に進んでください。 フレーム1:初期設定 フレーム2:B.swfのロード完了を待つためのフレーム。スクリプトはなし。 フレーム3:B.swfのロード完了判定 フレーム4:(補足(1)の処理) フレーム5:(補足(2)の処理) フレーム3のスクリプトが、次のように変わります。 フレーム1と最後のフレームのスクリプトは、変更はありません。フレーム1には、#1で書きましたスクリプトを設定してください。 ●フレーム3 //B.swfの読み込み完了を待つ if( b_per < 100 ) { //B.swfに、完了率の送信要求を出す a_lc.send( "B_swf" , "Send_LoadProgress" ); gotoAndPlay( _currentframe - 1 ); } else { //強制的にBGMを止めて、先に進む a_lc.send( "B_swf" , "BGM_Stop" ); gotoAndPlay( _currentframe + 1 ); } この3フレームで、B.swf のロード完了を待ちます。 最初の1回だけは、B.swf が完全にロードされるまでは先に進めません。B.swf はできるだけ容量を軽くし、短時間でロードされるようにするといいでしょう。 2回目以降は、B.swf が正常に読み込まれていれば、B.swf からは必ず完了率が 100(%)と送信されてくるはずですから、この3フレームはほぼ素通りとなります。 フレーム4以降は現状のままで構わないと思います。 現在、フレーム2で A.swf のロードを作っているかと思いますが、これも、普通に A.swf だけの完了率で判断してください。 要するに、現状での A.swf の先頭にフレームを3つ追加し、ここで最初の1度だけ、B.swf が読み込まれたことを確認する処理を加えるということです。 ただ、A.swf で通信を担当している a_lc はメインのタイムライン( _root 階層)にあります。 ムービークリップのタイムラインからでも B.swf と通信できますが、その場合は _root.a_lc.send( "B_swf" , "BGM_Play" ); このように、ターゲットパスを付けることをお忘れなく。 --------------------------------------------------------- A.swf の先頭で B.swf のロード完了を待って先に進むと、”少なくとも B.swf だけは必ずロードが完了している”という保証が得られます。 つまり、普通に考えるならば、B.swf にあるBGMのデータと音を制御するメソッドは全て、必ず利用可能になっているはずです。 従って、あとは、BGMを鳴らしたい局面で BGM_Play 、止めたいところで BGM_Stop メソッドを呼ぶと、いつでもBGMの ON / OFF を切り替えることができます。 トップページに戻ってきてBGMを止めたい場合や、動画をスキップして他のページに行く前にBGMを鳴らす時などに利用してください。 ところで、LocalConnection にはもう1つ弱点があります。 インターネットのIPアドレスと同じで、LocalConnection は同じ接続名を持つ複数の相手とは同時には通信できません。 (接続を切断すると、同じ接続名も使えます) 例えば、A.swf が B.swf と通信して読み込み完了を待っている間に、別のウィンドウを開いて同じページを読み込むと、” A_swf ”と” B_swf ”という接続名を持つ LocalConnection オブジェクトが同時に2組存在することになります。 特に受信側の接続名が問題で、同じ接続名の LocalConnection オブジェクトが複数ある場合は、通信が成功するのはどれか1つだけです。 従って先のようなことをしますと、どちらかのウィンドウに表示されるページは正常に機能しない可能性があります。 まあ、こういうヒネクレたことをする人は稀でしょうから、今回はこの件については考慮していません。
お礼
更なる詳細ご回答ありがとうございます。 かなりややこしくなってきていますので只今最初から順を追って解析中です。理解してから実行するつもりでもう少し時間がかかるので分からないことがあれば再度質問しますのでよろしくおねがいします。
補足
ありがとうございます。 (ここ数日間、テストで別にswfを別につくり試したりしてました。) おかげさまで第一段階クリアーしました、感謝です。 現状をおさらいしますと・・ ------現状-------------------------------- フレーム1 フレーム2 | D.html | C.html | | (B.swf) | (A.swf) | トップページ(フレーム1は見えてない状態)にて (1)A.swf動画再生終了 ↓ (2)B.swfへジャンプ音楽スタート できました!! ----------------ここまで--------------- もうひとつおねがいです。 -----質問------------------------------ トップページから動画再生する前にサブへ 入ったときにも音楽スタートしたいのです。 そのときの音楽はもちろんどのサブまたはトップへいっても流しぱなし(サブへいくたびに最初から音楽スタートではなく)にしたいのでB.swfでの処理にしたいです。 ただしその場合もお気づきと思いですが、 (1)A.swf動画再生終了スクリプトにて B.swfへジャンプ音楽スタート ↓ (2)B.swf音楽再生中にトップからサブへいく動作をしたとき (1)はすでに音楽B.swfが途中まで進んでいるのでちゃんと(2)はつづきから再生するような処理も含めたいです。 ----------------ここまで--------------- もう少しですのでお力をよろしくお願いします。
- DPE
- ベストアンサー率85% (666/776)
B.swf のフレーム 1 ~ 59 を無視するのは、A.swf がフレーム 60 から成るムービーで、これの再生の終了を待ってBGMを流すためでしょうか? タイムラインは描画の遅延などで狂うことがあります。 複数のムービー等と連携するような作品の場合は特に、タイムラインではなくもっと信頼に足る条件で判断して、より確実な方法でタイミングを合わせた方が無難です。 Flash Player 6 (作成ツールは Flash MX )からは LocalConnection というオブジェクトが登場し、複数の swf ファイル間で情報のやりとりができるようになりました。 同時に再生されている swf ファイル同士であれば通信は可能で、例えば C.html と D.html がフレームで隔てられていても、C.html にある A.swf と D.html の B.swf は通信できます。 この機能を利用して、A.swf から B.swf にBGMの再生指令を送り、任意のタイミングでBGMを鳴らすという方法はいかがでしょう。 -------------------------------------------------- LocalConnection は、送信側と受信側の両方に通信を担当するオブジェクトを作ります。 基本は、オブジェクトの中にメソッドを予め用意しておいて、”相手が持っているメソッドを呼び出す”という形で通信します。 メソッドとは変数のようなもので、関数として呼び出したい処理を作り、この関数を LocalConnection オブジェクトの中に作った変数に代入して登録します。 ムービークリップの、インスタンス名.onEnterFrame = function ・・・という書き方と、同じ要領です。 一方向の通信で使い勝手が悪いようですが、これだけでもいろいろなことができます。 A.swf から B.swf に指示を送ってBGMを鳴らすためには、指示を送る時点では B.swf が既にダウンロードが完了していなければなりません。 しかし、A.swf と B.swf が別々に再生されている場合は、A.swf 側からは B.swf のロードが完了しているかどうかを判断することができません。 そこで、B.swf からロード完了率を LocalConnection で送信してもらい、A.swf 側でも B.swf のダウンロード状況を把握できるようにします。 完了を待って先に進む方法は様々ですが、とりあえず、A.swf と B.swf の両方のロードが済んだ時点で A.swf の動画を再生する例をご紹介します。 A.swf の最後では、B.swf にBGMの再生指令を送信します。 これも、LocalConnection を使って実現できます。 LocalConnection は先述の通り、相手が持っているメソッドを”呼び出す”ことでしか通信できません。 つまり、A.swf には B.swf からロード完了率を受け取るメソッドを、B.swf にはBGMを鳴らすメソッドを用意しておくと、”相方が持っているメソッドを呼び出す”形の通信しかできなくても目的は果たせます。 これとは別に、LocalConnection には接続名が必要です。 接続名は通信の相手を識別するための名前のことで、この接続名とメソッドを手がかりにして通信が行われます。 ネットでいうところの、IPアドレスのようなものですね。 接続名は LocalConnection が持っている connect というメソッドを使って定義します。 -------------------------------------------------- まずは、B.swf からですが。 サウンドをスクリプトで制御するには、「リンケージ」という設定が必要です。 「ライブラリ」でBGMに使うサウンドシンボルを選択した状態で、右クリック( Mac では control +クリック)でメニューを出し、「リンケージ...」を選択してください。「リンケージプロパティ」パネルが開きます。 「 ActionScript に書き出し」にチェックを入れ、「識別子:」の項目に何か名前を入力してください。ここでは仮に、”BGM”とします。 「最初のフレームに書き出し」にもチェックが入りますが、これは外してください。サウンドシンボルのデータがフレーム1に書き出され、プリロードの処理が上手くいかなくなります。 「最初のフレームに書き出し」を選ばなかったシンボルはムービーに書き出されず、このままでは利用できません。 シンボルのデータは、タイムラインに挿入してあれば最初に登場するフレームに書き出されるという特徴があります。 この特徴を利用して、フレーム1以外のフレームにサウンドシンボルを書き出します。 B.swf は次のような構成にします。 フレーム1:初期設定 フレーム2:ロード完了を待つためのフレーム。スクリプトはなし。 フレーム3:ロード完了判定と、完了率の送信 フレーム4:BGMの設定など レイヤーを2つ用意し、1つはスクリプト用、もう1つはBGM用にします。 BGM用のレイヤーのフレーム4にキーフレームを作り、サウンドシンボルを挿入してください。 このシンボルは「同期:」の項目から”ストップ”を選び、タイムラインでは再生されないようにしておきます。 これで、サウンドシンボルのデータはフレーム4に書き出され、スクリプトで鳴らすまでは再生されなくなります。 スクリプトはフレーム1・3・4に書きます。 (↓各行頭に全角のスペースが入っています。コピーする際はご注意ください) ●フレーム1 //A.swfと通信するためのオブジェクトと接続名を定義 b_lc = new LocalConnection(); b_lc.connect( "B_swf" ); ●フレーム3 //読み込み完了率の算出 loaded = this.getBytesLoaded(); total = this.getBytesTotal(); per = Math.floor( loaded / total * 100 ); //A.swfに、進捗状況を知らせる b_lc.send( "A_swf" , "Tell_LoadProgress" , per ); //完了を待つ if( per < 100 ) { gotoAndPlay( _currentframe - 1 ); } ●フレーム4 //Soundオブジェクトを作成し、サウンドを挿入 snd = new Sound(); snd.attachSound( "BGM" ); //無限ループ再生設定:再生終了時、自動的にループ snd.onSoundComplete = function() { this.start(); }; //BGMを再生するメソッドを定義 b_lc.BGM_Play = function() { snd.start(); }; //タイムラインはここで止めておく stop(); 紙面の都合上、スクリプトで音を鳴らす詳細は割愛させていただきます。 このサイトでも度々話題になっていますので、検索してみてください。 B.swf 側には、通信を担当する” b_lc ”という LocalConnection のオブジェクトを作ります。 このオブジェクトには、接続名” B_swf ”と” BGM_Play ”というメソッドが定義されます。 BGM_Play はBGMを再生する処理で、A.swf がこのメソッドを呼び出すとBGMが鳴る仕組みです。 -------------------------------------------------- 次に、A.swf 側の準備をします。 A.swf の先頭にプリロードの処理を作り、A.swf 自身と B.swf の両方のロードの完了を待って先に進みます。 A.swf の先頭部分は、次のような構成にします。 フレーム1:初期設定 フレーム2:ロード完了を待つためのフレーム。スクリプトはなし。 フレーム3:ロード完了判定 A.swf の最後では B.swf にBGMの再生指令を送信しますから、スクリプトは最後のフレームにも書きます。 A.swf のスクリプトは、大体、次のようになります。 ●フレーム1 //オブジェクトの作成と、接続名の設定 a_lc = new LocalConnection(); a_lc.connect( "A_swf" ); //BGM用swfファイルのダウンロード状況を把握するメソッドを定義 //受け取るパラメータはロード完了率(%) a_lc.Tell_LoadProgress = function( loaded_per ) { //受信した内容を、自分の変数に保存 b_per = loaded_per; }; //BGM用swfファイルのダウンロード完了率を管理する変数 b_per = 0; ●フレーム3 //自分のロード完了率の算出 a_loaded = this.getBytesLoaded(); a_total = this.getBytesTotal(); a_per = Math.floor( a_loaded / a_total * 100 ); //A・B.swfの両方のロード完了を待って、先に進む if( a_per == 100 && b_per == 100 ) { gotoAndPlay( _currentframe + 1 ); } else { gotoAndPlay( _currentframe - 1 ); } ●最後のフレーム //BGM再生指令を出す a_lc.send( "B_swf" , "BGM_Play" ); A.swf 側には、通信を担当するものとして” a_lc ”という LocalConnection オブジェクトを用意します。 a_lc の接続名は” A_swf ”、B.swf からロード完了率を受け取るために” Tell_LoadProgress ”というメソッドを作成しています。 このメソッドはパラメータ(引数といいます)を1つ、必要とします。 引数は B.swf の完了率で、単位は%です。 このメソッドは、B.swf で B.swf 自身の完了率を算出するところ(フレーム3のスクリプト)で呼び出されています。 つまり、B.swf で A.swf にあるこのメソッドを呼び出すことで、B.swf は A.swf に自分の完了率を知らせます。 A.swf は送られてきた完了率をもとに自分自身と B.swf の完了率を判断して、両方が 100 %に達するのを待って先に進みます。 A.swf の最後では、B.swf と通信してBGMの再生指令を出します。 つまり、ここで B.swf にある LocalConnection オブジェクト” b_lc ”が持っている” BGM_Play ”メソッドを呼び出し、音を鳴らすというわけです。 A.swf の再生終了後、BGMを鳴らしてから他の HTML ページを表示する場合は、最後にもう1つフレームを足して、このフレームで getURL を実行してください。 B.swf に送信した直後にページを移動すると、送信が終わらないうちにページが切り替わるため、通信が失敗してしまいます。 -------------------------------------------------- ちょっとややこしい話ですが、こんな感じでいかがでしょうか。 B.swf はサブページが切り替わっても再生されているので、HTML のフレーム2に表示されるページに関係なくBGMは鳴り続けます。 なお、B.swf を再生する側のフレーム( HTML のフレーム1)のサイズを0にすると、Flash が正常に再生されず、音が鳴らなくなる場合があります。 フレームのサイズは1ピクセル以上に定義してください。 わずかな隙間ができますが、この方が安全だと思います。 ページを移動しても使えるBGMの ON / OFF ボタンも、LocalConnection を利用して作れます。 LocalConnection は swf 同士でさえあればいいので、このボタンだけを swf ファイルとして作っておけばよく、ページ全体を Flash で作る必要はありません。 機会がありましたら、こちらも研究してみてください。 長くなってすみませんでした。
お礼
補足にてお礼をさせていただきます(ご確認ください)
補足
詳細なご回答ありがとうございます。 LocalConnectionとは知らなかったです。 ここでいくつか質問がありますのでおねがいします。 先に私の現状申し上げます。 ------------現状----------------------- A.swf約=1MB タイムフレーム1~920まで。 フレーム1 フレーム2 | D.html | C.html | | (B.swf) | (A.swf) | A.swfの内容(タイムフレーム)↓ (1)フレーム1…トップぺーじからサブページへ入り、 サブからトップへ1分以内で戻ったときは_root.LastPhoto.gotoAndStop(2);へ進む。 つまりLastPhotoというタイムライン名のムービークリップ内のフレーム2(ムービークリップ内のフレーム2)へジャンプして停止、1分以上たっていたら、次のフレーム2へというスクリプトをはりつけています。 (2)フレーム2…A.swfをすべてLoadingしたらスタートするためのスクリプト。つまり一回目のアクセスしたひとがサブへいかなければここで約30秒くらいのloadingが発生したあと920フレームまで再生して停止 ・・となります。 -----------------ここまで------------------------ 私の質問ですが、上記(1)のLastPhotoというムービークリップ(右クリック、編集時の)内のフレーム2にてDPEさんのいわれる最後のフレームのスクリプトをとしてはりつけたいのですが問題ないでしょうか。 次に “A.swf の先頭にプリロードの処理を作り、A.swf 自身と B.swf の両方のロードの完了を待って先に進みます。” とのことですが、A.swf内ではフレーム2にて940までの Loadingが発生します。 それなのにDPEさん推奨フレーム1,3用のスクリプトを使用しても問題はないでしょうか。 以上のように少し(だいぶ?)ややこしくなってきてますが、問題点があればご指摘おねがいします。
お礼
ありがとうございます。 もう少しで完結すると思いますがお手数おかけしてます。 スイッチのほうも時間あり次第試してみます。後ほど 補足にて結果(なるべく今回の質問で最後にしたいのですが・・未熟なためわからないところがでてくるおおもいます)を報告しますのでそのときは再度よろしくおねがいします。
補足
これまでのご好意ありがとうございました。 かなりめんどくさいことになってしまいましたが、貴方様のおかげでほぼ解決90%解決しました。 ---------現状もうしあげます--------------------- トップページ(A.swf )回覧 ↓ 動画再生→途中トップからサブページへ入ったとき→(1)へ ↓ 動画終了 ↓ 音楽(B.swf )スタート ↓ サブページへ入っても 音楽再生(B.swf)のまま ↓ トップへ戻ってもB.swf再生中のまま (1)より。サブにてB.swf再生せず ↓ トップへもどるとB.swf再生 スタート ---------------以上---------------------------- のこり10%は(1)のところでB.swf再生しないところですが (DPEさんのスクリプトを時間都合上後日ためします。) こんな感じでほぼ満足ですので感謝です。 あとご親切にボタンの使用方法まで教えてもらい恐縮です。これに関しても後ほど必要になる事項です。 かなり長いやり取りになってしまいましたが今後もさらに質問投稿しますので、目に付いたらご対応よろしくおねがいします。