丸い当たり判定をもったプレイヤーの移動処理をつくる
コード
//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;