配列演算子を使って変数を使いたい

このQ&Aのポイント
  • MAC OSX Flash8で、配列演算子を使って変数を使いたい場合、階層の中のmcのインスタンス名に変数を渡すことができません。
  • 具体的には、ランダムな変数を使用して複数のmcをランダムな位置に配置しようとしていますが、配列演算子の使い方をうまく理解できていないため、うまく動作しません。
  • 質問者は、sfl[1]とichi[1]を使用して、shuffle1の1にランダムな数字を入れたいと考えていますが、正しい方法がわかりません。
回答を見る
  • ベストアンサー

配列演算子を使って変数を使いたい

いつも、ありがとうございます。MAC OSX Flash8です。 ランダムで作った変数でムービークリップのタイムラインを使って複数のmcを複数の位置にランダムに配置しようとしています。 この時に、変数を使って階層の中のmcのインスタンス名にgo toを渡したいのですがうまくいきません。配列演算子の使い方がまだよくわかっていないためだと思います。スクリプトは以下のようです。 _root.shuffle.gotoAndStop(sfl[tim]) if (tim == 1) { _root.shuffle.shuffle+sfl[1].shiro+ichi[1].gotoAndStop(1) _root.shuffle.shuffle+sfl[1].shiro+ichi[2].gotoAndStop(nise[1]) _root.shuffle.shuffle+sfl[1].shiro+ichi[3].gotoAndStop(nise[2]) } 3種類のランダムで作った変数は、sfl[1] ichi[1] nise[1] です。 nise[1]はこのままで使えるようでした。たとえばshuffle1の1にsfl[1]をshiro1の1にichi[1]をあててランダムでできている数字を入れたいのですがどうしたらいいのでしょうか? よろしく、お願いします。

  • Flash
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
noname#35109
noname#35109
回答No.1

不明な点が少しありますが, スクリプトから想像するところ, Flash のムービークリップ階層構造は次の "ように?" なっていると思います。  _root    └ shuffle       ├ shuffle0       │  ├ shiro0       │  ├ shiro1       │  ├ shiro2       │  … 略 …       │       ├ shuffle1       │  ├ shiro0       │  ├ shiro1       │  ├ shiro2       │  … 略 …       │       ├ shuffle2       │  ├ shiro0       │  ├ shiro1       │  ├ shiro2       │  … 略 …       … 略 … そうした前提で考えると, if文内は次のようになると思います。 ------------------------------------------ if (tim == 1) { _root.shuffle["shuffle"+sfl[1]]["shiro"+ichi[1]].gotoAndStop(1); _root.shuffle["shuffle"+sfl[1]]["shiro"+ichi[2]].gotoAndStop(nise[1]); _root.shuffle["shuffle"+sfl[1]]["shiro"+ichi[3]].gotoAndStop(nise[2]); } ------------------------------------------ 配列アクセス演算子 [ ] で, 本当の配列にアクセスする部分(sfl[1] など)と, 配列にアクセスするのではなく, ムービークリップのインスタンス名にアクセスする部分 (["shuffle"+sfl[1]] など)の, 両方が必要です。 本当は上記の記述の方が良いのですが, あえて eval関数 を使って同じような内容を書くと次のようになります。 ------------------------------------------ if (tim == 1) { eval("_root.shuffle.shuffle"+sfl[1]+".shiro"+ichi[1]).gotoAndStop(1); eval("_root.shuffle.shuffle"+sfl[1]+".shiro"+ichi[2]).gotoAndStop(nise[1]); eval("_root.shuffle.shuffle"+sfl[1]+".shiro"+ichi[3]).gotoAndStop(nise[2]); } ------------------------------------------ 配列アクセス演算子で,ムービークリップなどのインスタンス名にアクセスする場合は, 1つの階層に対して,1つのアクセス演算子が必要になります。 一方, eval関数 を使った場合は, 複数の階層をまとめて,オブジェクトのインスタンス名として扱ってくれます。 したがって, eval関数の方がご質問で書かれていらっしゃるスクリプトに近いので, 参考までに書かせてもらいました。 (本当は eval関数 はあまり推奨されていないスクリプトなので使わない方が良いです。) 詳細は, お持ちのヘルプで,「配列アクセス演算子」や「eval」などと検索してみてください。 /////////////////////////////////////////////////////////////////////// ~ 補足 ~ 最初の冒頭に, 「不明な点が少しあります」 と書きましたが, そのうちの1つは, 「配列の要素番号は 0 番から始まることがわかっていらっしゃるのだろうか?」 という疑問と不安です。 配列の要素番号は 0 番から始まるので, すごく不自然な階層構造になりますが,  _root    └ shuffle       └ shuffle1          ├ × shiro0 (←これはなし)          ├ shiro1          ├ shiro2          └ shiro3 ↑こういうものを作って, -------------------------------------------- var tim = 1; var sfl = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; var ichi = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; var nise = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; if (tim == 1) { _root.shuffle["shuffle"+sfl[1]]["shiro"+ichi[1]].gotoAndStop(1); _root.shuffle["shuffle"+sfl[1]]["shiro"+ichi[2]].gotoAndStop(nise[1]); _root.shuffle["shuffle"+sfl[1]]["shiro"+ichi[3]].gotoAndStop(nise[2]); } -------------------------------------------- と書いた場合, 正常に動作しました。 いきなり ichi[1] とかから始まっていますが,大丈夫ですか? _root.shuffle["shuffle"+sfl[1]]["shiro"+ichi[1]].gotoAndStop(1); これで, sfl[1] は [0, 1, 2, 3,…] の 1 になるのですよ。 ichi[1] も [0, 1, 2, 3,…] の 1 になるのですよ。 「0 は何処へ行ったのでしょう??? なんだか1つずつずれてる気がするけど...」 という気分になりますが大丈夫ですか? 配列 Array http://www.1art.jp/flash/le/lesson34/lesson34.htm ご質問のスクリプトは単に例として書いただけで, この点が大丈夫であれば,それはそれでかまいません。 この点が不安になったので補足として書かせていただきました。  

Flash-love
質問者

お礼

さっそくのご回答、ありがとうございました。ばっちり思い通りになりました。昨夜、だいぶ悩んで、かなり近いところまでいっていたのですがエラーが消えないので、この方向で確信が持てないまま、お力をお借りすることになりました。 配列は0からですよね。階層的に見ると確かに気持ち悪いですね。 今回フレーム番号とインスタンス名を合わせたくて1から始めました。 この悩んだスクリプトの前に //シャッフルランダム sfl = new Array (); randomList = new Array (1, 2, 3); for (i = 1; i <= 3; i++) { pos = Math.floor (Math.random () * randomList.length); sflNum = randomList[pos]; sfl[i] = sflNum; randomList.splice (pos, 1); } trace ("sfl1="+sfl[1]); trace ("sfl2="+sfl[2]); trace ("sfl3="+sfl[3]); //シロの位置ランダム ichi = new Array (); randomList = new Array (1, 2, 3); for (i = 1; i <= 3; i++) { pos = Math.floor (Math.random () * randomList.length); ichiNum = randomList[pos]; ichi[i] = ichiNum; randomList.splice (pos, 1); } trace ("ichi1="+ichi[1]); trace ("ichi2="+ichi[2]); trace ("ichi3="+ichi[3]); //ニセモノランダム nise = new Array (); randomList = new Array (2, 3, 4, 5, 6, 7); for (i = 1; i <= 6; i++) { pos = Math.floor (Math.random () * randomList.length); niseNum = randomList[pos]; nise[i] = niseNum; randomList.splice (pos, 1); } trace ("nise1="+nise[1]); trace ("nise2="+nise[2]); trace ("nise3="+nise[3]); trace ("nise4="+nise[4]); trace ("nise5="+nise[5]); trace ("nise6="+nise[6]); というランダムが入っていました。 本当にいつもありがとうございます。感謝いたします。

