
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文でデータをマス目に作ろうとしています。
基本的に間違っているのでしょうか?
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の配列ができるだけ)
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を例にご説明されている部分は、大変理解しやすく助かります。
行列と指定しても、最初から何番目としても記憶しているものからの引き出し方と言う構造と、見えてきました。
壁に当たった部分だけ小手先で何となく分かっているようで、全体の大系が全然理解できていないと反省しております。
この、部分が今回の心臓部なので大きく解決に向かいそうです。 度々ありがとうございました。
感謝!
No.1
- 回答日時:
ActionScript使ったことないけど、2次元配列を作るにはいったんArrayをnewしてから必要な要素数のnew Arrayを追加する必要があると思います。
http://www.google.co.jp/search?hl=ja&q=ActionScr …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ad or script について
-
uwscでExcelに自動記入
-
スマホでサイトの画像を長押し→...
-
ゲオでカードを作るのは何歳か...
-
FLASHでゲームを作っていた人は...
-
この曲はなんでしょう?
-
laptop go2からの買い替え、lap...
-
スクリップト
-
私のコンピューター上のファイ...
-
arduino プログラムについて
-
chrome flash
-
FLASHの再生はできないのでしょ...
-
フラッシュゲームアーカイブ2
-
ウェブサイトで Flash が事実上...
-
Flashコンテンツを使ったWebサイト
-
Flash Playerのサポートが終了
-
Form内のselectを連動させるに...
-
Flashをブロックしないで
-
ダウンロードしたデジブックはa...
-
Flashplayerの運用について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列の要素番号を取得するには?
-
VBでボタンを押すと画像をラン...
-
IDの自動採番について
-
重複しない乱数の生成
-
外部から読み込んだテキストを...
-
VB.NET の配列の要素数
-
onload時の変数の有効範囲について
-
変な質問ですみません、n番目の...
-
DataGridでCTRLキーを押さずに...
-
FLASHからPHPへ値送信
-
C言語のsizeof(サイズオブ)演算...
-
変数を利用してif文をまとめたい
-
【数字ランダム】計算問題ラン...
-
FLASHでXMLを読み込んだときに...
-
awkスクリプトの実行が遅い
-
VB6 複数行のテキストをリスト...
-
FLASHで表示中の画像をカメラの...
-
ActionScriptで配列をクリアす...
-
Vba 配列の中の特定文字列の位...
-
ランダム表示を重複させないよ...
おすすめ情報