• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:配列演算子を使って変数を使いたい)

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

このQ&Aのポイント
  • MAC OSX Flash8で、配列演算子を使って変数を使いたい場合、階層の中のmcのインスタンス名に変数を渡すことができません。
  • 具体的には、ランダムな変数を使用して複数のmcをランダムな位置に配置しようとしていますが、配列演算子の使い方をうまく理解できていないため、うまく動作しません。
  • 質問者は、sfl[1]とichi[1]を使用して、shuffle1の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