Game Maker Language リファレンス > 組み込み関数 用途別 > 配列操作? > 配列について
このセクションでは特殊な変数、複数の値を保持できる配列、について説明をします。
■目次
配列は、最初はその概念は難しく思えますが、この変数はゲームを作るのに非常に有用です。それはなぜか? ではここで配列なしでは実現不可能な例を上げてみます。
この例は、配列の最も基本的な一部分に過ぎません。配列を覚えることで、様々なアプリが作れることにあなたは驚くに違いありません! 次にそれらについてもう少し説明をしてみます...
それでは、配列とは何かを説明します。
array[0] = 1.25;
これは、1次元の配列の定義となります。
array
これがここでの配列の名前となります。ただし他の変数とは異なり、これだけではなく、
[0]
この添字は配列内の番号を表します。配列は基本的に複数の数値から成り立っていて、配列の番号は[]に入れたものとなり、それは識別するための番号となります。配列は常に「0」から始まり、負の値にはなりません。では、配列のサイズを拡張してみます。
array[2] = 0; array[1] = 0; array[0] = 0;
ここでは配列の「0〜2」番目を「0」で初期化しています。これをせずに各要素にアクセスするとGameMaker:Studioではエラーとなります。そのため、まずは配列を初期化するという処理が必須となります。つまり配列をどれだけのサイズ確保しなければならないのかを最初に決めておく必要があります。 そのような初期化をする際、以下のようにループで指定することができます。
var i; i = 9; repeat(10) { array[i] = 0; i -= 1; }
このシンプルなコードは配列の0〜9番目を0で初期化しています。ここで注目すべきは配列の後ろから順番に初期化をしていることです。これを行うことは必須ではありません。ですがこのような記述をするとメモリを最適な形で確保することができます。
その理由としては、配列のサイズが増えるたびに動的にメモリを確保するためです。小さなサイズの配列であればさほど速度に影響はありませんが、大規模な配列を生成する場合にはこのような最適化が必要となるケースがあります。
それでは、配列の各番号に異なる値を持つように初期化するためにはどうするのか? それには手動で番号と値を指定する必要がありますが、とても役に立つ仕組みがあります。
count = 3; array[count] = "you?" count -= 1; array[count] = "are " count -= 1; array[count] = "How " count -= 1; array[count] = "Hello!" count -= 1;
このように、配列の番号は変数で指定することができます。これにより値を減らしながら初期化をしています。この方法には2つの利点があります。1つには、配列の番号を間違って指定する心配がなくなることです。もう1つは、その後に別のところで"count"変数を使って配列の番号を指定できることです。これはとても便利です!
では実際にはどのように配列を使うのか? まずは通常の変数を使うのと同じように配列を使ってみます:
total = array[0] + array[5]; //Add two array values together if array[9] = 10 //Check an array value { //do something } draw_text(32, 32, array[3]); //draw an array value
配列は連続した番号となっているので、それを実行するためにはループを使って簡単に記述することができます:
var i, total; i = 0; repeat(10) { total += array[i]; // "total"変数にarrayに入っている数値を加算して、合計値を求める draw_text(32, 32 + (i * 32), array[i]); // arrayのそれぞれの数値を描画 i += 1; } draw_text(32, 32 + (i * 32), total); // 合計値の描画
上記のコードは配列"array"のすべての値を加算し、それぞれの値をを描画し、最後に合計値"total"を描画します。
1次元配列がわかったところで、次に2次元配列を見てみます。
array[0,0] = 5;
このように2次元配列では、2つの番号で作られます。1次元が高さのみであるのに対して、2次元は高さ(b)と幅(a)を持っています。この拡張された配列の例は以下のとおりです:
array[1,2] = 1; array[1,1] = "hello"; array[1,0] = 55.5; array[0,2] = sprite_index; array[0,1] = "world"; array[0,0] = -67.89;
2次元配列は1次元配列と同様に、あらかじめ初期化しておく必要があります。また他の変数と同様に、実数・文字列・定数を保持することができ、大量のデータを格納しアクセスする必要があるゲームに必要な機能となります(なおアクセスするには配列をループするのが簡単な方法です)。
次の例は4つの異なる敵をそれぞれ異なる座標に配置する処理です。これを2次元配列を使用して実現をしています。
enemy[3,2] = 448; //y position enemy[3,1] = 32; //x position enemy[3,0] = obj_Slime; //Object enemy[2,2] = 448; enemy[2,1] = 608; enemy[2,0] = obj_Skeleton; enemy[1,2] = 32; enemy[1,1] = 608; enemy[1,0] = obj_Knight; enemy[0,2] = 32; enemy[0,1] = 32; enemy[0,0] = obj_Ogre;
上記の処理は、オブジェクトを管理するオブジェクトの"Creae"イベントに記述するのが良いでしょう。
これにより敵オブジェクトの情報とルームおけるXY座標を配列に格納できました。この配列を使うと、任意のイベント(アラーム、キープレスなど)で以下のように敵の生成を行うことができます。
var i; i = irandom(3); //get a random number from 0 to 4 instance_create(enemy[i,1], enemy[i,2], enemy[i,0]); //Use the array to create the object
実装はたったこれだけのコードになります。これにより"if"や"else"を使うよりも少ない記述で、ルームにてランダムで敵を生成することができます。また、生成する敵のパラメータの変更も簡単にできるはずです。
配列は通常の変数と同様に、スクリプトの引数や戻り値として使用することができます。 スクリプトの記述としては、配列の変数をそのまま指定するだけです。ただし、配列はスクリプトに渡す際に、参照を渡すのではなくコピーしたものを渡していることに注意が必要です。つまり、引数として渡した配列の中身を変更した場合は、戻り値としてその配列を返す必要があります。
配列のサイズが大きい場合、スクリプトに配列を渡すとパフォーマンスに大きく影響しシステムが不安定になる可能性があります。
例として、次のコードを考えてみましょう。まず使用する配列を作成し、それからスクリプトにその配列を渡します。
for (var i = 9; i > -1; i--;) { a[i] = i; } scr_Return_Array(a);
シンプルなスクリプトです。
for (var i = 9; i > -1; i--;) { a[i] = i * 100; }
900、800、700を保持する配列を設定していますが、これはコピーしたものなので、呼び出し元の配列の値は書き換わりません。そのため、このコードは戻り値を返すように修正する必要があります。
もう一度、呼び出し元のコードを記述します。
for (var i = 9; i > -1; i--;) { a[i] = i; } a = scr_Return_Array(a);
呼び出すスクリプトの記述は次のようになります。
for (var i = 9; i > -1; i--;) { argument0[i] = i * 100; } return argument0;
また、作成した配列が不要になった場合、再割当てを行うことで配列をメモリ上から削除します。例えば次のように、
// 配列を生成する for (var i = 9; i > -1; i--;) { a[i] = i; } ・ ・ ・ // 配列を削除する a = 0;
配列を使うにあたって役立ついくつかの関数があります。これらはコード内の柔軟性を与えるためのもので、より多くの機能や動的配列を作成するために使用します。これらの関数は以下のとおりです: