AS3.0で二次元配列を使用してムービークリップを作成できない

このQ&Aのポイント
  • 二次元配列を使用してムービークリップを作成する際にエラーが発生してしまう。
  • 一次元配列では問題なく表示されるが、二次元配列にするとエラーが出る。
  • エラーメッセージによると、条件が未定義でありプロパティが存在しないという。
回答を見る
  • ベストアンサー

AS3.0 二次元配列でムービークリップが出来ない

Actionscript3.0 超初心者です。 二度目の質問です。  40x80のマス目をエクセルマクロが使えない人のためにFlashで表示させようとしています。 ライブラリーのMC mark_mcを二次元配列で並べようとしていますが、うまく行きません。 試しに一次元配列だと下記のコードでエラーが出なくうまく表示されます。 var mc_array:Array = new Array(); mc_array[3]=new mark_mc(); addChild(mc_array[3]); mc_array[3].scaleX = 0.5; mc_array[3].scaleY = 0.5; mc_array[3].x = 300; mc_array[3].y = 200; 二次元にして var mc_array:Array = new Array(); mc_array[3][2]=new mark_mc(); addChild(mc_array[3][2]); mc_array[3][2].scaleX = 0.5; mc_array[3][2].scaleY = 0.5; mc_array[3][2].x = 300; mc_array[3][2].y = 200; こうすると、TypeError: 「Error #1010: 条件は未定義であり、プロパティがありません。」が出てしまいます。 [3][2]の部分はfor文でデータをマス目に作ろうとしています。 基本的に間違っているのでしょうか?

  • Amole
  • お礼率66% (2/3)
  • Flash
  • 回答数2
  • ありがとう数4

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

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

結論から書けば 単純に二次元目を配列定義していないからですね。 (一次元目の要素を配列定義していないからです。) 次のようにすれば良いでしょう。 var mc_array:Array = new Array(); //↓※ mc_array[3] を配列とする mc_array[3] = new Array(); mc_array[3][2]=new mark_mc(); addChild(mc_array[3][2]); mc_array[3][2].scaleX = 0.5; mc_array[3][2].scaleY = 0.5; mc_array[3][2].x = 300; mc_array[3][2].y = 200;  ↑または↓ var mc_array:Array = new Array(); mc_array[3]=[ , , new mark_mc()]; addChild(mc_array[3][2]); mc_array[3][2].scaleX = 0.5; mc_array[3][2].scaleY = 0.5; mc_array[3][2].x = 300; mc_array[3][2].y = 200; 2つ目の書き方のバリエーションは 場合に応じて無数にあります。   ===解説(無視しても良い雑談混じりの話)====== 驚かれることかもしれませんが そもそも ActionScript には (その他 JavaScript など ECMAScript や C++ や Java などにも) 正確(狭義)な意味での 二次元配列(多次元配列) など存在しないのです。 次元的に言えば一次元の配列までしか存在しません。 mc_array[3][2] みたいなのを 広義な意味合いで, 普通に 二次元配列(多次元配列) という言い方はしますし それで間違いではないです。 しかし厳密に言うなら それは 二段階配列(多段階配列/ジャグ配列) なのです。 ActionScript や Java などなどの配列には そもそも一次元配列しかありませんが 配列の要素としてさらに配列を入れることができるため (一次元配列はいくらでも入れ子にできるため), その 多段階配列 をもって 多次元配列 として使っているだけです。 身近な逆例として MS Excel の VBA などには 多次元配列 が存在します。 (VBA には 多段階配列 も存在します。) 例えば Excel VBA で 配列名 = Cells(開始行,開始列).Resize(最終行,最終列).Value のようなコードを書けば 自動的に二次元配列ができます。 仮に SheetArray = Cells(1, 1).Resize(5, 5).Value のようなコードを書いたとするなら MsgBox SheetArr(3, 2) でも MsgBox Cells(3, 2).Value でも同じ「B3」セルの値が表示されます。 ※ SheetArr(3, 2) です SheetArr(3)(2) ではありません ※ SheetArr(3, 2)←多次元,SheetArr(3)(2)←多段階 一方 ActionScript では var mc_array:Array = new Array(); のようなコードを書いたとしても 一次元配列しかできないため いきなり mc_array[3][2] などとアクセスされても 「そんなもの未定義だよ!」 というエラーになってしまうのです。 もっとも ActionScript などの場合は new Array() などと一々書かなくても ○○ = [] で自動的に 配列○○ ができるため 二次元目(狭義での二段階目)に new Array() を書かない場合も出てきます。 ◎ 二次元目(二段階目)に new Array() を書かない一般例↓ 【例1】 var my_arr:Array = new Array(); my_arr.push(["00","01","02","03","04"]); my_arr.push(["10","11","12","13","14"]); my_arr.push(["20","21","22","23","24"]); my_arr.push(["30","31","32","33","34"]); trace(my_arr[3][2]); //→「32」が出力される 【例2】 var my_arr:Array = new Array(); for (var i:int = 0; i<=3; i++) { my_arr[i] = [i + "0", i + "1", i + "2", i + "3"]; } trace(my_arr[3][2]); //→「32」が出力される 【例3】(こんな書き方もできます) var my_arr:Array = [[],[],[],[]]; for (var i:int = 0; i<=my_arr.length-1; i++) { for (var j:int = 0; j<=3; j++) { my_arr[i][j] = String(i) + j; } } trace(my_arr[3][2]); //→「32」が出力される 上の【例1~3】は, どれも一見 my_arr[0] = new Array(); my_arr[1] = new Array(); my_arr[2] = new Array(); my_arr[3] = new Array(); と書いていないように見えますが 書いていないように見えるだけで 実は書いているのと同じことなのです。 細かいことを書きましたが ActionScript などで 二次元配列(多次元配列) という言葉を使うことは間違いではありません。 すごいプロの方でも普通に 二次元配列(多次元配列) という言葉を使用しています。 ですから言い方に気を付ける必要はありません。 ただ 多次元的(多段階的)な配列を作るのでしたら 配列の中に配列を定義(作成)しなければ 多次元的な配列はできないということです。 (理由:ActionScript には本当の意味での多次元配列は存在しないため一発では定義できないから) (var my_arr = new Array(2); ←これでは要素数2の配列ができるだけ)

