Flash:外部JPEG読み込み待ちについて

このQ&Aのポイント
  • Flash MX2004を使用して、外部JPEGを4枚読み込ませる方法を教えてください。
  • 読み込むJPEGファイルはサイズが小さく、一般的な回線速度でも再生に追いつかないことはありませんが、全ての画像を読み込み終わるまで再生しない方法を知りたいです。
  • ActionScriptは初心者であり、サンプルコードの修正程度の知識しかありません。どなたか教えていただけないでしょうか。
回答を見る
  • ベストアンサー

Flash:外部JPEG読み込み待ちについて

こんにちは。どうぞよろしくお願い致します。 Flash MX2004使用です。 外部JPEGを4枚読み込ませ、 4枚全部読み込み終わるまで再生をストップさせる またはローディング画面を表示する という事をやりたいのですが、なかなかうまくいきません。 現在の状況は、1フレーム目に this.ph01.loadMovie("01.jpg"); this.ph02.loadMovie("02.jpg"); this.ph03.loadMovie("03.jpg"); this.ph04.loadMovie("04.jpg"); 「ph01」に onClipEvent (load) { this._parent.stop(); } onClipEvent (data) { if (this.getBytesTotal()>0 && this.getBytesTotal()<=this.getBytesLoaded()) { if (this._parent.ph02.getBytesTotal()>0 && this._parent.ph02.getBytesTotal()<=this._parent.ph02.getBytesLoaded()) { if (this._parent.ph03.getBytesTotal()>0 && this._parent.ph03.getBytesTotal()<=this._parent.ph03.getBytesLoaded()) { if (this._parent.ph04.getBytesTotal()>0 && this._parent.ph04.getBytesTotal()<=this._parent.ph04.getBytesLoaded()) { this._parent.play(); } } } } else { this._parent.stop(); } } と書いています。 何分ActionScriptはまだまだサンプルの真似事とちょっと手を加える程度の知識しかないもので、上に書いた物もものすごい間違い方をしているかもしれません(恥) 読み込むJPEGファイルは大したサイズではないので、一般的な回線速度なら普通に再生しても読み込みが再生に追いつかないという事もないのですが、先方の指示で絶対に!!全ての画像を読み込み終わるまで再生しないように!!と言われています。 どなたか、どうかお力を貸して頂けないでしょうか。 よろしくお願い致します。

  • mfu
  • お礼率89% (17/19)
  • Flash
  • 回答数2
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