関連するQ&A

  • すべてのMCを1フレーム目へ

    ステージ上にMCのインスタンスが100個あるとします。 ボタンのクリックで全部のMCを1フレーム目へ移動させたいと思っています。 _root.EVENT_btn.onRelease = function() { _root.A_mc.gotoAndStop(1); _root.B_mc.gotoAndStop(1); _root.C_mc.gotoAndStop(1); _root.D_mc.gotoAndStop(1); : : } とひとつずつ書くしかないのでしょうか? ほかに効率のよい書き方はありますか? (注)すべてのインスタンスの親は同一オブジェクトではありません。

    • ベストアンサー
    • Flash
  • 【ActionScript】ムービークリップ間の変数の受け渡しのやり方は?

    ムービークリップ間の変数の受け渡しがいまいちわかりません。 例えば、 ・_root.mc1 及び、 ・_root.mc1.mc2 というインスタンスがあった場合、 _root.mc1.mc2 のフレームに a = 100; と書き、 _root.mc1 のフレームに trace(_root.mc1.mc2.a); と書いても「undifined」と出るだけです。 (上層の値を下層で受けることはできるんですが、この例のように下層→上層の受け渡しはできないのです。) どうすればインスタンス間の変数の受け渡しができるのでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 階層をまたぐ命令について

    Flash CS4 as2.0です。 メインタイムラインの下にムービークリップmc1、flash1、flash2をつくり、mc1の下にさらに ムービークリップmc2を作りまして、メインタイムラインには、var hensu=0;という変数を設定しています。この場合のmc2に書いたスクリプトの動作についてですが、 on(release){ _root.flash1.gotoAndStop("aa"); ・・・(1) _root.flash2.gotoAndStop("bb"); ・・・(2) _root.hensu=1; ・・・(3)        } 上記の(1)と(2)は実行されますが、(3)については実行されません。 記述を(3)、(1)、(2)と変えても同じです。 孫階層から2代上の親階層(メインタイムライン)へのアクセスはできないのでしょうか。

  • 対象MCを変数で指定

    Flash CS3(AS 2.0)で作成しています。 _rootにscというインスタンス名のMCを設置、 その中にp1~p4というインスタンス名のMCを配置しています。 p1~p4を参照する際に変数を使用したいのですがうまくいきません。 _root.sc.p1 だと _level0.sc.p1 が返ってきますが、 insname = "sc.p1" _root[insname] とすると undefined が返ってきます。 きちんと値を取得するにはどのように記述するのが正しいのでしょうか。

    • ベストアンサー
    • Flash
  • movie clipのインスタンス名を変数にし文字列+数字を代入し.g

    movie clipのインスタンス名を変数にし文字列+数字を代入し.gotoAndStopを行ったが動作しない。 Flash 初心者です。 「なぞ」にはまり込んでしまいました。よろしくお願いします。 作っているのは、 丸いボタンをクリックすると、下にある白い札の色が変わるインタラクションです。 丸いボタンは2個あり、四角の札も2個あります。 クリックするボタンに対応した札が色が変わり、その札以外は白になります。 初め次のようなアクションスクリプトを書いて、うまく動かすことができました。 var onMapButton_num = 0; onEnterFrame = function () {      if (onMapButton_num == 0) { spotName1_mc.gotoAndStop("white"); spotName2_mc.gotoAndStop("white"); } else if (onMapButton_num == 1) { spotName1_mc.gotoAndStop("orange"); spotName2_mc.gotoAndStop("white"); } else if (onMapButton_num == 2) { spotName1_mc.gotoAndStop("white"); spotName2_mc.gotoAndStop("orange"); } }; onMapButton1_mc.onRelease = function() { onMapButton_num = 1; }; onMapButton2_mc.onRelease = function() { onMapButton_num = 2; }; ボタンを増やしたいので、記述を短するために次のように変えてみました。 (spotNameという変数を作りました) var onMapButton_num = 0; onEnterFrame = function () { var spotName = "spotName" + onMapButton_num + "_mc"; /* spotName */ if (onMapButton_num == 0) { spotName1_mc.gotoAndStop("white"); spotName2_mc.gotoAndStop("white"); } else if (onMapButton_num == 1) { spotName.gotoAndStop("orange"); /* spotName の使用*/ spotName2_mc.gotoAndStop("white"); } else if (onMapButton_num == 2) { spotName.gotoAndStop("white"); /* spotName の使用*/ spotName2_mc.gotoAndStop("orange"); } }; onMapButton1_mc.onRelease = function() { onMapButton_num = 1; }; onMapButton2_mc.onRelease = function() { onMapButton_num = 2; }; 結果、1つめのボタンをクリックしても、札の色が変わらなくなりました。 変数の使い方に問題があるのでしょうか? よろしくお願いします!

    • ベストアンサー
    • Flash
  • インスタンス名の指定に変数を使いたい

    ある一つのボタンオブジェクトで、マウスイベントによって別のムービーをコントロールしたいのですが、 同じボタンでも時々の状況によってコントロールする対象となるムービーが違うのです。 そこで、状況1では変数Aにムービー1のインスタンス名を、状況2では同じ変数Aにムービー2のインスタンス名を代入し、ボタンオブジェクトのスクリプトの中で変数Aの値をコントロール対象となるムービーのインスタンス名として使って、結果的に状況次第で操作対象を変える、ということは出来ないのでしょうか? traceアクションで見ていると変数の値は正しく変化しているのですが、ムービーのコントロールはまったくできず、困っております。 ボタンには、変数Aがnameだとすると、 on (rollOver) {   trace(name);   _root.name.gotoAndStop(2); という記述をしております。 解決策をご存知の方、どうかご回答よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • getURLへの変数が参照されない

    こんにちは。 FLASH ActionScript2の、getURLへの変数が参照されない件で困っています。 MC1をRollOverするとテキストフィールドareaにTarea1(あ)が入り、 更にMC1をクリックするとTurl1(a)のURLに飛ぶ、というスクリプトを作っています。 しかし現状ですと、RollOverはうまくいくのですが、クリックしたときのgetURLがうまくいきません。 変数「a.html」に飛ばず、「Turl1.html」に飛んでしまいます。 変数が参照されていないということなのでしょうか。 なにぶん初心者ですので、質問自体に誤りがあるかもしれませんが、ご教授頂けたらと思います。 よろしくお願いします。 ■スクリプト var Tarea0 = ""; var Tarea1 = "あ"; var Tarea2 = "い"; var Tarea3 = "う"; . . var Tarea42 = "ゆ"; var Tarea43 = "よ"; var Tarea44 = "ら"; var Turl1 = "a"; var Turl2 = "i"; var Turl3 = "u"; . . var Turl42 = "yu"; var Turl43 = "yo"; var Turl44 = "ra"; i = 0; sx = 0; for (x=0; x<45; x++) { str = "mc"+String(i); _root["mc"+i].Tarea = "Tarea"+i; _root["mc"+i].onRollOver = function() { area.variable = this.Tarea; }; _root["mc"+i].onRollOut = function() { area.variable = "Tarea0"; }; _root["mc"+i].Turl = "Turl"+i + ".html"; _root["mc"+i].onRelease = function() { getURL(this.Turl); }; i++; } ■環境 WINDOWS XP FLASH8 ActionScript2.0

    • ベストアンサー
    • Flash
  • 外部テキストが複数のインスタンスに読み込まれない?

    質問させてください。 ボタンをクリックしたときに指定されたフレームへ飛び、MCが動き、 そのMC内で外部テキストを読みこみ、 それぞれ設置した2つのダイナミックテキストへ文を読み込ませるという構想になっております。 (以下階層です) シーン1 b(mc)フレーム1        L・背景 フレーム1          ・ダミーボタン1フレーム1 ASレイヤーに this.stop();          ・ダミーボタン2フレーム1 ASレイヤーに this.stop();          ・パネル/a(mc) フレーム2 (AS) ダミーボタン1 インスタンス名btn1 on (release) { _root.b.gotoAndStop(2); _root.b.a.t1.htmlText = _root.b.a.text1; _root.b.a.m1.htmlText = _root.b.a.text1_a; } ダミーボタン2 インスタンス名btn2 on(release){ _root.b.gotoAndStop(2); _root.b.a.t1.htmlText = _root.b.a.text2; _root.b.a.m1.htmlText = _root.b.a.text2_a; } パネル、a(mc)部分に onClipEvent (load) { System.useCodepage = true; this.loadVariables("sample.txt"); trace("loading"); } onClipEvent (data) { trace("完了"); } パネル内 ダイナミックテキスト(インスタンス名:t1 フレーム5 ダイナミックテキスト(インスタンス名:m1 フレーム5 (AS) 5フレーム目にthis.stop(); 外部テキスト内 sample.txt 文はファイルと同じところにあります。 &text1=</u>AAA</u>& (あえて今は全角にしてあります) &text1_a=</u>aaa</u>& &text2=</u>BBB</u>& &text2_a=</u>bbb</u>& ------------------------------------- 出来ているのはb(mc)内ダミーボタンを押すとフレーム2に飛び、 フレーム2に配置されているパネルa(mc)の中のダイナミックテキストのあるフレーム5で止まる、というところまでです。 困っているのは b(mc)内、フレーム2のa(mc)部分でtraceするとloadingは出ているので読み込まれてはいると思うのです。 しかしムービープレビューすると文のほうは何も表示されずでして…パスがあってないのでしょうか…。 パネル内のダイナミックテキストに表示させるに当たりどこが違うか、 長々と恐縮ですがご教授願います。 環境はWinXP、Flash8 proです。

    • ベストアンサー
    • Flash
  • MC間でMCをやり取りできますか?

    質問は初めてですがよろしくお願いします。 深度入れ替えの関係で(簡略化のため)、MCを似たような深度ずつに親MCにまとめる構造で作成してきました。 しかし、このやり方では、当初予定していた深度の移動はできますが、予定外の深度の移動が、不可能になりました。 やりたいこと _root.a.mc のような構造の中のmcというムービークリップを、 _root.b.mc の階層に移動したいのです。mcの持つ変数等も一緒に移動できるのが好ましいです。 不可能であれば、 attachMovie()、removeMovieClip()あたりを使って負荷のかかりそうなやり方で我慢しようとは思っています。 ParaFla!使用・SWF8:FLASH8相当の設定で製作中

    • ベストアンサー
    • Flash
  • 取得した変数の階層について

    どうしても解らないのでご質問させてください。 Flashで、親MC内の複数の子MCのインスタンス名から数字を取得し (product1~product9)それぞれのマウスアクションを まとめて親MC内のフレームに記述しました。 試行錯誤の末、 for (i=1; i<10; i++) { this["product"+i].Para = i; this["product"+i].onRollOver = function() { trace(this.Para); this._parent["product"+this.Para].onEnterFrame = function() { this._parent["product"+this.Para]._alpha -=this._parent["product"+this.Para]._alpha/2; }; }; } で、上手く動くようになったのですが、this.Paraを代入すると this["product"+this.Para]では動かなかったのです。 階層がthis._parentじゃないと動かないのが、謎です。 ちなみに全部ルート上において、階層を_rootのみで指定すると上手く行きました。 なぜ、親MC内だとthis._parentという指定になるのか、 知りたいです。 このままだと肝心な事が解っていないまま、なんとなくできてしまった感じなので…どうぞよろしくお願いいたします。

    • ベストアンサー
    • Flash

専門家に質問してみよう