サンプルコード
var a,b,c,d; a = 10-1; // 9 b = 10-1; // 9 c = 10*10;// 100 for (var i=a;i>=0;i--)/* 横(rows)に相当 */ { for (var k=b;k>=0;k--)/* 縦(Columns)に相当 */ { d[i,k] = c;/* 配列に初期値として連番を代入 */ c--;/* 100から値を1ずつ減算して最後に1となる */ draw_text(30*i, 30*k, string(d[i,k])); }; }; var z=0;/* デバッグ用:ココにブレークポイントを設定 */
解説
a = 10-1;
配列の要素は 10 ✕ 10 、しかし GML の配列は 0-based index なので配列要素の先頭は常に 0
から始まります。つまり 10 個の要素がある場合、添字は 0 〜 9 迄、10 から 1 を引く処理はあえて見せるように書いてあります。
配列における縦横と言うのはあくまでも便宜上の概念でしかありませんが、どちらが縦か横かは更に製作者の都合でしかありません。今回はループ処理を二重化し、最初のループを横の処理、ループ内ループで縦の処理を行います。
for (var i=9;i>=0;i--)/* 横の処理 */ { for (var k=9;k>=0;k--)/* 縦の処理 */ { }; };
配列の最大要素から値を代入していけば動的確保は発生しません。1 〜 100 までの連番を代入したい場合、通常の思考だと文字通り 1 から値を代入して 100 迄を繰り返し処理したいところだが、これだと 99 回も動的確保でデータコピーが発生するため、GML で配列を扱う上では最低な書き方となります。
あるいは別の書き方
(var i=0;i<10;i++)
(var i=9;i>=0;i--)
小さな値から代入する場合のループ処理と、大きな値から代入して行く場合のループ処理の書き方です。
小さな値から代入するコードで配列を作る場合、動的確保を発生させないように処理するのならば以下のようにします。
d[9,9] = 100;/* 先に最大要素で確保を済ませる */ for (var i=0;i<10;i++)/* 横の処理 */ { for (var k=0;k<10;k++)/* 縦の処理 */ { }; };
最大要素数を指定して配列確保する処理を事前に行う方が直感的で分かりやすい。ただし書き方として冗長ではあります。慣れてくればどちらでも書けるし、あるいは必要に応じてループ処理を変えます。