GameMaker 日本語掲示板

床のすり抜けを防ぐ方法

2 コメント
views
16 フォロー

if (place_meeting(x, y,ObjectA)) {
    vspeed = 0;
    gravity= 0;
}else{
    gravity= 0.08;
    vspeed += gravity;
    y += vspeed;
}
でObjectAの重力と床の判定を作ったのですが、高いところから床に衝突したときにvspeedの値が大きすぎるせいか、すり抜けたり床に埋まったりしてしまいます。床のすり抜けを防ぐ方法を教えてください!!

xzy
作成: 2024/03/20 (水) 03:45:38
通報 ...
1
生高橋 2024/03/21 (木) 11:17:02

ジャンプアクションの移動と当たり判定のテンプレートを一旦置いておきます。
細かく解説すると長くなってしまうので一部のみ抜粋して解説します。

//横方向の速度の計算
hsp = oInput.inputHsp * moveSpd;

//着地判定
var isGround = place_meeting(x,y + 1,oBaseWall);
if(!isGround)
{
	vsp += grav;
}

//ジャンプ
if(isGround && oInput.keyJump)
{
	vsp = -jumpSpd;
}

//横方向の当たり判定
if(place_meeting(x+hsp,y,oBaseWall))
{

	while(!place_meeting(x+sign(hsp),y,oBaseWall)) 
	{
		x += sign(hsp);
	}
	hsp = 0;
}
x += hsp;

//縦方向の当たり判定
if(place_meeting(x,y+vsp,oBaseWall))
{
	while(!place_meeting(x,y+sign(vsp),oBaseWall)) 
	{
		y += sign(vsp);
	}
	vsp = 0;
}
y += vsp;

自分で精密な当たり判定をする場合組み込みの変数vspeedやgravityなどは使わないほうがやりやすいです。
vspeedやgravityなどはstepイベントが終わった後自動で位置に加算されてしまい、細かく制御がしずらくなります。
ですので自分でvspやgravなどの変数を用意してやると良いでしょう。
xzyさんが挙げて頂いたサンプルだとy+=vspeedの箇所で位置を加算していますがこれだと2重に加算されますので速度がものすごいことになっています。

次に当たり判定がめり込む原因として、移動先で当たり判定をしていないことにあります。
ですので先に移動速度を計算してその速度を加味した位置で当たり判定を行います。
サンプルだとif(place_meeting(x,y+vsp,oBaseWall))の箇所です。
これで移動先で当たり判定することになります。
これで当たっていなければy+=vspと位置を計算するようにします。

ものすごく難しいかもしれませんが参考になればと思います。
念のため、Youtubeのチュートリアルもここに置いておきます。
英語ですがジャンプアクションシューティングの基礎的なことを学ぶことができます。(ここでめり込まない当たり判定も解説されています。)
https://www.youtube.com/watch?v=izNXbMdu348&list=PLPRT_JORnIupqWsjRpJZjG07N01Wsw_GJ

2

分かりやすい解説ありがとうございます!!!!!!!初めて重力系(?)のプログラムをやるので助かりました!!!!