- ベストアンサー
Flash Liteのムービークリップ間の変数のやりとりについて
現在、特定のムービークリップに格納されている、2つのムービークリップ間で変数(dropのbtypeとcursorのtype間)をやりとりするプログラムを組んでいるのですが、まだ、Flash Liteの技術が未熟なため、 for(i = 0; i < 2; i++){ tellTarget("drop" add i){ ../:n = btype; } tellTarget("cursor" add i){ type = ../:n; } } と、少々回りくどい記述をしてしまいます。 個人的には tellTarget("cursor" add i){ type = eval("../drop" add i add ":btype"); } のように簡潔に記述できたらよいと思っているのですが、上記の方法では、typeはundefinedとなるため、文法としては正しくありません。 コードをスマートに記述できる方法をご存じの方がおられれば、ご教示ください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
配置は _root.drop1.btype _root.cursor1.type という階層ですよね? (以降、説明のときは分かりやすいようにPC用Flashのパス表現で書いてます) _root上に tellTarget ("cursor" add 1) { trace(eval("../drop" add 1 add ":btype")); } と書くと_root.drop1.btypeの値を得ることができました。 しかし「1」の部分をiに変えるとundefinedが返ってきました。(ちゃんとFor文書きました) おそらくtellTarget(){ }のなかに書いた i は 「"cursor" add i」というMCの中のiを指しているからだと思います (i=1のときだと_root.cursor1.iの値を指しておりもちろんundefined)。 つまりパスが通っていないのでundefinedが返ってくるのでしょう。 なので、 for (i=0; i<=1; i++) { tellTarget ("cursor" add i) { x = eval("..:i"); type = eval("../drop" add x add ":btype"); } } のように_root上の i の値を取得してやればいいと思います。
その他の回答 (1)
Flash Lite は ほとんどわからない者です。 でも,Flash 4 なら結構わかっているつもりの者です。 書かれているスクリプトを Flash 4 で書くとこうなります。 Set Variable:"i" =0 Loop While (i < 2) Begin Tell Target ("drop" & i) Set Variable:"../:n" =btype End Tell Target Begin Tell Target ("cursor" & i) Set Variable:"type" =../:n End Tell Target Set Variable:"i" =i + 1 End Loop for文はまだ存在してなかったので,先に i という変数の初期値を設定しておいて, Loop文でループさせるのです。 以上は,書いてみただけでどうでも良いことです。 質問者さまは,すんごく,よく考えられたと思います。 いったん, _root の架空の変数 n に逃がしておいて, _root.n を cursor0 と cursor1 の変数 type に代入するのですよね。 すごい方法だと感動しました。 でも,いちいち,Tell Target しなくても良いのです。 Tell Target をするから,_root.n を経由しなければならなくなります。 Flash 4 で, _root.n を経由せず,変数だけをやりとりする場合は次のようになります。 Set Variable:"i" =0 Loop While (i < 2) Set Variable:"cursor" & i & "/:type" =Eval("drop" & i & "/:btype") Set Variable:"i" =i + 1 End Loop 私がわかるのは,ここまでです。 後は,ソフトに成り行きを任せました。 上記,Flash 4 の FLA ファイルを Flash 8 で開くと自動変換されて, 上記スクリプトが次のようになりました。 i = 0; while (Number(i)<2) { set("cursor" add i add "/:type", eval("drop" add i add "/:btype")); i = Number(i)+1; } これを,for文を使って書きかえると,次のようになります。 for (i = 0; i < 2; i++) { set("cursor" add i add "/:type", eval("drop" add i add "/:btype")); } これが,良い形かどうかは,Flash Lite の専門ではないのでよくわかりません。 でも,Flash 8 で,Flash Lite 1.1 でのパブリッシュの設定にして, 携帯デバイスを選択してみたら,ちゃんと変数は受け渡されました。 参考になるかどうかはわかりませんが, 一応,書かれているスクリプトよりは短くなって,実際に使えるスクリプトだと思います。 実際に使えることと,文法上正しいことは別なので,良いスクリプトかどうかはわかりません。 ご了承ください。
お礼
Flash 4スクリプトでは短い行内で関数と変数を同時に処理するのは難しいようですね。参考になりました。
お礼
tellTarget内はすべて指定したターゲット内の変数が取得されるということですね。tellTargetの「クセ」がよくわかりました。ありがとうございます。