- ベストアンサー
(2)トップページからすぐに戻った場合のloadingの防ぎ方
- トップページからすぐに戻った場合、一分間のloadingが発生する問題があります。
- サブからトップへすぐに戻った場合は再生せずに最後のフレームへジャンプしてくれますが、その前に一分間のloadingが発生してしまいます。
- このloadingを防ぐ方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
#1です。 サブというのは別ムービーではなくて,別ページのことだったのですね。 それで,サブHTMLから,TOPのHTMLに戻ったときの Loading画面ですね。 それだと,最終フレームに飛ばすときに NowLoading の画面は絶対に必要です。 これを抜くわけには行きません。 これについては前回のときも考えてはいたのですが, 話がさらに複雑になるので,以下は前回書かなかったことです。 最終フレームに飛ぶのであれば, NowLoading の画面は必要ですが 最終フレームに飛ばなければ, NowLoading の画面不要になります。 結論から言えば,最初に最後の写真をコピーして用意しておけば解決します。 まず, メインムービーのタイムラインの一番上のレイヤーのさらに上に,新しいレイヤーを追加して, そのレイヤーのフレーム1に,最後のフレームの写真をコピーしてください。 1 □ レイヤー 筆・□|●//////////////////// こんな感じで,最初から最後までその写真が見えている状態で良いです。 その写真を選択して,右クリック→シンボルに変換 でムービークリップシンボルにしてください。 そのムービークリップをダブルクリックして,ムービークリップの編集に移ります。 ムービークリップ内のタイムラインを2フレームにしてください。 そして,フレーム2 をキーフレームにして,フレーム1 の写真を削除してください。 ムービークリップの中の フレーム2 に写真がある状態で,フレーム1 は空白キーフレームになります。 ムービークリップ内のタイムラインを図示すると次のようになります。 1 □ レイヤー 筆・□|○|●| そして,フレーム1 のキーフレームに stop(); と書いてください。 これで,写真は フレーム2 に行けという指示を受けない限り表示されません。 「編集」→「ドキュメントの編集」でメインのムービーの編集に戻ります。 今,作った写真入りのムービークリップは,中心点を示す ○ だけが表示されると思います。 その ○ を選択して,下のプロパティパネルで <インスタンス名> を付けてください。 名前は何でも良いですが, LastPhoto というインスタンス名にしておきます。 NowLoading用のムービークリップは不要ですから,とりあえず削除してください。 そして, 例のSharedObjectのスクリプトを書いたムービークリップのスクリプトの ----------------------- //ここを最終フレーム _root.gotoAndStop(920); } ----------------------- の部分を次のように書きかえます。 ----------------------- //LastPhoto を フレーム2 に進める _root.stop(); _root.LastPhoto.gotoAndStop(2); } ----------------------- おそらくこんな感じでうまく行きますよ。 SharedObjectのスクリプトを書いたムービークリップは 現在 フレーム4 にあるわけですが,それを フレーム3 に移動させてください。 他のものは,なるべくそのままの場所がいいです。 最初に空白の 3フレームくらいができてしまいますができればそのままの方が良いです。 もし気になるようでしたら,1フレームずつ他のものを前にズラしても良いです。 しかしひょっとしたら,LastPhotoが フレーム2に行かないとか, フレーム2 に行ったとしても,他の物がチラッと見えてしまうかもしれないので, フレーム2 は空白キーフレーム フレーム3 にSharedObjectのスクリプトを書いたムービークリップ フレーム4 以降は現在のまま という感じが良い気がします。 ネットを通すと, この辺がプログラムのおもわく通りに行かないので難しいところですね。
その他の回答 (1)
お久しぶりです。 たしか,フットサルの方ですね。 今回書かれているようになる原因は, おそらく2番目のムービーを level 0 に読み込んでいるからではないかと思います。 最初のムービーを仮に A.swf 2番目のムービーを B.swf とすると, A.swf の最後のフレームで loadMovieNum("B.swf", 0); とされているのではないでしょうか。 最後の 0 が level 0 に読み込むという意味です。 次のムービーを level 0 に読み込むと,それまで level 0 にあったムービー(A.swf)はアンロードされてしまいます。 アンロードされるとメモリから解放されます。 メモリから解放されると再びメモリ上に読み込むのに時間がかかります。 ネット上から読み込む場合も,キャッシュから読み込む場合も, 時間の差はあるかもしれませんが,どちらにしても時間がかかることには変わりありません。 その時間の間,Loadingが発生します。 最初の A.swf と 2番目の B.swf の容量を合計してもおそらく 10MB には達しませんよね。 それくらいだと, A.swf をメモリから解放せずに B.swf を読み込めば問題はなくなります。 大まかな流れは, A.swfのLoading ↓ A.swfの再生 同時に B.swfの読み込み開始 ↓ A.swf最終フレームでstop(); 同時に B.swfの再生 ↓ B.swfの再生 ↓ B.swf終了 同時に B.swfの gotoAndStop(1); こうすると, A.swfのLoadingが2度目にはされなくなり, ついでに B.swf のLoading時間もなくなります。 一石二鳥です。 ~~~ 手順 ~~~ ◎ A.swf の方の編集 A.swfの最上レイヤーのさらに上にレイヤーを作ってください。 そのレイヤーの フレーム3 (再生開始フレーム)をキーフレームにしてください。 そこに,5mmくらいの小さな四角を描いて,その四角をムービークリップにしてください。 そしてその四角のムービークリップをステージの左上のコーナーに配置してください。 四角のムービークリップを選択したとき ムービークリップの中心に,中心点である ○ が表示されると思いますが, その ○ をステージの左上のコーナーの角に合わせる感じです。 タイムラインを図示するとこんな感じになります。 1 □ レイヤー 筆・□|○[]|●//////////////// その四角のムービークリップを選択, 下のプロパティパネルでインスタンス名を付けてください。 今回の説明では loadMC というインスタンス名を付けたとしておきます。 そして,タイムラインのフレーム3に _root.loadMC.loadMovie("B.swf"); と書いてください。 これで,この loadMC に2番目のムービーである B.swf が読み込まれます。 そして,A.swf の最終フレームに,おそらく書いていると思われる stop(); loadMovieNum("B.swf", 0); を↓, stop(); _root.loadMC.play(); と書きかえてください。 これで,読み込まれた B.swf がスタートします。 ◎ B.swf の方の編集 B.swf は少々手間かもしれません。 まず,タイムラインでフレーム1 を縦に全て選択して, 右クリック→「フレームの挿入」で,フレームを1つ追加してください。 そして,フレーム1 を空白フレームにするように,描いてある物を フレーム2 に移動させてください。 要は,何もないフレームをフレーム1に追加挿入するわけです。 タイムラインを雰囲気で図示すると次のような感じになるでしょうか。 1 5 □ レイヤー ・・□|○ []|●/// □ レイヤー ・・□|○|●//////// □ レイヤー ・・□|○ []| □ レイヤー ・・□|○ |●|●/// そして,他に何もない,タイムラインのフレーム1に stop(); と書いてください。決して, _root.stop(); とは書かないでください。 _root.stop(); も stop(); も,B.swf を単独で開いた場合は同じ意味ですが, A.swf に読み込まれた場合, _root.stop(); は _root である A.swf を stop(); させるという意味になってしまいます。 フレーム1に stop(); を書いておくと,A.swf のフレーム3でロードされたとき, B.swfはフレーム1で止まったままになるので,何も表示されません。 そして,B.swf のフレーム1を挿入したことによって, それ以降のタイムラインが 1フレームずつ後にずれるので, 全ての goto○○ と書いたスクリプトを1フレームずつ後に移動させてください。 あと,B.swfにもA.swfと同様の読み込み待ちムービークリップを用意していたとすると, ------------------------- onClipEvent (load) { _parent.stop(); //タイムラインの1フレーム目で止めておく } onClipEvent (enterFrame) { // すべて読み込んだら4フレーム目へ if (100 == Math.floor(_parent.getBytesLoaded()/_parent.getBytesTotal()*100)) { _parent.gotoAndPlay(4); } } ------------------------ と書きかえてください。 すべての _root を, _parent にしたのと, 最後の行を _parent.gotoAndPlay(4); で1フレーム後にずらしたのが変更点です。 _parent は相対パスで,そのムービークリップの親, つまり,B.swf の _root を指します。 _root のままだと,A.swf に読み込まれた場合, A.swf の_root を示すので, このムービークリップの意味がまったくなくなってしまいます。 そして,最初のムービーに戻るスクリプトはどうされているのかわかりませんが, 最初のムービーの 最終フレーム に戻りたいときは gotoAndStop(1); で,空白フレームに戻るので,自動的に A.swf の最終フレームが表示されます。 B.swf の背景ですが, 透明な部分があると,A.swf の最終フレームが透けて見えてしまうので, もし透明な部分がある場合は, B.swf の一番下に背景用のレイヤーを追加して,背景を白などに塗りつぶしてください。 当然,B.swf のフレーム1を塗りつぶすと,A.swf が見えなくなってしまうので, 塗りつぶすのは フレーム2 以降です。 また,A.swf に作った loadMC ですが, 塗りの四角がそのムービークリップ内にあると思うので, ダブルクリックで,そのムービークリップ内の編集に移り, その塗りを削除してください。空のムービークリップになります。 すると中心点の ○ だけが残ると思います。 その空の状態でOKです。 ========================= 長くてややこしくなりましたが,わかりましたでしょうか? わからなくなれば最初に書いた, ///////////////////////////// A.swfのLoading ↓ A.swfの再生 同時に B.swfの読み込み開始 ↓ A.swf最終フレームでstop(); 同時に B.swfの再生 ↓ B.swfの再生 ↓ B.swf終了 同時に B.swfの gotoAndStop(1); つまり,A.swf の loadMC に B.swf を読み込むのだけれども, B.swf の最初のフレームは空にして stop させておく。 ///////////////////////////// という全体のしくみを作る中で, 今自分はどの作業をしているのか確認しながら作業すると迷子にはならないと思います。 最初から,上のしくみを想定していると簡単なことですが, 後から修正する場合は,今までの作成過程と修正が頭の中で交錯するので, 理解しにくくなるとは思います。
補足
お久しぶりです、貴重なご回答ありがとうございます。今回の私の質問ですが前回の質問(別のファイル.swfへジャンプは可能?)(Flash再生中につぎのフレームをLoadingしときたい)に関して上記の回答を参考にさせて作成とさせていただきます。 改めて今現在の状態をいいますと実はB.swfが存在しないのです。 ---------現在の状態----------------------- (1)htmlのトップページにて A.swfのフレーム940までLoading中(1分くらい) ↓ (2)Loading後、A.swfを再生 ↓ (3)A.swf再生中or終了後どちらでもいいがサブページへ移動 ↓ (4)サブページからトップへ戻ったとき A.swfのフレーム940までLoading中(同じく1分) ↓ (5)A.swfを再生せず940のフレームへジャンプ,停止 ----------ここまで------------------------------ ...が現状となっています。 問題は(4)です。今回の質問はサブからトップへ戻ったときは(4)のLoadingをなくしてすぐ、(5)に行きたいのです。 以前ご回答いただいた、「1分くらいでアクセスした場合、同じムービーを2回みせたくない」処理にたいしLoadingをつけ加えた今回の質問ですが 最初の (1)のLoadingはOK、問題ないです。 要は (4)の同じLoadingが発生するのをふせぎ (5)A.swfを再生せず最後の940へジャンプ停止 勉強不足のため毎回お手数おかけしております 改めてご回答お待ちしております。
お礼
ご回答ありがとうございます。おかげさまで無事かいけつしました。補足させていただきますと、“フレーム3 にSharedObjectのスクリプトを書いたムービークリップ” ということでしたがフレーム1に移動し逆に"Now load" を1フレームから2フレームへ移動することにしました。 (ん?タイムフレームは上から順番に処理するのか?その場合は意味が無い?気力をつかいはたしたので、試してません)一応成功ですので感謝、感謝です。 技術的な話とはべつになりますが、ホームページというのは人にあきられないように作るのが自分の哲学(笑)としているため同じ絵をなるべく避けるべく今回みたいな事態 になっています。今後もさらにスクリプトを追加していかなければならないアイディアがあるので、次回も目にとまったら聞いてやってください。ご苦労おかけします、改めて感謝とさせていただきます。