JPEG 画像を読み込むには、loadMovie の他に、Flash MX 2004 から登場した MovieClipLoader クラスを使う方法があります。 loadMovie は古いバージョンの Flash Player でも動く利点があります。 しかし、loadMovie による読み込みの進捗状況は getBytesLoaded と getBytesTotal で把握できることはできるのですが、実行するタイミングによっては画像を読み込むために用意したムービークリップインスタンス自体の容量が返ってくる場合があり、loadMovie で画像を読み込む際の進捗状況が正確に把握できないことがあるようです。 Flash MX 2004 をお使いとのことですので、ここでは、MovieClipLoader を使った作例をご紹介します。 外部から何かのデータを読む時は、少なからず時間がかかるものです。 読み込みが終わるまで待ってから先に進むといった処理は、1つのフレームやオブジェクトアクションだけで何とかしようとしないで、フレーム間をループする発想で考えると作りやすいです。 フレームの構成は、次のように考えます。  フレーム1:初期設定と読み込み開始。  フレーム2:読み込み完了を待つためのフレーム。スクリプトは設定しません。  フレーム3:読み込み完了判定と完了率の算出・読み込み完了後の処理など。  フレーム4:タイムラインを止め、普段はここを表示します。 レイヤーは次のような構成にします。  アクション:スクリプトを書きます。  完了率表示:完了率を表示します。  クリップ :画像を読み込むためのムービークリップを配置します。 読み込みが終了したら、フレーム4でタイムラインを止めます。続くアニメ等があるようでしたら、止めずに先に進んでください。 完了率はフレーム1~3まで表示します。 仮に、ステージにムービークリップ ph01 ~ ph04 があり、それぞれに 01.jpg ~ 04.jpg を読み込むものとします。 また、完了率をプログレスバーで表示するために、ムービークリップのインスタンス prog_bar が配置されているものとします。 スクリプトはフレーム1と3に書きます。 各フレームのスクリプトは、大体、次のようになります。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります)  ●フレーム1   //読み込み用オブジェクトの作成   load_obj = new MovieClipLoader();   //完了率算出用オブジェクトの作成   prog = new Object();   //読み込みが完了したファイル数を保持   loaded_cnt = 0;   //画像の総数を保持   image_max = 4;   //プログレスバーが見えないようにする   prog_bar._xscale = 0;   /*読み込み終了時の処理を定義*/   load_obj.onLoadInit = function( clip:MovieClip )   {    //一旦、画像を非表示にしておく    clip._visible = false;    //読み込みが完了した総数を更新    loaded_cnt++;   };   /*エラー発生時の処理を定義*/   load_obj.onLoadError = function()   {    //何らかのトラブルで読み込みが失敗した場合も、    //さしあたって読み込みが終了したものと見なす    loaded_cnt++;   };   //画像を読み込む   for( i = 1 ; i <= image_max ; i++ )   {    load_obj.loadClip( "0" + i + ".jpg" , this[ "ph0" + i ] );   }  ●フレーム3   //全ての画像が読み込み終わるまで待つ   if( loaded_cnt < image_max )   {    //読み込み完了率を算出    loaded = 0;    total = 0;    for( i = 1 ; i <= image_max ; i++ )    {     //進捗状況を取得     prog = load_obj.getProgress( this[ "ph0" + i ] );     //全画像の合算で完了率を出す     loaded += prog.bytesLoaded;     total += prog.bytesTotal;     per = Math.floor( loaded / total * 100 );    }    //プログレスバーの描画    prog_bar._xscale = per;    //読み込み完了まで待つ    gotoAndPlay( _currentframe - 1 );   }   else   {    //全て読み込まれたら、全画像を表示    for( i = 1 ; i <= image_max ; i++ )    {     this[ "ph0" + i ]._visible = true;    }    //次のフレームでタイムラインを止める    nextFrame();   } MovieClipLoader は画像や swf ファイルの読み込みを専門に請け負うクラスです。 loadMovie よりも多くのイベントが発生し、進捗状況を細かく把握することができます。 MovieClipLoader では1つのオブジェクトで複数の読み込みを管理でき、1度イベント発生時の処理を定義しておくと、どの読み込みでイベントが起きた時も同様の処理を行ってくれます。 今回は、読み込みが完了した時に発生する onLoadInit と、商業用の作品のご様子でしたので、エラー時に発生する onLoadError イベントを利用しています。 まず、読み込み完了時の指示である onLoadInit についてですが。 今回は4枚の画像を、1つの MovieClipLoader クラスのオブジェクト(上記の例では load_obj )で読み込みます。 MovieClipLoader では1件1件の読み込みごとにイベントが起きますが、4枚とも全て終わったかどうかは、スクリプトを工夫しないと判断できません。 そこで、1件の読み込みが済むごとにカウントをとり、これが画像の総数と一致しているかどうかで、4件の読み込みが済んだかどうかを判断するものとします。 完了率は4枚分の合算で求めますから、完了率が 100 %に達したかどうかでも、理論的には終了を判断できます。 しかし、もし読み込みが途中で失敗した時には計算が狂ってしまいますし、実は MovieClipLoader で読み込んでも、getProgress を実行するタイミングによっては総容量とロード済み容量がともに0になっていたり未定義になっていたりすることがあり、上手くいかない場合があります。 このあたりはどうも、回線の都合等で読み込みが始まるタイミングが違うことが原因のようです。 完了した件数のカウントで判断すれば、総容量とロード済み容量が取得できない状況で0が返ってきたとしても、それは一時的な現象で、ファイルが開かれれば次からは正常な値を取得でき、より確実に完了を検出できます。 画像を複数読み込むと、通常は、読み込みの済んだものから順次表示されていきます。 今回は完了率をプログレスバーで表示しているので、途中で画像が重なって表示されてしまっては困ります。 上記のスクリプトでは、onLoadInit の中で、読み込み完了と同時に画像を一旦非表示にして、4枚とも読み込み終わるのを待ってから、全画像を表示するようにしています。 画像は容量が大きく読み込み時間も長くなるため、途中で回線が切断したりサーバーのトラブルなど、不測の理由によりダウンロードが失敗する可能性があります。 onLoadError は、エラーでダウンロードが失敗した時に発生するイベントです。 今回は省略していますが、エラーが起きたムービークリップと、エラーの種類( URL が見付からなかったためか、もしくは回線の切断等によるダウンロードの未完了)を判別することもできます。 今回は、エラーで中断したものはとりあえず読み込み終了と見なして、単純に終了した数を更新しているだけですが、再度読み直したり、ブラウザでいうところの×印などを表示しておくといった処理にも利用できます。 エラー処理につきましては、ヘルプのサンプルをご参考になさってください。 MovieClipLoader で読み込んだ場合は、getProgress という命令(メソッドといいます)で進捗状況を把握できます。 getProgress の戻り値は総容量とロード済み容量の2つですので、汎用型の Object 型の変数を作り、まとめて受け取ります。 上記のスクリプトでは、変数 per に4件分の完了率がパーセントで入ります。 さしあたってプログレスバーの描画に利用していますが、ダイナミックテキストで表示すると、Now Loading ○%というスタイルでも表示できます。 長くなってすみませんでした。 不明な点がありましたら、補足してください。

