GML 関数[id]について

前回の記事から一月半くらい経ちましたが、私はギリギリ元気です。何連勤したのか覚えてませんが、やっとまとまった休日を手に入れたので、久しぶりに記事を書いてる所存です。さて自分語りはこのくらいにして、今回は関数の解説が主な目的の記事です。

Gamemakerで使われるidという関数、作品を凝ろうとすればするほど大事になってくるのがこの関数です。使い始めの方にはあまり認知されにくく、そもそも「この関数はどこで使うん?」という疑問から始まります、というか自分もそんな感じでした。まぁまず頭が痛くなるような話は置いといて最終的な使い道から述べると、[同じroomで、あるobjectを中心に弾が座標移動するものを複数個同時に出したい]という時などに使います。

ここからはこの関数の使い方です。一応予防線を張っておくとこれから述べることはあくまで私個人のやり方ですので、他を探せばもっといいやり方があるかもしれませんのでそこのところはご周知ください。まずこれはリファレンスで索引すると分かる通り読み取り用の関数と書かれています。つまりinstance_createやplace_meetingといった引数を持った関数ではないのです。そもそも何を読み取るのかというと、文字通りobjectのIDです。同じroomで同じ種類のobjectを使っててもそれらは別々のIDを持っています。これはobjectに限らずroomに置かれるもの全てです(要はtileなども含まれるということです)。つまり絶対に被ることのない固有の数値を得ることができます(現実で例えるとマイナンバーみたいなやつ)。このことを踏まえて先述したものを作ろうとすると以下のようになる。

obj_oya  ... これを中心に座標移動させる。

obj_ko    ...obj_oyaのまわりを移動する弾。

使うobjectはこの二つ。obj_oyaのcreateやalarmイベントなどにobj_koを生成するコードを書きます。そこに直接idはobj_koに送れないので変数にidを入れて送ります。

/*

a = instance_create(x,y,obj_ko);

a.ID = id; //IDは変数

*/

こうしたことで各obj_koには各obj_oyaからもらったidが変数IDに入っている状態になりました。あとは座標移動といってもさまざまなので、oyaを中心に円を描くようにしようと思います。そこで、obj_koのstepイベントにこう書きます。

/*

x = ID.x + cos(degtorad(theta))*r; 

y = ID.y + sin(degtorad(theta))*r; 

theta += rspd;

*/

※ rspd ... 回転速度  r ... 半径  theta ... Θ

こうしたことで各oyaを中心に回ってくれるようになります。

追記)一個のoyaに均等かつ2つ以上のn等分で回らせたい場合はobj_oyaのobj_koを生成するコードを以下のように書き換える。

/*

repeat n {

a = instance_create(x,y,obj_ko);

a.ID = id; //IDは変数

a.theta = D;

D += 360/n;

}

*/