電子書籍の厳選無料作品が豊富!

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文でデータをマス目に作ろうとしています。

基本的に間違っているのでしょうか?

A 回答 (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の配列ができるだけ)
    • good
    • 0
この回答へのお礼

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を例にご説明されている部分は、大変理解しやすく助かります。
行列と指定しても、最初から何番目としても記憶しているものからの引き出し方と言う構造と、見えてきました。

壁に当たった部分だけ小手先で何となく分かっているようで、全体の大系が全然理解できていないと反省しております。 

この、部分が今回の心臓部なので大きく解決に向かいそうです。 度々ありがとうございました。 
       
               感謝!

お礼日時:2013/07/03 21:16

ActionScript使ったことないけど、2次元配列を作るにはいったんArrayをnewしてから必要な要素数のnew Arrayを追加する必要があると思います。



http://www.google.co.jp/search?hl=ja&q=ActionScr …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!