mfu
質問者

補足

早々のご回答ありがとうございます! 上記のスクリプトを試してみたところ、何とかなりそうです。本当に助かりました。ありがとうございました! ただ、先に書いておけば良かったのですがもう一つ問題があります。 実は同じJPEGファイルを二回ずつ読み込みたいのです。 一つは普通に表示し、もう一つはその背面でフェードインしながら大きくなる→フェードアウトといった動きをつけます。 その為、前までは this.ph01.loadMovie("01.jpg"); this.ph02.loadMovie("02.jpg"); this.ph03.loadMovie("03.jpg"); this.ph04.loadMovie("04.jpg"); this.ph05.loadMovie("01.jpg"); this.ph06.loadMovie("02.jpg"); this.ph07.loadMovie("03.jpg"); this.ph08.loadMovie("04.jpg"); といった具合に読み込ませていました。 (読み込む量が二倍になってしまうし、スマートじゃないのですが・・) 教えて頂いたスクリプトでは、読み込むファイルの名前を "0" + i + ".jpg" , this[ "ph0" + i という形で表しているのですよね。 この場合、同じファイルを二度読み込む方法はありますでしょうか。 素人臭い質問で申し訳ありません。 どうかよろしくお願い致します。

その他の回答 (1)

  • DPE
  • ベストアンサー率85% (666/776)
回答No.2

01.jpg ~ 04.jpg を、ムービークリップ ph01 ~ 04 と ph05 ~ 08 に読み込む、ということですね。 for ループを二重にすることで、対応できます。 画像は4種類ですが、ムービークリップは倍の8つになります。 必要な時に計算で image_max * 2 としてもいいのですが、この数は何回か利用するので、変数として持っておくと便利です。 フレーム1に、次のようなスクリプトを追加してください。 場所はどこでも構いませんけれど、image_max = 4; の次あたりが分かりやすいと思います。  //画像を読み込むムービークリップの総数を保持  //(同じ画像を2組ずつ読み込む)  clip_max = image_max * 2; それから、フレーム1の画像を読み込む for ループを次のように変更します。  //画像の読み込み  //同じ画像を2組読み込む  for( i = 0 ; i < 2 ; i++ )  {   for( j = 1 ; j <= image_max ; j++ )   {    clip_no = ( i * image_max ) + j;    load_obj.loadClip( "0" + j + ".jpg" , this[ "ph0" + clip_no ] );   }  } 画像の番号は1~4が2回に対し、ムービークリップの番号は1~8と参照できるようにループを考えます。 画像の方は1~4を2回出すだけですから、2回繰り返す i のループの中に1~4までの間繰り返す j のループを組み込むことでクリアできます。 ムービークリップの番号を、i と j の値を使って1~8と出るように求める式が、少々工夫が必要とされるところです。 内側にある j のループでは、j が1~4の間、ループが継続します。 ムービークリップの番号は、1回目のループでは1~4でいいので、j の値に何も加算せず、そのまま利用できます。 しかし、2回目は5~8で、これは、 j の値に画像の枚数(= image_max )の分だけ加算した値といえます。 従って、ムービークリップの番号は  画像の枚数× ( ループ回数 - 1 ) + j で、求められます。 ループの回数は、この場合は外側のループのループカウンタ i のことです。i の初期値を0から始めると、-1 する手間を省いてスッキリとループを組むことができます。 今回は2組ですが、i のカウントを増やすと、3組でも4組でも同様に読み込めます。 ムービークリップが増えた分、フレーム3で完了を検出する部分にも変更が必要です。 ムービークリップの総数は clip_max という変数に入れています。フレーム3のスクリプトで image_max としていた部分を、全て clip_max に変更してください。 フレーム3のスクリプトの冒頭にある if 文の条件内と、2箇所ある for ループの、3箇所で使っています。 -------------------------------------------------------- ところで、ムービークリップが8つもあると、読み込みの都合上、スクリプトが実行される時にはまだムービークリップが読み込まれておらず、ムービークリップが undefined (未定義)になっているために画像の読み込みが失敗することがあります。 速度の遅い回線で閲覧する場合は特に、スクリプトに落ち度がなくても、このような理由から画像が表示されないトラブルが発生する可能性もあります。 フレーム1の前に空のフレームを1つ挿入し、ムービークリップよりも後で読み込みのスクリプトが実行されるようにしておくと、万全だと思います。

mfu
質問者

お礼

DPE様、丁寧なご回答本当にありがとうございます! 少し手間取りましたが、無事完成し大満足のものが出来ました。 大変感謝しております。ありがとうございました。

関連するQ&A

  • フラッシュMXのナウローディングとロードムービー

    最近フラッシュMXをウインドウズXPで使い始めています。質問です。よろしくお願いします。 フラッシュで a.swf に b.swfを読み込ませたいと思っています。b.swfにはナウローディングをつけています。 b.swfの最初につけたナウローディングスクリプトです。 onClipEvent (load) { _root.stop(); var LoaderMC = _root; } onClipEvent (enterFrame) { this.percentloaded = Math.floor(LoaderMC.getBytesLoaded()/LoaderMC.getBytesTotal()*100); trace(this.percentloaded+"%"); this.percentMC.percentdisplay = percentloaded+"%"; this.loaderbalken._xscale = percentloaded; if (percentloaded == 100 && !initialized) { initialized = true; trace("ロード終了"); _root.gotoAndPlay("loadok"); } } a.swfにb.swfを読み込むために、a.swfに次のスクリプトをつけています。 loadMovie("b.swf", "***"); 読み込まれることは読み込まれるのですが、b.swfのローディング画面でストップしてしまい、それ以降b.swfは再生されません。 a.swfに配置してあるアニメは問題なく再生されているのですが。ちなみにb.swfは単体では正常にナウローディング後、再生されます。 なぜ b.swfは再生が止まってしまうのでしょうか。よろしくお願いします。

  • 外部JPG読み込みでのLoading

    こんにちは。 FLASH MXでものすごく単純なことをしようとしているのですが、 出来ずに困っております。 外部JPGを読み込むときにloading画面を表示したいのですが、 それが出来ずに困っております。 レイヤーが下記の様に3つあります。 script loading(loadingの文字)1フレーム目に文字、2フレーム目は空 base(読み込み用のMC) scriptの1フレーム目に下記のスクリプトを書いております。 --------------------------------------------------------- base.loadMovie("thumb/"+_name+".jpg"); if(this.getBytesTotal() < this.getBytesLoaded()){ this.gotoAndstop(2); }else{ this.stop(); } ---------------------------------------------------------- これでプレビューすると写真読み込みは完了しているのですが、 loadingの文字が写真の上にかぶさったままになります。 どのようにすればよろしいでしょうか?お教えいただければ 幸いです。

    • ベストアンサー
    • Flash
  • Now Loadingから次のフレームに行かない

    Flash8です。 1フレームに全体のサイズを読み込むスクリプト ------------------------- this.onEnterFrame = function() { nParcent = (_root.getBytesLoaded()/_root.getBytesTotal())*100; if (nParcent == 100) { _root.play(); delete this.onEnterFrame; } }; _root.stop(); ------------------------- と、%を数字で表記するためのスクリプト ------------------------- onClipEvent (enterFrame) { num = Math.floor(_root.getBytesLoaded()/_root.getBytesTotal()*100); _root.nowloading.percent = num+"%"; } ------------------------- を入れていて、100%読み込んだら次のフレームより開始(再生)したいのですけど、 現状読み込んで(数字も0から100に上がって行って)、100%になった状態でストップして再生しません。 何が足りないのでしょうか? アドバイスお願いします!

  • 外部jpeg読込み

    外部jpegを読込用 ムービークリップ"img"に対して外部jpegを読み込もうとしています。 ムービークリップに直接loadMovie(Path)として画像を読み込んで、そのムービークリップのアクションで onClipEvent (load) { this._width = 100; this._height = 50; } とサイズを指定しています。 このサイズを指定しているアクションを_rootステージのアクションスクリプトレイヤーに置き換え直接書きたいのですが方法はないのでしょうか? ご教授ください。

    • ベストアンサー
    • Flash
  • FLASHのプリロードについて…

    こんにちは。 最近FLASH MXをはじめたばかりの初心者です。 プリロード画面を作ったのですが、全て 読み込むまでに結構な時間がかかってしまいます。 そこで、全部読み込んだ時点で再生、ではなくて ある一定のフレームまでもしくは全体の○%まで 読み込んだら再生を始める、というようにしたいの ですが、そんなアクションはないでしょうか? onClipEvent(enterFrame){ total=_root.getBytesTotal(); loaded=_root.getBytesLoaded(); if(loaded==total){ _root.play();}} 今は↑のように書いています。 ご回答宜しくお願いします。

  • 半分読み込んで再生するプリローダー

    Flashでプリローダーを作成しています。 これまでは100%読み込むとムービーを再生するという、 よくあるタイプのものを使用していましたが、 今回は全体の半分、または指定のバイト数を読み込んだら再生するものにしたいと思っています。 そこで自分でスクリプトを書き換え、試行錯誤してみましたがどうしてもうまくいきません。 【もとのスクリプト(正常に動作します)】 ================================================================== this.onEnterFrame = function() { _root.stop(); nParcent = (_root.getBytesLoaded() / _root.getBytesTotal() )*100; this.nParcent_txt.text = Math.round(nParcent)+"%"; if ( nParcent == 100) { _root.play(); } } ================================================================== 【書き換え後のスクリプト】 ================================================================== this.onEnterFrame = function() { _root.stop(); halfSize = _root.getBytesTotal() / 2; nParcent = (_root.getBytesLoaded() / halfSize )*100; this.nParcent_txt.text = Math.round(nParcent)+"%"; if ( nParcent == 100) { _root.play(); } ================================================================== 書き換えた後の方を実行すると、 200%まで読み込んでムービーがストップしてしまいます。 ActionScript初心者でどこが間違っているのか見当がつかず困っています。 ご回答よろしくお願いします。

    • ベストアンサー
    • Flash
  • Flashビデオの音声が途切れ途切れで再生されてしまう。

    プログレスバーのActionScriptを追加したところ、 埋め込んであるFlashビデオの音声が途切れ途切れで再生されてしまいます。 "下記の内容です。 _root.stop(); this.onEnterFrame = function() { partNumber = (_root.getBytesLoaded()/_root.getBytesTotal())*100; partNumber_txt.text = "Loading " + Math.round(partNumber) + "%"; if (partNumber == 100) { //clearInterval(intervalID); _root.play(); } }; function startMC(){ spin_mc._rotation += 30; } var intervalID = setInterval(startMC,50); "ここまでです。 (同時にミュージックも埋め込んで再生していますが、こちらの音は問題なし。) パブリッシュ設定をいくつか変えてぱブリッシュを試したのですが、上手くいかず、 プログレスバーのActionScriptを削除しパブリッシュすると問題なくFlashビデオの音声も再生されます。 この症状には、どういった問題が考えられますでしょうか? ご教授頂けますと幸いです。何卒、よろしく願い致します。

  • flashでjpg画像をloadmovieで読み込んでいるのですが。

    flashでjpg画像をloadmovieで読み込んでいます。それで、pictという名前のフォルダに、1.jpg 2.jpg 3.jpg というように画像ファイルに名前をつけています。 actionscriptでフォルダの中の画像を loadmovie("./pict/" + i +".jpg"); i++; というようにして、5秒ごとに画像を入れ替えるようにしています。質問内容なのですが、画像がフォルダの中に入っている画像分終了したら、写真を入れ替えるloadmovieをとめたいのです。 現状では、もし画像が10枚だったら if(i >= 11){  this.stop(); } というようにif文使ってますが、ここの11と入れてるところを関数でひろいたいのです(フォルダに入っている画像の数を調べるスクリプトを教えていただきたいのです)。 そのような関数はございますでしょうか?もしくは同じようなことができる方法はありますでしょうか? winXP、flashMX2004proです。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 1フレーム~5フレームまで表示されなくなったのは。。。

    こんにちわ毎回お世話になっております 新しいフラッシュを作ったのですが 前回のフラッシュにしようしたロード画面を 使いまわしました。 ムービークリップ自体には onClipEvent (load) { _root.stop(); } onClipEvent (enterFrame) { if (100 == Math.floor(_root.getBytesLoaded()/_root.getBytesTotal()*100)) { _root.gotoAndPlay(5); } } onClipEvent (enterFrame) { this.gotoAndStop(Math.floor(_root.getBytesLoaded()/_root.getBytesTotal()*100)); } と前回同様記述しました。 しかし今回はロード画面がでず 白紙の画面のまま読み込みが完了し そのままフレーム5に進んでしまっています。 何回もやりなおしたのですが どうしても白紙のまま読み込んでしまいます。 これはFLA自体が破損?したのでしょうか? 非常に困っています。 なにかアドバイスがありましたらお願いいたします。 別のロードムービーを作ったものの 白紙のまま読み込みされました。。。 FLASH8 WIN XP使用です。

    • ベストアンサー
    • Flash
  • 2つのswfファイルをつなげている場合の一括ローディング方法

    お世話になります。 この質問の下の質問で、外部JPGファイル読み込みのローディング方法を質問しておられますが、そこを読んでも、外部swfファイル読み込みの際のローディング方法に応用することが出来ませんでした。 700Kのswfの最後のフレームに、 loadMovieNum("img/next.swf", 0); として、500kのnext.swfファイルとつなげています。 最初のswfファイルの1シーン目で、2つのswfを全て読み込み、再生時のつながりをスムーズにしたいと考えています。 最初のswfの1シーン目に、 ローディングオブジェクトを置き、 onClipEvent (load) { _root.stop(); par = 0; bar._xscale = 1; } onClipEvent (enterFrame) { par = parseInt((_root.getBytesLoaded() / _root.getBytesTotal()) * 100); if (par == 0) { par = 1; } else if (par >= 100) { par = 100; _root.gotoAndPlay("start"); } bar._xscale = par; } ローディングすると、フレームラベル「start」 に飛び、 そのフレームに置いているオブジェクトに onClipEvent (load) { par = 100; bar._xscale = 100; } onClipEvent (enterFrame) { _alpha -= 5; } を書き込んでいます。 そして、2シーン目に飛び、 2シーン目の最後のフレームに、 loadMovieNum("img/next.swf", 0); を置いてつなげています。 FLASH本を数冊持っているのですが、2つのswfを 同時にローディングする方法が載っておらず、 こちらに質問を書かせていただきました。 もしかしたらこの質問の下質問JEPファイルの ローディングと内容がかぶってるかもしれませんが、 よろしくお願い致します。 【制作環境】 Win XP FLAS MX

    • ベストアンサー
    • Flash

専門家に質問してみよう