- ベストアンサー
同レベルへの外部SWFファイル読み込みについて
製作環境はMX/WIN XPです。 Lv.2 メニュー(menu.swf) Lv.1 メインコンテンツ(1.swf/2.swf/3.swf/4.swf...) Lv.0 背景(bg.swf) 現在、上記のような形で作っています。 メインコンテンツの中身はプロフィールや仕事内容などです。 メニューは常に一番手前に表示されており、クリックして外部SWFの1,2,3...が切り替わるようにしています。 が、当たり前ですが同レベルに表示している場合、クリックすると表示していたコンテンツがブツっと切れて、クリックされたコンテンツが表示されますが、これを何とかしたい。 という質問です。 例えば、 現在表示されているコンテンツ ↓タイムライン 1.swf ●●●●|○○○ ●がコンテンツのムービーで○がそのフェードアウトのムービーだとして”|”の部分で停止します。 で、メニューで2.swfをクリックした際にその1.swfの停止した部分から再生し、○の再生が終われば2.swfのコンテンツを表示 クリックされたコンテンツ 2.swf ●●●●|○○○ としたいのですが、これが順に1,2,3と進むならいいのですが、訪問者がどれをクリックするかわからない場合はどうすればいいでしょう。上のたとえが1→2ではなく、4→1→2→4などランダムに押されてもうまく動くようにしたいです。 説明下手でわかりにくいかもしれませんが、同レベルに表示されているコンテンツを綺麗に消してから、同レベルに次のコンテンツを表示させたいのです。 この例でなくとも、何かよい方法がありましたら、ご意見いただければと思います。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
質問されている内容の >> 4→1→2→4などランダムに押されても >> うまく動くようにしたいです。 これ↑はすごく簡単なことですが, >> ●がコンテンツのムービーで○が >> そのフェードアウトのムービーだとして >> ”|”の部分で停止します。 こっち↑の方やそれをとりまく状況をどうずるかの方が難しいです。 確認ですが, こっち↑の部分は,つまり, ボタンが何もクリックされなければ, stop(); ボタンがすでにクリックされていたら stop(); せずにフェードアウトする。 ということなのですよね。 実際に作ってみてかなり頭がこんがらがりました。 難しいと言うより場合をシミュレーションするのがややこしいです。 また, >> Lv.1 メインコンテンツ(1.swf/2.swf/3.swf/4.swf...) この Lv.1 というのは _level1 という意味ですよね。 つまり, loadMovieNum("1.swf", 1); とか _level1.loadMovieNum("1.swf"); とかで, 外部 swf をロードしているものとして回答します。 今回の回答は, _level1.loadMovieNum("1.swf"); では Flash MX でうまく動作しない部分があったので, あまり好きではありませんが,全て, loadMovieNum("1.swf", 1); の形式の方に統一しました。 またすべての ----- 内のスクリプトはコピペ可能だと思います。 ●まず,「1.swf」「2.swf」「3.swf」… に書くスクリプトです。 「1.swf」「2.swf」「3.swf」… は全て同じことを書きます。 タイムライン,フレーム1 のスクリプト -------------------------- _level0.mov = 1; -------------------------- _level0 の変数 mov に 1 という値を代入しています。 _level0 の変数 mov は,「フラグ」として,兼「URL」の格納場所として使います。 ”|”の部分で停止するフレームのスクリプト -------------------------- if (_level0.mov == 1) { this.stop(); } -------------------------- 「もし,_level0 の変数 mov の値が 1 であればこのフレームで stop(); する。」 というスクリプトです。 上で mov = 1 としているので,if文 で分岐する必要はないと思われるかもしれませんが, mov = 1 でない場合も起こり得るので場合分けをしています。 フェードアウトし終わった最終フレームのスクリプト -------------------------- loadMovie(_level0.mov, this); -------------------------- 「_level0 の変数 mov の値のムービーをこのレベルにロードする。」 というスクリプトです。 _level0 の変数 mov の値 は「メニュー(menu.swf)」のボタンで決定させます。 先に「メニュー(menu.swf)」のボタンでロードするムービーのムービー名をしていしておいて, そのムービー名をロードするわけです。 >> 4→1→2→4などランダムに押されても >> うまく動くようにしたいです。 と書かれている部分の回答はほぼこの1行だけで答えになっているような気もします。 これだけだと簡単なのです。 また,#1の方も最初にそう回答してくださっています。 これらをうまく行かせるために他の部分を考えるのがややこしいです。 ●次に「メニュー(menu.swf)」に書くスクリプトです。 タイムライン,フレーム1 のスクリプト -------------------------- _level0.mov = 0; -------------------------- _level0 の変数 mov に 0 という値を代入しています。 意味合いとしては 初期値 と思ってください。 まだ何も起こっていないので 0 です。 次にロードするボタンのスクリプトです。 次の例は「1.swf」をロードさせるボタンのスクリプトです。 -------------------------- on (release) { //もし_level0.mov の値が 0 であれば if (_level0.mov == 0) { //"1.swf" をレベル1にロード loadMovieNum("1.swf", 1); //_level0.mov の値が 0 でなければ } else { //_level0.mov に "1.swf" をセットして _level0.mov = "1.swf"; //レベル1のムービーを play(); させる _level1.play(); } } -------------------------- おそらく,最初はレベル1に何も読み込まれていない状態から始まると推測しました。 2回目以降のロードは,「1.swf」「2.swf」「3.swf」… の最終フレームのスクリプトでロードさせます。 最初だけはボタンから直接ロードしないとなりませんよね。 だから上のようなややこしいスクリプトになります。 「2.swf」「3.swf」「4.swf」… をロードさせるボタンは, "1.swf" とある2箇所を "2.swf" "3.swf" "4.swf" … と変えてください。 以上です。 =============================== 以上ですが,なぜこんなになるのかがわからないと思います。 個々のスクリプトは上で説明しましたから,今度は全体の流れで 上のスクリプトがどう実行されるかを説明します。 まず, メニューが表示されます。 表示された時点で _level0.mov = 0; によって,_level0 の変数 mov の値 は 0 になります。 次に, 例えば「2.swf」をロードするボタンがクリックされたとします。 _level0.mov = 0; なので,ボタンスクリプトの if文 の判定により, if (_level0.mov == 0) が true となるため, loadMovieNum("2.swf", 1); が実行されます。 そして, 「2.swf」がロードされます。 _level0.mov = 1; によって,_level0 の変数 mov の値 は 1 になります。 次に, ”|”の部分で停止するフレーム に達します。 (※↓) _level0.mov = 1; の状態のままであれば,ここでストップします。 ”|”の部分で停止するフレーム に達する以前に,他のボタンがクリックされていたら, つまり例えば,「4.swf」 をロードするボタンがクリックされていたら, _level0 の変数 mov の値 は "4.swf" になっていますからストップしません。 _level0.mov = 1; の状態のままでここでストップしたときは, ボタンのスクリプトには, _level0.mov = "4.swf"; _level1.play(); と書いてあるため,また動き始めます。 次に, フェードアウトし終わった最終フレームに達します。 例えば,「4.swf」 をロードするボタンがクリックされていたら, _level0 の変数 mov の値 は "4.swf" になっていますから, loadMovie(_level0.mov, this); は loadMovie("4.swf", this); という意味で実行されます。 最終フレームに達するとき, _level0.mov には "1.swf","2.swf","3.swf","4.swf" … 以外の値が入っていることは通常の操作ではあり得ません。 だから"1.swf","2.swf","3.swf","4.swf" … のムービーが存在していたら 必ず読み込まれます。 そして, 「4.swf」 がロードされます。 _level0.mov = 1; によって,_level0 の変数 mov の値 は 1 になります。 あとは 上記 (※↓) 印に戻り,クリックされるボタンによって,ずっと繰り返されます。 上記はこうすれば上手く行くはずという一つの例で, 絶対にこうしなければならないというものではありませんが, 同時に3ファイルが連携してスクリプトや変数のやりとりされます。 どこか1箇所でも間違うとうまく動作しませんので,ケアレスミスに注意してください。
その他の回答 (1)
- EFA15EL
- ベストアンサー率37% (2657/7006)
まあ、要は考え方ひとつですよ。 例えばボタンがクリックされたら 「フェードアウトを再生して○へジャンプ」と言うスクリプトにしておいて、○だけ変数にしてしまう、という手もあります。 消えるswfは消える前に○の変数を参照して自分で命令を入れ替える訳です。 もしくは外部swfには特に何も記述せずに、ページ移動用スクリプトだけ別に書いても良いでしょう。 「○swfをフェードアウトさせ、完了したら□swfを表示させる」というスクリプトをメニューの数分書いておく訳です。 さらに別の案としてはフェードアウト用のムービー(白ベタが徐々にフェードインする)を用意しておき、各ページの冒頭に必ず入れる用にする、とか。
お礼
申し訳ありません。 しばらく家を空けていたためお礼が遅くなってしまいました。 ご意見ありがとうございました。 参考にさせていただきます。 またよろしくお願いいたします。
お礼
申し訳ありません。 しばらく家を空けていたためお礼が遅くなってしまいました。 いつものことながら説明不足で申し訳ありません。 しかしsassakunさんのまさに推測通りのことを考えておりました。 スクリプトやその解説等、丁寧にしていただきありがとうございます。 まだ作れてはおりませんが、今日、明日と時間があるので取り掛かろうと思います。 ご意見ありがとうございました。 参考にさせていただきます。 いつも回答いただきありがとうございます。 またよろしくお願いいたします。