• 締切済み

duplicateMovieClipしたMCをSharedObjectで保存、読み込みたい

【やりたいこと】 duplicateMovieClipで何個も複製したムービークリップをSharedObjectで保存し(て読み込み)たい。 【わからないこと】 ユーザーが何個複製するかわからないものをi変数でカウントして それをSharedObjectで保存しようとしているが、 ユーザーが何個複製するかわからないMCに対する 一括命令文?がうまく書けない。 【現状】 まず、MC_printというMCの中にisuというMCがあります。 そのisuの上に空ボタンを置いて、以下のような スクリプトを書きました。 on (press) { _root.MC_print.isu.duplicateMovieClip("isu"+i, i++); //isuというMCをクリックするたびに複製していく _root.MC_print["isu"+i]._x = 500; //重なるので移動させてる } そして、保存ボタンに on (press) { _root.Save_Point(); } と書いていて、 SharedObjectインスタンスの生成は mySharedObject = SharedObject.getLocal("xypoint","/"); としています。 そして肝心のfunction命令文を function Save_Point() { mySharedObject.data["isu"+i._x] = _root.MC_print["isu"+i]._x; mySharedObject.data["isu"+i._y]= _root.MC_print["isu"+i]._y; } としています。 が、動きません。 理由は自分でもなんとなくわかるのですが、 複製されたMCが何個複製されたかわからない。 iの変数がちゃんと共有されてないんじゃないかと思っています。 が、_global変数にしても「isu1」「isu2」という風に インスタンス名を_nameで調べてテキストボックスで確認しても 複製はされてるが、このfunction命令文だとそのインスタンス名毎に (全てに)命令されてないってことですよね・・・。 for文とかを使うんでしょうか。でも何個複製されるか わからないし・・・。よくわかりません・・・。 環境はWindowsXP、FlashMXです。 MX以前の時代から突然またフラッシュを触り始めたので 新しいスクリプトなどはまったくわかりません。 なにかヒントでもいただければ幸いです。どうぞよろしくお願いいたします。

みんなの回答

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

#1 です。 > しかしながらこうしても当然?iの最後の数(たとえば4)の > isu4だけが移動するだけでして・・・。 それはそうなるでしょう。 mySharedObject 内の i ,つまり mySharedObject.data.i が 4 であれば 4 で固定です。 mySharedObject.data.i が 4 であると, 次の部分は, for (i=1; i<=mySharedObject.data.i; i++) { _root.MC_print.isu.duplicateMovieClip("isu"+mySharedObject.data.i , i++); } こうなります↓。 for (i=1; i<=4 i++) { _root.MC_print.isu.duplicateMovieClip("isu"+4 , i++); } これだと, "isu"+4 つまり isu4 だけが複製されます。 したがって, _root.MC_print.isu.duplicateMovieClip("isu"+i , i++); こうしないと,順次 i は繰り上がりません。

itosaka
質問者

お礼

なるほど・・・確かにできます・・・。 本当にありがとうございます・・・! あとはisuとtukueなどのMCで、別々のi変数を どうやって持つか・・・。書くか。 mySharedObject.data.iだけですとトータルの数ですから mySharedObject.data.isu.iみたいな形で保存できるのかどうか。 もしくは配列とか使わないと無理なのか・・・。 正直配列とかまったくわからないですが。 こうやってたくさんのオブジェクトを扱うとなると やはりクラスでしたか、そういうのを定義してやっていかないと どうにもカオスなFlashになってしまいますねぇ・・・。

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

> 複製されたMCが何個複製されたかわからない。 複製後,色々な位置に移動することも考えられますから, 個数がわからなくても全ての座標を保存すれば良いと思います。 結局 i 個できているわけですよね。 あと, > MC_printというMCの中にisuというMCがあります。 > そのisuの上に空ボタンを置いて、 と書かれましても,階層がいまひとつわかりません。  _root   └MC_print     ├ボタン     └isu というように, ボタンと isu は同じ MC_print 階層にあるものとします。 その場合, _root に書くスクリプトを次のように変更すれば良いと思います。 ------------------------------------------ mySharedObject = SharedObject.getLocal("xypoint", "/"); // 検証用 if (mySharedObject.data != undefined) { for (i=1; i<=mySharedObject.data.i; i++) { trace(mySharedObject.data["isu"+i+"_x"]); } } function Save_Point() { // 次回のため MC_print内の i も保存しておく mySharedObject.data.i = _root.MC_print.i; // isu? の座標を保存 for (i=1; i<=_root.MC_print.i; i++) { mySharedObject.data["isu"+i+"_x"] = _root.MC_print["isu"+i]._x; mySharedObject.data["isu"+i+"_y"] = _root.MC_print["isu"+i]._y; } } ------------------------------------------ 書かれていらっしゃるスクリプトですが, 2つの大きな間違いがあります。 配列アクセス演算子 ([ ]) は "1つの階層のみ" を表します。 その中にドット( . )は置けません。 したがってここまでで次のように修正する必要があります。  mySharedObject.data["isu"+i._x] = …    ↓変更↓  mySharedObject.data["isu"+i][_x] = … しかしこれは, 階層構造を持つ Flash(SWF) 内だけで通用する書き方です。 普通の変数は変数であって,階層など持ちません。 したがって次のように変更する必要があります。  mySharedObject.data["isu"+i][_x] = …    ↓変更↓  mySharedObject.data["isu"+i+"_x"] = … これで, mySharedObject.data 内には, isu1_x = ○○ isu2_x = ○○ isu3_x = ○○ isu4_x = ○○  …   … という変数とその各値が保存されます。 あと for文 で使用しているメインの i は,_root の変数 i です。 一方, for文 の( )内にある i<=mySharedObject.data.i; や i<=_root.MC_print.i; の右辺の i はそれぞれの階層の i です。 それぞれは独立した別のものなので混同しないように注意してください。

itosaka
質問者

お礼

>BlurFiltanさん おおー!できました!! ありがとうございます!! なるほど、書き方が全然違ってたんですね・・・。 が・・・またしても違う問題が・・・。 isuの位置は保存できるようになったのですが、 「読み込み」ボタンを押したときに <前回の数(i)分、複製>しようとしてもうまくいきません・・・。 //「読み込み」ボタンの命令文 function Move_Point() { //↓SharedObjectのi分だけ繰り返して複製・・・してるつもり for (i=1; i<=mySharedObject.data.i; i++) { _root.MC_print.isu.duplicateMovieClip("isu"+mySharedObject.data.i , i++); } //そしてそれを配置・・・ for (i=1; i<=mySharedObject.data.i; i++) { _root.MC_print["isu"+i]._x= mySharedObject.data["isu"+i+"_x"]; _root.MC_print["isu"+i]._y= mySharedObject.data["isu"+i+"_y"]; } } しかしながらこうしても当然?iの最後の数(たとえば4)の isu4だけが移動するだけでして・・・。 つまり私がやはり根本的に理解していない iの変数が原因なのだと思います。 あとそれを制御するfor文ですか・・・。 例えばtukueという別のアイテムを複製・配置した場合も isuも同じ_rootのiを参照しているからこうなるんですよね。 isuはisuのi変数を、tukueはtukueのi変数を持ち、 ボタンからの複製命令もそれぞれのi変数分命令する必要が あるとは思うのですが・・・。