Amole
質問者

お礼

BlurFiltanさん、度々詳細なご開設ありがとうございます。 目から鱗のスクリプトで想像がつきませんでした。 度々ありがとうございます。 色々無茶な事をしている内に一つ発見した事があります。 var mc_array:Array = new Array(); mc_array[3][2]=new mark_mc(); addChild(mc_array[3][2]); mc_array[3][2].scaleX = 0.5; mc_array[3][2].scaleY = 0.5; mc_array[3][2].x = 300; mc_array[3][2].y = 200; これだとエラーが出るのですが、二重カギ括弧にすると、何故かエラーが出ません。 理由はよく分かりません。 var mc_array:Array = new Array(); mc_array[[3][2]]=new mark_mc(); addChild(mc_array[[3][2]]); mc_array[[3][2]].scaleX = 0.5; mc_array[[3][2]].scaleY = 0.5; mc_array[[3][2]].x = 300; mc_array[[3][2]].y = 200; これだと、エラーがでませんでした。 [[3][2]]外側の括弧で定義されたという事なのか??? この二重カギ括弧は、値を設定する時に有効で、参照するだけなら必要ないみたいです。(検証はあいまい) EXCELのBVAを例にご説明されている部分は、大変理解しやすく助かります。 行列と指定しても、最初から何番目としても記憶しているものからの引き出し方と言う構造と、見えてきました。 壁に当たった部分だけ小手先で何となく分かっているようで、全体の大系が全然理解できていないと反省しております。  この、部分が今回の心臓部なので大きく解決に向かいそうです。 度々ありがとうございました。                         感謝!

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

ActionScript使ったことないけど、2次元配列を作るにはいったんArrayをnewしてから必要な要素数のnew Arrayを追加する必要があると思います。 http://www.google.co.jp/search?hl=ja&q=ActionScript+2%E6%AC%A1%E5%85%83%E9%85%8D%E5%88%97&lr=lang_ja

