コード例 #1
0
//----------------------------------
//機能:当たり判定
//引数:pTarget		敵の位置情報
//戻値:TRUEorFALSE
//----------------------------------
BOOL Bread::Hit(UnitBase *pTarget)
{
	if (typeid(*pTarget) == typeid(Enemy))
	{
		Enemy *pEnemy = (Enemy*)pTarget;
		if (isbread == TRUE)
		{
			//敵の位置をGetPosを通して受け取る
			enemyPosition = pEnemy->GetPos();
			//位置の計算を行う
			int distance =
				(int)(position.x - (enemyPosition.x + g_stageScrollPosition.x)) *
				(int)(position.x - (enemyPosition.x + g_stageScrollPosition.x)) +
				(int)(position.y - (enemyPosition.y + g_stageScrollPosition.y)) *
				(int)(position.y - (enemyPosition.y + g_stageScrollPosition.y));			//(0-0)*(0-0)+(0-0)*(0-0) =((0-0)*(0-0)) + ((0-0)*(0-0)) 

			if (distance <= (28 * 48))
			{
				//弾が当たったら弾を消す
				Reset();
				pEnemy->Kill();
				return TRUE;
			}
		}
	}

	return FALSE;
}
コード例 #2
0
ファイル: Player.cpp プロジェクト: syuta1852/Rensyu
//playerのHit関数
//引数:UnitBase型のポインタ
//(UnitBaseクラスを継承した子クラスの情報が扱える)
//戻り値:HRESULT型-成功かどうか
HRESULT Player::Hit(UnitBase* pTarget)
{
	//ステージとの当たり判定
	if (typeid(*pTarget) == typeid(Stage))
	{
		//pTargetをステージと判断し、stage型にキャスト
		Stage* stage = (Stage*)pTarget;

		//RayCastData型の変数を作る
		RayCastData ray;
		//レイが出る位置
		ray.start = position;
		ray.start.y = position.y+10;

		//レイを向ける方向
		ray.dir = D3DXVECTOR3(0, -1, 0);
		
		//レイの情報を格納したアドレスを渡す
		stage->GetModel()->RayCast(&ray);

		//Rayが当たっているかつ
		//ステージの位置Yがプレイヤー位置Y-1より大きかったら
		if (ray.hit && ray.pos.y >= (position.y - 1) && ground_flg == FALSE)
		{
			jump_flg = TRUE;
			jump_Count = 0;
			ground_flg = TRUE;
			position = ray.pos + D3DXVECTOR3(0, 0.5, 0);
		}
		else if (ground_flg == TRUE)
		{
			position = ray.pos + D3DXVECTOR3(0,0.5,0);
		}

		//目の前にステージがあるかの判定
		ray.start = position;
		D3DXMATRIX matR;
		D3DXMatrixRotationY(&matR, D3DXToRadian(dir));
		D3DXVECTOR3 rayVec = D3DXVECTOR3(0, 0, 1);
		D3DXVec3TransformCoord(&rayVec, &rayVec, &matR);
		ray.dir = rayVec;
		stage->GetModel()->RayCast(&ray);
		if (ray.hit && ray.dist < 2)
		{
				isWallHit = TRUE;
				wallNormal = ray.normal;
		}
		else
		{
			isWallHit = FALSE;
		}

		ray.start = position;
		ray.dir = D3DXVECTOR3(0, 0, -1);
		stage->GetModel()->RayCast(&ray);
		D3DXVECTOR3 v = stage->GetPos() - position;
		//プレイヤーとカメラの間にステージがあるか
		D3DXVECTOR3 pToCdist = camVec-position;
		if (D3DXVec3Length(&v) < D3DXVec3Length(&pToCdist))
		{
			camVec = D3DXVECTOR3(position.x, 5, position.z);
		}

	}
	//敵との当たり判定
	if (typeid(*pTarget) == typeid(Enemy))
	{
		static int count = 0;
		count--;
		Enemy* enemy = (Enemy*)pTarget;				//UnitBase型をEnemy型にキャスト
		BOOL flg = item->Hit(enemy->GetPos());		//アイテムが当たったかどうか
		if (flg)
		{
			enemy->KnockBack();
			count = 100;
		}
		D3DXVECTOR3 v = enemy->GetPos() - position; //プレイヤーから敵に向かうベクトルを求める
		if (D3DXVec3Length(&v) < 2)					//ベクトルの長さが2以下だったら
		{
			if (count >= 0)
			{
				enemy->Kill();
				g_gameScene = SC_CLEAR;
			}
			else
			{
				g_gameScene = SC_GAME_OVER;
			}
		}
	}
	if (typeid(*pTarget) == typeid(Invisible))
	{
		Invisible* invisible = (Invisible*)pTarget;
		D3DXVECTOR3 inTopVec = invisible->GetPos() - position;
		if (D3DXVec3Length(&inTopVec) < 1)
		{
			isInvisible = TRUE;
		}
		else
		{
			isInvisible = FALSE;
		}
	}



	return S_OK;
}