ページ 11

アクションゲームにおけるブロックとの当たり判定

Posted: 2011年5月04日(水) 17:18
by Swallowtails
初めまして。アクションゲームを作っているのですが、自キャラとブロックの当たり判定と位置補正がどうも上手くいきません。

ブロックはオブジェクトにして、テキストファイルから生成する場所を読み込み生成するという方法をとっています。

以下、当たり判定部分のソースです。

コード:

if(myChar.left < block.right && myChar.right > block.left)
{
    if(myChar.top < block.bottom && myChar.bottm > block.top)
    {
        D3DXVECTOR3 PB = block.pos - myChar.pos;     // 自キャラ->壁ベクトル
        D3DXVec3Normalize(&PB, &PB);                      // PBベクトルを正規化
        D3DXVECTOR3 right = D3DXVECTOR3(1, 0, 0);   // 右向きのベクトル
        float dot = D3DXVec3Dot(&PB, &right);            // 内積計算
        if(cos(D3DXToRadian(135)) <= dot && dot <= cos(D3DXToRadian(45)))        // 上または下から当たった
        {
            if(myChar.pos.y > block.pos.y)            // 上から当たった
            {
                // 上に位置補正
            }
            else                                                   // 下から当たった
            {
                // 下に位置補正
            }
        }
        else if(cos(D3DXToRadian(45)) < dot && dot <= cos(D3DXToRadian(0)))      // 左から当たった
        {
                // 左に位置補正
        }
        else                                                                                                     // 右から当たった
        {
                // 右に位置補正
        }
    }
}
大体こんな感じです。問題はブロックの端で、ブロックの端でジャンプして着地するとめり込みすぎて上から当たっても内積結果が横から当たったと出てしまい、自キャラが横に補正されてしまうことです。(ブロックの左端に立ってジャンプ、着地すると左から当たったと判定されてしまい、自キャラは左に補正される)Y軸方向への速度による判定など試してみましたが解決しません。何かいい方法は無いでしょうか?よろしくお願いします。

Re: アクションゲームにおけるブロックとの当たり判定

Posted: 2011年5月05日(木) 23:06
by ISLe
自キャラの前回座標と今回座標を比べて、足元がブロックの上辺をまたいでめり込んでいたら上に補正。
自キャラの前回座標と今回座標を比べて、頭のてっぺんがブロックの下辺をまたいでめり込んでいたら下に補正。
上記どちらでもなければ左右近い方に補正。
というのはどうでしょう。

Re: アクションゲームにおけるブロックとの当たり判定

Posted: 2011年5月06日(金) 11:24
by Swallowtails
ISLeさんお返事ありがとうございます。

早速直してみましたが、壁に当たりながらジャンプしようとするとひっかかって上がれないと言う状況になってしまいました・・・

以下直したソースです。

コード:

void HitMyChar()
{
	if(myChar.left < block.right && myChar.right > block.left)
	{
		if(myChar.top < block.bottom && myChar.bottm > block.top)
		{
			D3DXVECTOR3 PB = block.pos - myChar.pos;     // 自キャラ->壁ベクトル
			D3DXVec3Normalize(&PB, &PB);                // PBベクトルを正規化
			D3DXVECTOR3 right = D3DXVECTOR3(1, 0, 0);	 // 右向きのベクトル
			float dot = D3DXVec3Dot(&PB, &right);		 // 内積計算
			if(cos(D3DXToRadian(135)) <= dot && dot <= cos(D3DXToRadian(45)))        // 上または下から当たった
			{
				if(myChar.pos.y > block.pos.y)			// 上から当たった
				{
					// 上に位置補正
				}
				else									// 下から当たった
				{
					// 下に位置補正
				}
			}
			else if(cos(D3DXToRadian(45)) < dot && dot <= cos(D3DXToRadian(0)))     // 左から当たった
			{
				if(myChar.beforeBottom < block.top && block.totp < myChar.bottom)	// 前フレームの位置がブロックの上端より上で現在の位置がブロックの上端より下
				{
					// 上に補正
				}
				if(myChar.beforeTop > block.bottom && block.bottom && myChar.top)	// 前フレームの位置がブロックの下端より下で現在の位置がブロックの下端より上
				{
					// 下に補正
				}
					// 左に位置補正
			}
			else																	// 右から当たった
			{
				if(myChar.beforeBottom < block.top && block.totp < myChar.bottom)	// 前フレームの位置がブロックの上端より上で現在の位置がブロックの上端より下
				{
					// 上に補正
				}
				if(myChar.beforeTop > block.bottom && block.bottom && myChar.top)	// 前フレームの位置がブロックの下端より下で現在の位置がブロックの下端より上
				{
					// 下に補正
				}
					// 右に位置補正
			}
		}
	}
	myChar.beforePos = myChar.pos;			// 前フレームの位置を更新
}
アクションゲームを作るの初めてで、ブロックに当たったときの位置補正をどうするかよく分かりませんが、内積を使わない方法も考えたいと思います。

Re: アクションゲームにおけるブロックとの当たり判定

Posted: 2011年5月06日(金) 17:08
by ISLe
左右に補正するときに、上下にも補正しているのはなぜですか?

Javaだし汚いコードですが、以前ブログで書いた記事です。
http://isle.cocolog-nifty.com/blog/2010 ... -f31a.html
参考になるでしょうか。