関連するQ&A

  • AS3.0 ループを利用したムービークリップ生成

    お世話になります。 ソフトはFlashCS3を使用しています。Actionscript3.0で書き出そうと思っています。Actionscript3.0初心者ですがよろしくお願いします。 ライブラリーに Mc01,Mc02,Mc03,Mc04とクラスを指定したムービークリップを準備した状態でステージにムービークリップを生成しようと考えています。その際、for文を使って短く書きたいと思っています。 for (var i=0; i>4; i++){ var "Mc0"+i:"Mc0"+i = new "Mc0"+i(); "Mc0"+i.x = 10*i; "Mc0"+i.y = 10*i; this.addChild("Mc0"+1); } 上記のように書くと「1086:シンタックスエラー:identifierがMcの前に必要です。」とエラーが出てうまく作動しません。 参考までに現在は以下のようにすべて書き出しています。 //ムービクリップ01 var Mc01:Mc01 = new Mc01(); Mc01.x = 0; Mc01.y = 0; this.addChild(Mc01); //ムービクリップ02 var Mc02:Mc02 = new Mc02(); Mc02.x = 10; Mc02.y = 10; this.addChild(Mc02); …… 以下省略 特にfor文にこだわっててはいません。ループで生成できればOKです。 どなたかわかる方よろしくお願いします。

    • ベストアンサー
    • Flash
  • 配列に入れたムービークリップのマウスイベントについて

    こんにちは。 actionscript3.0にて制作をしております。 FLASH CS4上にテキストフィールドが入ったムービークリップが予め作成してあり、 それを「box_mc」という名前でライブラリに登録しております。 box_mcを配列に格納し、それぞれにマウスイベントで横に10移動する処理を割り当てたく 下記の様な文法で作成しましたが、ランタイムエラー「#1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。」とエラーが表示されてしまいます。 それぞれの配列に正しくマウスイベントを割り当てるにはどうしたら良いでしょうか? var boxArray:Array = new Array(); for (var i:int = 0; i < 3; i++) { boxArray[i] = new box_mc(); // ボックス // マウスオーバーイベント boxArray[i].addEventListener(MouseEvent.MOUSE_OVER, function (event:MouseEvent):void { boxArray[i].x = 10; }); } お手数では御座いますが、ご教授いただけると幸いです。 宜しくお願い申し上げます。

    • ベストアンサー
    • Flash
  • addChildで描画した絵(シンボル:ムービークリップ)を消したい。

    addChildで描画した絵(シンボル:ムービークリップ)を消したい。 お世話になります。 adobe Flash pro ActionScript 3.0 で作成しております。 左クリックを押したら、 var mc:pen=new pen; addChild(mc); mc.x=mouseX; mc.y=mouseY; でpenというムービークリップを表示させるようにしております。 そこで、作成したmcを消す方法はどのようにしたらよいでしょうか? (1)直前に書いたmcを削除する方法 (2)今までに書いた全てのmcを削除する で教えて頂ければと思いますのでよろしくお願いします。

    • ベストアンサー
    • Flash
  • 多次元配列は配列の配列である

    Java勉強中なんですが、参考書を読んでいて「多次元配列は、実際には配列の配列である。つまり、2次元配列(array[][])がある場合、実際にはこれをarray[0]、array[1]、array[2]、といった1次元配列に配列として扱う事ができる。」と書いてあり、例題で、 double array[][] = new double[5][]; array[0] = new double[500]; array[0] = new double[400]; array[0] = new double[300]; array[0] = new double[200]; array[0] = new double[100]; と書いてありました。これについてのこれ以上の説明はなく、理解できなくて困っています。ご教授宜しくお願いいたします。

    • ベストアンサー
    • Java
  • AS3.0でムービークリップ制御

    現在、AS3.0でswfファイルを読み込み、その再生・停止をコントロールするswfを作ろうとしています。 そこで自分なりにプログラム書いてみたのですが、停止ができなくて困っています。 以下ソース package { import flash.display.*; import flash.events.*; import flash.net.URLRequest; public class Test extends Sprite { private var mc:MovieClip = new MovieClip(); private var btn_load:SimpleButton = new SimpleButton(); //loadボタン private var btn_stop:SimpleButton = new SimpleButton(); //stopボタン private var l:Loader = new Loader(); public function Test() { mc.x = 30; mc.y = 30; btn_load.upState = this.drawCircle( 0x228822, 20 ); btn_load.overState = this.drawCircle( 0x225522, 21 ); btn_load.downState = this.drawCircle( 0x553355, 20 ); btn_load.hitTestState = btn_load.upState; btn_load.addEventListener( MouseEvent.CLICK, Load ); btn_stop.upState = this.drawCircle( 0x228822, 20 ); btn_stop.overState = this.drawCircle( 0x225522, 21 ); btn_stop.downState = this.drawCircle( 0x553355, 20 ); btn_stop.hitTestState = btn_stop.upState; btn_stop.x = 50; btn_stop.addEventListener(MouseEvent.CLICK, Stop); addChild(mc); addChild(btn_load); addChild(btn_stop); mc.addChild(l); } private function drawCircle( color:uint, r:Number ):Shape { var circle:Shape = new Shape(); circle.graphics.lineStyle( 1, 0x222222 ); circle.graphics.beginFill( color ); circle.graphics.drawCircle( 0, 0, r ); circle.graphics.endFill(); return circle; } private function Load(e:Event):void{ l.load(new URLRequest("animation.swf")); } private function Stop(e:Event):void{ mc.stop(); } } } なにが原因なのでしょうか・・・ わかる方ご回答お願いします。。

    • ベストアンサー
    • Flash
  • AS3の拡大と縮小について

    下記の外部ASで試しているのですが比率を維持して拡大されます。 予想では横は100%で縦に300%伸びて表示されるはずなのですがなぜ比率が 維持されるのでしょうか? また、縦だけとこ横だけ拡大や縮小するにはどう書けばいいのでしょうか? package { import flash.display.*; import flash.events.*; import flash.text.*; public class Main extends MovieClip { private var mc:MovieClip; private var text:TextField; public function Main():void { mc = new MovieClip(); addChild(mc); text = new TextField(); text.text = "テスト"; text.scaleX = 1; text.scaleY = 3; mc.addChild(text); } } }

    • ベストアンサー
    • Flash
  • AS3に関しまして

    mc.addEventListener(Event.ENTER_FRAME,function(event){ mc.scaleX += 0.01; mc.scaleY += 0.01; mc.x = mc.x+1; }); mc.xが10すすんだらストップさせるにはどう記述したら良いですか??

    • ベストアンサー
    • Flash
  • JavaScriptで2次元配列を扱う方法

    C言語を少しだけやっていました。 JavaScriptで2次元配列作りたいのですが、上手くいきません。 var array[5][5]; array[0][0] = 21; document.write(array[0][0]); ↑を実行しても「21」と表示されません。 new array()とか色々試しましたが上手くいかないので質問させていただきました。 教えてください!

  • 3次元配列から2次元配列に

    3次元配列のデータを2次元配列に移すにはどのように したらよいのでしょうか.とりあえず下記のように考えてみましたが. data3[500][500][4000]; //3次元配列 data2[500][500]; //2次元配列 for(y=0; y<500; y++) for(x=0; x<500; x++){ for(z=0; z<4000; z++){ data2[y][x] = data3[y][x][z]; } } } これでいいのでしょうか?

  • 二次元配列

    質問失礼します。 二次元配列の練習中で、 nijigen = new Array(); nijigen[0] = new Array(0,0,0,0); nijigen[1] = new Array(0,0,0,0); nijigen[2] = new Array(0,0,0,0); nijigen[3] = new Array(0,0,0,0); という配列を作りました。 そして、その配列と同じ配置にされたボタンを押すと、その位置の配列の数値に「1」が代入されるというものです。 そこでですが、「配列の内容が全て1になった時」を検知出来るようにしたいのですが、どのようにすればよいのでしょうか。 よろしくお願いします。 //↓こうなった時に検知したいのです nijigen = new Array(); nijigen[0] = new Array(1,1,1,1); nijigen[1] = new Array(1,1,1,1); nijigen[2] = new Array(1,1,1,1); nijigen[3] = new Array(1,1,1,1);

    • ベストアンサー
    • Flash

専門家に質問してみよう