Game Maker Studio 2 まとめ

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

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

コード

//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;