• ベストアンサー

for文について

以前もお聞きしたかも知れませんが、教えて頂きたく。 7フレームに以下のScriptを記述しています。 sheet.target.duplicateMovieClip(ctr,ctr) ; dummy_loader.loadClip(var_article[ctr-1]+".jpg",sheet[ctr]); gotoAndPlay("rtn") ; dummy_listener.onLoadError = function(target_mc:MovieClip, errorCode:String) { gotoAndstop("end") ; } dummy_listener.onLoadComplete = function(target_mc:MovieClip) { sheet[ctr]._name = ctr ; sheet[ctr]._x += (ctr - 1) * 90 ; var_ctr++ ; dummy_loader.unloadClip(var_article[ctr-1]+".jpg"); }; 「rtn」は6フレームのフレームラベル、「end」は8フレームのフレームラベルです。 var_articleと言う配列に入っている情報(Key項目)を元にJPEGを読込んでいます。 onLoadCompleteにてJPEGをセットして前のフレームに戻して配列にデータが入っている間6<->7フレームをグルグル回って処理しています。 正常に動いています。 これを、No.1005374の#3でDPEさんに指摘して頂いたようにfor文を使ってのループ処理に変えたいと思います。 for(i = 0; i <= ctr; i++) { sheet.target.duplicateMovieClip(ctr,ctr) ; dummy_loader.loadClip(var_article[i]+".jpg",sheet[i]); } これで、1件づつ読込んでonLoadCompleteにて複製したムービークリップに名前を付けて当該の座標に配置しようと試みました。が、結果はfor文が全て処理されてからonLoadCompleteの処理がなされてしまいます。 自らフレームを利用したループと、for文を利用したループと、何処が違うのでしょう?。 どうぞ宜しく御願い致します。

  • Flash
  • 回答数2
  • ありがとう数7

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

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

http://okweb.jp/kotaeru.php3?q=1005374 の#3のお礼文を見た時、少々誤解なさっているのではと思ったのですが、案の定・・・ですね。 前回はファイルの名前や総数が分かりませんでしたので、1回読んでみてエラーがなければ、ファイルが存在するものと見なしてムービークリップに読み込む・・・という作業を繰り返すロジックでした。最終的な数が分からない以上、1つ1つ手探りで読んでいくしかないのは仕方ありません。 1度ファイルの存在を確認に行くということは、確認にかかる時間を考慮しなければなりませんでした。この待ち時間は、フレーム間をループしてフラグを監視するという方法で実現していたわけです。 MovieClipLoader を使ったところで、ファイルの数が分からなければ、とりあえず読み込みを始めてみて、onLoadStart イベントが発生すればファイルがあるものと見なし、次のファイルを探しに行くという、フレーム間をループしてフラグを確認しながら1つずつ順に読み込みの指令を出さなければならないロジックは同じです。 今回はファイル名を配列で持っており、読み込むファイル名や数が最初から判明しています。for 文を使って、まとめて読み込みの指令を出すことが可能です。 ですが、http://okweb.jp/kotaeru.php3?q=1005374 でもちょっと書きましたけれど、loadMovie は「○○という画像を△△のムービークリップに読み込め」という指令を出すだけです。この点については、MovieClipLoader の loadClip といえども同じです。 「読み込め」の指令が出された時、読み込みが終わるまでスクリプトの実行がそこで止まってしまうことはなく、他の描画やスクリプトも普通に実行され、その裏で読み込み作業が並行して行われます。 例えば、for ループで5回 loadMovie や loadClip を実行すると、「 image 1 ~ 5 をムービークリップ clip 1 ~ 5 に読み込め」という5件の読み込み命令が出され、ループが終了して次のスクリプトに進みます。 読み込みの命令に従い、他のスクリプトの実行やタイムラインを動かすかたわら、裏で読み込みが実行されます。 その読み込みが終わった時はじめて、data や onLoadComplete イベントが発生するのです。 読み込みが終わるタイミングは画像の大きさや回線の速さなどで変動しますから、loadMovie や loadClip から○フレーム後で読み込みが終わると、具体的に決めることは不可能でしょう。 ですから、読み込んだ画像をただ表示して終わりではなく、読み込み後に何かを実行したいのであれば、読み込みの完了を待って先に進むといった工夫が必要になるのです。 特に読み込み関連のイベントは、タイムラインから外れて発生する割り込み信号のようなものです。これを、何とかタイムライン上で扱えるようにしようとする方法の1つが、イベント発生時にフラグに情報を保存して、フレーム間をループしてフラグを監視するというものです。 結論としましては・・・ 前回、フレーム間をループしながら1件ずつ読み込みの命令を出していたところを、今回は for ループでまとめて命令を出すことが可能になりました。 しかし、結局は読み込みの命令の出し方が変わっただけの話です。読み込み完了を待つための、フラグ等を利用したフレーム間のループを作る必要まで、なくなったわけではありません。 全部のファイルの読み込み完了を待って処理を進めるには、別途、個々の読み込み完了時に発生するイベント( onLoadComplete か onLoadInit 、普通は~Init の方を使います)時に読み込みが済んだファイル数をカウントし、この値を監視して分岐するなどしてください。 それから、MovieClipLoader のイベントについても、少々誤解なさっているようですが。 MovieClipLoader は1つのオブジェクトで複数の読み込みを管理できます。 イベントは、loadClipで受け付けた全ての読み込みでそれぞれ発生します。例えば、loadClip で5件の画像の読み込み命令を出したら、5組の onLoadStart や onLoadInit が発生します。つまり、たった1つのオブジェクトでありながら、5件の読み込みの1つ1つで、読み込みのスタートや終了、エラーが起きたかどうかなどを管理できるというわけです。 そんな器用なことができるの?と、思わず疑ってしまうほどの器用さですが、それが MovieClipLoader の偉大な点なのです。 onLoadComplete イベントも同様で、loadClip で受けた読み込みが全部終わった時に発生するのではなく、1つ1つの読み込みが終了した、その1件ごとに発生します。loadMovie や LoadVars の data ・ onLoad イベントとは少し発想が違いますので、ご注意ください。 MovieClipLoader は、読み込みに関しては MovieClip.loadMovie よりも有利な点をたくさん持っていますが、それだけに、扱いが少々難しいです。 イベントの扱い方が難しいようでしたら、とりあえずは loadMovie を使って試作し、処理の流れをつかんでから MovieClipLoader に移行してはいかがでしょうか。

