• ベストアンサー

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となるため、文法としては正しくありません。  コードをスマートに記述できる方法をご存じの方がおられれば、ご教示ください。

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

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

  • ベストアンサー
  • perse
  • ベストアンサー率74% (113/152)
回答No.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 の値を取得してやればいいと思います。

Tank2005
質問者

お礼

tellTarget内はすべて指定したターゲット内の変数が取得されるということですね。tellTargetの「クセ」がよくわかりました。ありがとうございます。

その他の回答 (1)

noname#35109
noname#35109
回答No.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 でのパブリッシュの設定にして, 携帯デバイスを選択してみたら,ちゃんと変数は受け渡されました。 参考になるかどうかはわかりませんが, 一応,書かれているスクリプトよりは短くなって,実際に使えるスクリプトだと思います。 実際に使えることと,文法上正しいことは別なので,良いスクリプトかどうかはわかりません。 ご了承ください。

Tank2005
質問者

お礼

Flash 4スクリプトでは短い行内で関数と変数を同時に処理するのは難しいようですね。参考になりました。

関連するQ&A

  • FLASH LITE1.1 任意に問題を表示

    40問の問題をランダムに表示させようとしていますがうまくいきません。 MCにq1~q40のラベルをつくり、ランダム関数で任意に表示させようとしています。 具体的には次の関数を書きました。 //m1~m40に順に1~40を代入 for(i=1;i<=40;i++){set("m" add i,i);} //m1~m40の値をシャッフル for(i=0;i<100;i++){ r1=random(40)+1; r2=random(40)+1; tV=eval("m" add r1); set("m" add r1,eval("m" add r2)); set("m" add r2,tV); } //ムービークリップqtの中の任意のラベル(q1~q40)を再生 tellTarget("/qt"){gotoAndPlay("q" add m1);} ("q" add m1)のところを例えば("q5")などと、具体的なラベル名を入れると動くので、 変数のどこかの取り扱いに間違いがあると思うのですが、どこがおかしいのかわかりません。 おわかりの方がいたら是非、ご教授願いたく思います。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • ムービークリップのインスタンス名を変数で扱う

    Flash初心者で、レベルの低い質問だとは思いますが申し訳ありません。単純なシンタックスに関する質問です。 Panel.Panel0Cont ~ Panel.Panel10Cont という11個のムービークリップがあります。 それぞれのムービークリップを一挙に指定のフレームへgotoAndPlayさせる際に、ムービークリップの名前を変数で代入してforループで回したいのですが、変数への代入の仕方が解りません。例えば、 for (i=0; i>10; i++) { var mc:MovieClip = "Panel.Panel"+i+"Cont"; mc.gotoAndPlay(JumpNum); } mcはムービークリップですから、単純な文字列を代入しても当然タイプエラーになってしまいます。ムービークリップのインスタンス名のプロパティに、文字列を変数を使って代入するやり方があるのだと思います。 そのやり方をご教示頂けませんか。 ※参考書を2冊ひっくりかえしてもにわかには見つかりませんでした。

    • ベストアンサー
    • Flash
  • ムービークリップ再生順序 制御について

    はじめて質問します。Flash初心者ゆえつたない説明ですいませんが、よろしくお願いします! Flash:ActionScript2.0 [現状] メインフレームにABCというムービークリップを配置しています。 それぞれ「mc1」「mc2」「mc3」というインスタンス名がついています。 各ムービークリップにはそれぞれ動きが設定しており、”moving”というフレームラベルをつけています。 [どう動作してほしいか] まずAのムービークリップが再生。Aのムービークリップ再生終了。 ↓ Bのムービークリップ再生開始。Bのムービークリップ再生終了。 ↓ Cのムービークリップ再生開始。Cのムービークリップ再生終了。 ↓ Aに戻る。 上記の動きをタイムラインを利用するのではなく、メインフレームに1つactionScriptを書くことで動作させるにはどうしたらいいでしょうか? ちなみに今は以下のように記述しており、実行すると3つのムービークリップが全て同時に動いてしまいます。 var list:Array = new Array(); for(var i=1; i < 4; i++) { var mcname = "mc" + i ; list[i] = eval(mcname); list[i].gotoAndPlay("moving"); } よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • Flash Lite1.1 について

    お世話になっています。 携帯用のアプリ開発をができる Flash Lite1.1 を扱い始めて、1週間になります。どうしても分からないことがでてきたので、こちらで質問をさせていただきます。 現在、任意の複数のswfファイルを自由に作成と削除を行える携帯アプリを考えています。機能としましては、番号キーで指定した処理を行いたいMovieClipに対して、ファイルのロードか削除を行うというものです。 以下は、読み込み・削除部分のスクリプトです。 // *bボタンで読み込みを行う on( keyPress "*") { // 作成するのMovieClipを指定 newName = "cscr" add no; // MovieClipの複製 // 深度は全て同じ位置 duplicateMovieClip("scr", newName, 0 ); // MovieClipのロード url = "Load" add no add ".swf"; loadMovie ( url, newName ); } // #ボタンで削除 on( keyPress "#") { // アクセスするMovieClip名 newName = "cscr" add no; unloadMovie( newName ); } no : 作成するmovieClip番号・ロードするswfファイルの番号 scr : ムービーファイル表示用MovieClip( あらかじめめ画面に配置してあります ) 私が分からないところは、表示するMovieClipの切り替えです。 作成する分に関しては、作ったMovieClipが表示されていくのですが、以前に作成したムービークリップを表示のさせ方が分かりません。Load0.swf、Load1.swf、Load2.swfをロードした場合、cscr0、cscr1、cscr2が作成され、cscr2が表示されている時に cscr0 の内容に切り替えたいと思います。 私が行った方法は、tellTarget を使い、表示するMovieClip以外は、プロパティの_visible 非表示に設定したり、座標を画面外に移動させる方法を試しましたが、思った通りに動作をしませんでした。 どうやって、表示をさせたらよろしいでしょうか? また、削除するスクリプトに関してですが、本当に削除されているのでしょうか?

    • ベストアンサー
    • Flash
  • Flash Lite1.1について

    Flashで携帯ゲームのブロック崩しを作りたくて、あるサイトからflaサンプルを見つけました。 製作者のコメントに「ブロックを全部崩しても何も起きませんので、エンディング等は自作してください。 」とあったので、早速4フレーム目にゲームオーバー画面を5フレーム目にクリア画面を作ってみました。 そして元々のソースから if(ball._y>235){ gotoAndPlay(1); } を if(ball._y>235){ gotoAndPlay(3); } にしたまではよかったのですが、 ブロックが全て無くなったらクリア画面に移動させる方法が分からず困っています。 元々のソースは↓になります。 // ボール移動 ball._x += vx; ball._y += vy; // 壁とボールの当たり判定 if(ball._x<5 && vx<0){ vx = -vx; } if(ball._x>235 && vx>0){ vx = -vx; } if(ball._y<5 && vy<0){ vy = -vy; } //ボールが下に落ちたらゲームオーバー if(ball._y>235){ gotoAndPlay(1); } // パドルとの当たり判定 if(ball._x>pad._x-40-5 && ball._x<pad._x+40+5 && ball._y>pad._y-5-5 && ball._y<pad._y+5+5 && vy>0){ vy = -vy; vx = (ball._x-pad._x)/80*15; } // ブロックとの当たり判定 for(i=1;i<=40;i++){ bx = eval("block" add i)._x; by = eval("block" add i)._y; if(ball._x>bx-20-5 && ball._x<bx+20+5 && ball._y>by-5-5 && ball._y<by+5+5 && eval("block" add i)._visible==true){ eval("block" add i)._visible = false; //左端or右端に当たった場合 if(ball._x<bx-20 || ball._x>bx+20){ vx = -vx; }else{ //上端or下端に当たった場合 vy = -vy; } } } どの場所にどのように書くべきかいろいろ探してみたのですが、パソコン用の作り方しか見つからす゜携帯用のFlash Lite1.1には対応していない物ばかりで困っています。 ActionScriptについては初心者であまり詳しくなく、本当に恥ずかしい限りです。 どうかお解かりになる方おりましたらお力をお貸し下さい。 宜しくお願い致します。

    • ベストアンサー
    • Flash
  • flash lite1.1 変数を受け取って表示

    今flash lite1.1を使いPHPと連携させる作業を行っています。 その中で、変数を受け取ってflash上のダイナミックテキストでその変数の言葉を表示させるといったことがうまく出来ない状態です。 今試したことは、下記の方法でPHPからflashのダイナミックテキストを変数を指定して変更する方法です。1フレーム目にダイナミックテキストを配置し、そこに変数を記入するとうまくいくのですが、1フレーム目に配置してある、ムービークリップの中にある5フレーム目のダイナミックテキストに同じ変数を書いてもうまくいきません。 そこで、1フレーム目のダイナミックテキストがうけとった、内容を他の階層のダイナミックテキストで表示させることは可能でしょうか? loadVariablesNum等いろいろと試したのですが、うまくいきません>< わかる方がみえましたら、ぜひお願いします。 flash lite1.1とPHPの良い連携の仕方が他にあればそちらも教えていただけますと、助かります。よろしくお願いします。 http://libpanda.s18.xrea.com/commentary.txt

  • Flash Lite1.1におけるパスの表記?について教えてください。

    先日、こちらである方から、Flash Lite1.1では、Flash4以前のように、階層などの概念がないということを教えて頂きました。他のムービークリップを制御する際はtellTargetで指定するらしいのですが、次の実験でどうにも上手くゆきません。 1、新規シンボル(MC)で、4コマ漫画を作成。1コマ目にstop();を設定する。インスタンス名をcounterとし、ステージ(背景)にこれを設置。 2、新規シンボル(ボタン)で、次のスクリプトを記述。 on (release, keyPress "1") { tellTarget ("counter") { nextFrame(); } } 携帯電話のボタン1を押すことによって、4コマ漫画が進む…予定だったのですが、以下の変(文字化け?)なエラーメッセージが…。 ƒ^[ƒQƒbƒg‚&ordf;Œ&copy;‚‚&copy;‚&egrave;‚܂&sup1;‚&ntilde;: ƒ^[ƒQƒbƒg="count" ƒx[ƒX="_level0" パス表記が間違っているのかと思い、 _parent.counterや、/counter、_level0.counterなど色々試してみましたが、やはり先ほどのエラーログが出ます。何か根本的に間違っているのでしょうか。 きちんと、4コマ漫画をコマ送りさせるボタンにするには、どのように表記すればよいのでしょうか。 お詳しい方、ご回答いただけると幸いです。

    • ベストアンサー
    • Flash
  • Flash lite 1.1で、指定範囲内をランダムに動き回る待ち受け

    Flash lite 1.1で、指定範囲内をランダムに動き回る待ち受け画面を作成したいです。 動作イメージは以下の様な感じなのですが・・・ ・ステージサイズは『240×320』 ・ムービークリップを動かしたい範囲は上下中央の『220×220』 ・220×220の範囲内を、  雲の形のムービークリップがフワフワ浮かびながらランダムに移動する ・雲は、220×220の範囲からはみ出ない for文を使用し、 指定した数値内を移動させるという形になるのかなぁ・・・と思うのですが、 スクリプトの記述方法が分からず、途方に暮れております・・・。 知識のある方がいらっしゃいましたら、お力添え頂けますと大変嬉しいです。 宜しくお願い致します。

    • ベストアンサー
    • Flash
  • ムービークリップ名の取得方法

    ムービークリップ名を取得したいです。 thisで取得すると、例えば『_level0.foo.var』が取れますが、最後の『var』だけを取得したいです。 this.substring(11)などとしても取れませんでした。 そこで、実は、duplicateMovieClip(mc,sindo);されたムービークリップで取得できればよいので、親側でduplicateMovieClip(mc,sindo);した直後にeval(mc).id=mc;として、子側でthis.idとして取得する方法としました。 これで今のところ上手く取得できていますが、親側で、eval(mc).id=mc;する前に子側でthis.idを取得するような微妙なタイミングがあるとしたら、不確実になってしまうような気がします。 #オーサリングツールはParaFla!、Actionscrptは1.0相当を使用です。

    • ベストアンサー
    • Flash
  • Flash Lite1.1でActionScriptを使用してのフェードイン・フェードアウトについて

    こんにちは。 ActionScript初心者です。Flash Lite1.1でActionScriptを使用してのフェードイン・フェードアウトについて教えて下さい。 FlashLiteではonClipEventが使えないそうだったので ムービークリップ内の1フレーム目に _alpha=0; 2フレーム以降毎に _alpha+=10; と記述すればフェードイン出来ましたが、もっとスマートにやる方法があれば教えていただけますでしょうか。 以上よろしくお願いいたします。

    • ベストアンサー
    • Flash