Game Maker Studio 2 まとめ

Game Maker Studio 2 Wiki的な感じでまとめています

instance_nearest

説明

この関数は、指定した座標から一番近い指定オブジェクトのインスタンスを取得します。存在しない場合はnooneを返します。

構文

instance_nearest(x, y, obj);

引数

x X座標
y Y座標
obj 対象のオブジェクト

戻り値

Real (インスタンスID) 又は, noone

関連リンク

instance_nearest

丸い当たり判定をもったプレイヤーの移動処理をつくる

コード

//step event

var spd = 5; //移動速度
var r = 5; //当たり判定の半径
var ofs_x = 0; //当たり判定の位置のX軸の補正
var ofs_y = 0; //当たり判定の位置のY軸の補正

//入力状態の取得
var ix = keyboard_check(vk_right) - keyboard_check(vk_left);
var iy = keyboard_check(vk_down) - keyboard_check(vk_up);

//移動先の計算
var movx = x + ix * spd, movy = y + iy * spd;

//壁に埋まってしまう場合は移動先を修正してから座標を反映
while(collision_circle(movx + ofs_x, y + ofs_y, r, obj_wall, false, false) != noone){
    movx += -ix;
}
x = movx;

while(collision_circle(x + ofs_x, movy + ofs_y, r, obj_wall, false, false) != noone){
    movy += -ix;
}
y = movy;

解説

keyboard_checkは入力状態をtrue/falseで返すので、それを利用したテクニックです。
GMSでは、trueを1, falseを0として扱うことが出来ます。
この2行で、X方向、Y方向の入力状態を取得することが出来ます。

var ix = keyboard_check(vk_right) - keyboard_check(vk_left);
var iy = keyboard_check(vk_down) - keyboard_check(vk_up);

移動先の座標が かべのなかにいる 壁の中の場合、入力方向とは逆方向へ1ずつ修正していきます。
最後にインスタンスに反映します。

while(collision_circle(movx + ofs_x, y + ofs_y, r, obj_wall, false, false) != noone){
    movx += -ix;
}
x = movx;

while(collision_circle(x + ofs_x, movy + ofs_y, r, obj_wall, false, false) != noone){
    movy += -ix;
}
y = movy;

もし以下のようなコードに修正すると、コードの見た目はまとまっていますが、壁に対して斜めから侵入した場合、無限ループに陥ります。注意してください。

while(collision_circle(movx + ofs_x, y + ofs_y, r, obj_wall, false, false) != noone){
    movx += -ix;
}
while(collision_circle(x + ofs_x, movy + ofs_y, r, obj_wall, false, false) != noone){
    movy += -ix;
}

x = movx;
y = movy;

instance_copy

説明

この関数は、呼び出し元のインスタンスを複製します。複製して新たに作成されたインスタンスCreate Event を実行するかどうか引数 perf で選択します。

構文

instance_copy(perf);

引数

perf Create Event を実行するかどうか(True/False)

戻り値

Real (実数, インスタンスID)

関連リンク

instance_copy

instance_change

説明

この関数は、インスタンスを別のオブジェクトのインスタンスへと変更します。その際に、変更されるインスタンスDestroy Event , Clean Up Event と新たに設定されるインスタンスCreate Event を引き起こすかを選択出来ます。

この関数を使用すれば、爆弾を爆発させるといったようなことが出来ます。

構文

instance_change(obj, perf);

引数

obj 呼び出し元に新たに設定するオブジェクトのインデックス
perf Create, Destroy, CleanUp イベントを引き起こすか(True/False)

戻り値

N/A

関連リンク

instance_change

instance_deactivate

無効化(deactivate)されたインスタンスは、ゲーム上には存在しないものとして扱われ、再度、有効化(activate)されるまで操作や変更を行うことが出来ません。

無効化された永続インスタンスはRoomの移動を行う前に再度有効化しなければ移動と同時に破棄されてしまいます。 したがって、これらの関数を永続インスタンスに使用すると問題が起きる可能性があるため、十分注意して使用する必要があります。

また各Step(例えばアラームやDrawイベントなど)でインスタンスの無効化を実行することは、ゲームのパフォーマンスに影響を与え、遅延や低速化や重大なエラーを招きますので、十分注意して使用する必要があります。

無効化されたインスタンスはゲーム内に存在しないものとして扱われますが、インスタンスのユニークなIDを使用することでインスタンスの変数にアクセスすることが可能になります。これは無効化されたインスタンスの変更にアクセスすることが出来る唯一の方法です。ただし、 with(object) , with(instance) は使用することが出来ません。

インスタンスのアクティブ化,非アクティブ化を行うには以下の関数を使用します。

instance_activate_all
instance_activate_object
instance_activate_region
instance_activate_layer 指定レイヤー内のインスタンスを全てアクティブ化
instance_deactivate_all
instance_deactivate_object
instance_deactivate_region
instance_deactivate_layer 指定レイヤー内のインスタンスを全て非アクティブ化