teddy1014
質問者

お礼

Traceを駆使して、DPEさんのおっしゃる事を検証しました。 おっしゃった通り、for文の処理が終了した時点でonLoadComplete関数がfor文で処理した回数分実行されました。 今回は、for文で配列に格納した分だけ読込みを行ない、onLoadComplete関数でカウントアップしながら座標の決定とunload処理を行ないました。 for文を記述した2つ先のフレームで終了処理を実施する前に、onLoadComplete関数でカウントした変数と配列に格納した変数を比較して全てが終了していなければ一つ前のフレームに戻ると言うループ処理を行ないました。 MovieClipLoaderの持つイベントを有効利用したとは言えませんが、何とか今回はMovieClipLoaderを使って完成させる事にしました。 これからも、色々お教えください。 ありがとうございます。

その他の回答 (1)

  • UNAHO
  • ベストアンサー率57% (20/35)
回答No.1

正解かどうか分かりませんが私も気になっているので乗っかります。(^^;) つまり、変数やプロパティの設定は問題ないのにロードの確認やムービークリップを複製するときはなぜ出来ないのか?ということですよね。 私なりの解釈として、「そういう仕様」なんだと思います。 理由について。 一般的なプログラムの場合、1つのプログラム(ファイル)が実行されるときのポインタは1つです。複雑な処理をしていてもサブルーチンに飛んでもそのプログラム内の1カ所が実行されているだけです。つまり直列に処理がされているわけです。 しかし、Flashの場合はムービークリップやキーフレーム毎、(サブルーチン処理も含む)にマルチ処理を行います。 正しい例とはいえませんが、ループ中にサブルーチンをコールした場合、ループを処理するポインタに加えサブルーチンを処理するポインタも発生します。つまり並列処理ですね。しかしコンピュータは自体は直列処理しかできませんので見せかけ上の並列処理となります。変数を書き換えるぐらいなら問題なくてもムービークリップの生成は処理に時間がかかるのだと思われます。 この時間のかかる「処理」を変数の(軽い)処理と同様に行うとFlashプレーヤーのプログラムが過負荷のため破綻してしまうのではないかと推測されます。(ループを使う処理ということは100とか1000とかでも実使用に耐えてもらわないと困りますよね) 従って意図してこういう仕様になっているのではないでしょうか。 また、ループ処理だからというわけではなく sheet.target.duplicateMovieClip(ctr,ctr) ; dummy_loader.loadClip(var_article[0]+".jpg",sheet[0]); sheet.target.duplicateMovieClip(ctr,ctr) ; dummy_loader.loadClip(var_article[1]+".jpg",sheet[1]); sheet.target.duplicateMovieClip(ctr,ctr) ; dummy_loader.loadClip(var_article[2]+".jpg",sheet[2]); sheet.target.duplicateMovieClip(ctr,ctr) ; dummy_loader.loadClip(var_article[3]+".jpg",sheet[3]); . . . としても同じ結果になると思います。 私もループ処理できれば楽なのにと思っています。 何かご存じであれば私も知りたいと思っています。

teddy1014
質問者

お礼

回答ありがとうございます。 Structuredプログラムとイベントドリブン型のプログラムの典型的な違いのような気がします。 ループで行なう処理とそこから発生するイベントとは、順序は無いと言う事だと思います。 DPEさんからのアドバイスは全くその通りです。

関連するQ&A

  • 再質問:for文について(MovieClipLoaderについて)

    以前質問で解決したと思っていましたが、本番環境で不具合が発生しましたので再度質問させて頂きます。 サムネイル表示するファイル名が入ったデータを配列に格納し、その配列に格納されたデータ分だけfor文を使ってループ処理を行い、その中でムービークリップの複製を作りLoadClipにて読み込み処理を行なっています。 その処理は以下の通りです。 for文で配列に格納されているファイル名で読み込み処理を行い、onLoadInit関数で  -複製したムービーの命名  -読込んだJPEGのunload  -セットカウンターのカウントアップ 等を行ないます。 for(i = 0 ; i <= var_ctr ; i++) {  sheet.target.duplicateMovieClip(i, i + 1) ;  dummy_loader.loadClip(var_folder + var_article[i] + ".jpg", sheet[ i ]); } dummy_listener.onLoadInit = function(target_mc:MovieClip) {  sheet[var_setctr]._name = var_setctr ;  sheet[var_setctr]._x += (var_setctr) * 90 ;  dummy_loader.unloadClip(var_folder + var_article[var_setctr] + ".jpg");  var_setctr++ ; }; 今回の問題は、 ・コントロールファイルの読み込みから終了処理時までは「Now Loading」の表示を行っているが「Now Loading」の表示がされながらサムネイルが1枚づつ表示されてゆき、途中で止まってしまう。 ・サムネイルをクリックした時に、別のエリアに拡大画像を表示する設定を終了処理で行なっているが、途中まで表示されたサムネイルをクリックすると正しく拡大表示される。 多分、以前の質問時にもご指摘を受けたように、読み込み完了待機のためにフレームを利用したループ処理を実装すれば解決するのかなぁと思っています。 宜しく御願い致します。

    • ベストアンサー
    • Flash
  • forとduplicateMovieClip

    for文とduplicateMovieClipを覚える事を目的に、アンケート用紙のようなムービーを作ろうとしています。 一つのMCを用意し、「MC」とインスタンス名をつけました。その中に四角の絵(□)とダイナミックテキストが一つずつ入れてあります。ダイナミックテキストには変数名HT_answerとつけてあります。 フレームから下記の様にASを書きました。 var HanswerBox:Array = ["Answer1","Answer2","Answer3","Answer4"]; _root.MC.HT_answer = HanswerBox[0]; for(i=1;i<=3;i++){ _root.MC.duplicateMovieClip (["MC"+i],i,{_x:_root.MC._x ,_y:_root.MC._y+(50*i)}); _root["MC"+i].HT_answer = HanswerBox[i]; _root["MC"+i].onRelease = function(){ Hflag = i; trace(Hflag); } } これでプレビューするとステージには下記のかたちで表示されます。 □ Answer1 □ Answer2 □ Answer3 □ Answer4 クリックするとチェックマークが入るというものを作ろうとしているのですが、Hflag = i で項目毎に番号宣言させて、その番号にしたがってチェックマークを表示させようと考えたのですが、なぜかすべて Hflag は 4 と出力されてしまいます。これはなぜなのでしょうか?まだfor文とduplicateMovieClipは覚えたばかりなので、理解に間違いがあるだとは思うのですが、どうにも上手くいかずに困っています。 for文、duplicateMovieClipなど、この辺りのご指摘と共にご回答をいただきたく思います。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • 画像の読み込みについて

    複数の画像を順番に読み込んで表示させようと考えています。 例えば以下のような形で、MovieClipLoaderを使って読み込もうとする場合、どのようにすればよいでしょうか。 イメージとしては、下記最後のfor文の中で読み込んでいる部分が、 順番に、1つ目の画像が読み込みが完了したら、2枚目の画像の読み込みのような形になると良いのですが。 よろしくお願いします。 var listener:Object = new Object(); listener.onLoadComplete=function(){ trace("onLoadComplete"); } listener.onLoadInit = function() { }; listener.onLoadProgress=function(target_mc,loadedBytes,totalBytes){ trace("onLoadProgress:"+":"+loadedBytes+"/"+totalBytes); } listener.onLoadStart=function(){ trace("onLoadStart"); } var loader:MovieClipLoader = new MovieClipLoader(); loader.addListener(listener); for(var i=0;i<10;i++){ loader.loadClip("hoge.jpg", this['image'+i].img); }

    • ベストアンサー
    • Flash
  • 入れ子になったfor文の初期化式について

    javascriptを勉強中の初心者です。 以下のスクリプトを見てください。 document.write("<p>"); outloop: for (var i = 1; i < 5; i++){ for (var j = 1; j < 5; j++){ document.write(i + " × " + j + " = " + (i * j) + "<br />"); if (i * j > 10){ break outloop; } } } document.write("</p>"); 5未満の数同士の乗算の結果を順に表示し 乗算の結果が10を超えたら外のループを抜けるというスクリプトです。 for文がこのように入れ子になっている場合、 内側のループが二週になるとjはまた初期化されて1になるのでしょうか? 手持ちの参考書にあるfor文の説明では『初期化式は初めの一回だけ実行される』とあります。 内側のループが二回目以降の時、参考書のいう『初めの一回』になると考えていいのでしょうか。 初歩的な質問で恐縮ですが、ご存知の方どうか教えてください。 よろしくお願いいたします。

  • JavaScriptでどちらの書き方が実行速度が速いですか?

    以下の2つの書き方は厳密には(内部処理のステップ的には)どちらが早いでしょうか? for (var i=0; i<10; i++) {  if (value == "dummy")  {   continue;  }  document.write(value); } for (var i=0; i<10; i++) {  if (value != "dummy")  {   document.write(value);  } }

  • ルートとムービークリップの関係について

    「target」と言うのは、外部のJPEGファイルを読み込む為のダミーのムービーです。(中身はありません。) 「sheet」内の1フレームに下記のScriptを記述しました。 var fileload:LoadVars = new LoadVars(); fileload.load("b"+i+".jpg"); fileload.onLoad = function(success:Boolean) {  if (!success) {    e_flg = 1;  } }; 5フレーム目には以下のScriptを記述しました。 if(e_flg == 0) {   target.duplicateMovieClip("b" + i, i) ;   this["b"+ i].loadMovie("b" + i + ".jpg") ; this["b" +i]._x += (i - 1) * 90 ; i++ ; gotoAndplay("loop") ; } else { function Sheet_Scrolling() { sheet._x = _root.sc_bar.getScrollPosition()*(-1) + 50 ; } _root.sc_bar.setScrollProperties(50, 0, (i - 1) * 90 - 360); stop() ; } *何をしているかと言うと、   -JPEGファイルがあるだけ読み込んで、targetと言うムービークリップの複製として読み込みながらsheet内に横展開する。その為のループ処理として1フレームと5フレームを行き来しています。   -JPEGを最後まで読み込んだらScrollBarコンポーネントの設定を行なっています。(以前お教え頂いた通りに。) ルートの1フレームに下記のScriptを記述しています。 sc_bar.setChangeHandler("Sheet_Scrolling"); JPEGを読み込んでいるようですが、表示されるのはマスクの範囲内だけ。ScorllBarも左右に動くのですが、ScrollしてもBarは動きますが、JPEGはそのままです。

    • ベストアンサー
    • Flash
  • Excelでfor文とif文の操作をしたいです

    Excelについての質問です。 Excelで、画像のようにシート1のA列にアルファベットと数字のデータがあり(重複はありません)、B列に1~5の数字が入っているとします。 この時、シート2のB列に、シート2のA列で指定したものと一致する、シートAのB列の値を入力したいです。 (この例の場合、上から順に5、4、1です) プログラミング言語でいう、いわゆるfor文とif文の併用で for(i=1;i<4;i++){ for (j=1;j<8;j++){ if(シート1のセルAj==シート2のセルAi){   シート2のセルBiにシート1のセルBjを値を入れる   ループを抜ける } } } というような感じになると思います。(間違っていたら申し訳ないです。) こういった処理は、Excelのマクロで可能でしょうか? また、できればどうすれば実現できるか、教えていただけると助かります。 よろしくお願いいたします。

  • どうやってもFor文を抜けてしまいます…(VBA)

    いつもお世話になっております。 VBAで作業をしていたところ、とある箇所でずっと詰まってしまい、 また皆様のお力を借りたいと思い・・・。 おそらく、基礎中の基礎かもしれませんが、お付き合い頂ければ助かります;; 【質問内容】 Functionが2つあったとします。 現在のFunctionから、別のFunctionに飛んで、また元のFunctionに戻ってきた際に、 Forでループ中でも抜けてしまうのでしょうか? おそらく、何を言ってるか分からないと思いますので、以下にコード例を記載します。 _________________________________ 【コード例】 function sample1() Dim roop as Long ’シート1のCell(7,4)には「100」と入力されており、「roopが2~100」の間ループさせます。 for roop + 2 To sheets("シート1").cells(7,4) 処理2 ’特定条件を満たしたら、「sample2」に飛びます。 if 条件 then call sample2 End If next End function _________________________________________________________________________________________ function sample2() ’sample1()で使用していたroop変数をそのまま使用します for roop + 1 To 50 処理2 roop + 1 next ’処理が終わりsample1()のnextに戻ります。 ’roopには、仮に50が格納されているとします。 End function _________________________________________________________________________________________ 上記のコードとなります。 最初はSample1()で処理を行い、特定条件を満たしたらSample2()に移行。 Sample2()の処理が終わったら、元のSample1()に戻る。 2つのFunction内で使用していた「roop」変数は、まだ80にも関わらず、 Sample1()のFor文を抜けてしまいます。 Sample1()のForのループ条件は「2~100」としていますが、 これは別のFunctionに飛ぶと、無くなってしまうのでしょうか? 何を言っているのか分からないなどございましたら、ご指摘ください・・・;; 以上、よろしくお願いします。

  • for文の処理で・・・

    こんにちは。Actionscript3.0で、 以下のようなスクリプトを動かしたいのですが、 menupositionReset(); function menupositionReset():void { for (var i:int = 1; i <= 10; i++) { trace("menu_mc" + i); ["menu_mc"+i].x=500; } } これを実行すると、 1083: Syntax error: dot is unexpected. と表示されて動きません。menu_mc01~10を500ピクセル動かしたいだけなのですが。。。 スクリプトはステージの1フレーム目に記述しています。 ["menu_mc"+i].x=500;でエラーが出ているようです。 なぜ動かないのでしょうか?

    • ベストアンサー
    • Flash
  • VB For-Next文でのExitではなく中断は可能?

    初歩的な質問で申し訳ありません・・・ ループで処理しているものがあるのですが、ExitForでループを抜けることはできますが、途中で処理を中断して次のカウンタの処理へ移ることはできるのでしょうか? 例えば For i = 1 to 10   if 関数1() = False then     ■ループ処理を終了するのではなく次のカウンタ[i]に移りたい■   else     Call 関数2()   end if Next i という事をしたいと思っています。 今は For i = 1 to 10   ret = 関数1()   if ret = True then     Call 関数2()   end if Next i という方法で記述していますが、上記のような条件文が10や20もあると、IF文の入れ子入れ子でかなりコードが見にくいです・・・。 どなたかよろしくお願いします!

専門家に質問してみよう