예제 #1
0
파일: Game.cpp 프로젝트: AT13ANo5/GLProject
//==============================================================================
// 攻撃判定の当たり判定 岩
//==============================================================================
void CGame::CheckHitRock(void)
{
	// 攻撃側の決定
	CPlayer*	pPlayerOffense = nullptr;		// 攻撃側プレイヤー
	for (int cntBullet = 0; cntBullet < PLAYER_MAX; ++cntBullet)
	{
		// プレイヤーを取得
		pPlayerOffense = Player[cntBullet];

		// 弾が存在しなければ判定しない
		if (NeedsSkipBullet(pPlayerOffense))
		{
			continue;
		}

		// 防御側の決定
		for (int cntRock = 0; cntRock < MAX_ROCK; ++cntRock)
		{
			// プレイヤーを取得
			CObject*	pRock = ppRock_[cntRock];		// 防御側岩

			// 当たり判定
			VECTOR3	positionOffense = pPlayerOffense->Bullet()->Pos();		// 攻撃判定中心座標
			VECTOR3	positionDefense = pRock->Pos();							// 防御判定中心座標
			VECTOR3	vectorOffenseToDefense;									// 攻撃判定から防御判定へのベクトル
			float	distanceOffenseAndDefense;								// 判定の中心同士の距離
			float	scalingRock;											// 岩の大きさ
			scalingRock = (pRock->Scl().x < pRock->Scl().z ? pRock->Scl().x : pRock->Scl().z);
			positionOffense.y += HEIGHT_OFFENSE_BULLET;
			positionDefense.y += HEIGHT_DEFENSE_CHARACTER;
			vectorOffenseToDefense = positionDefense - positionOffense;
			distanceOffenseAndDefense = vectorOffenseToDefense.x * vectorOffenseToDefense.x + vectorOffenseToDefense.y * vectorOffenseToDefense.y + vectorOffenseToDefense.z * vectorOffenseToDefense.z;

			if (distanceOffenseAndDefense < (RADIUS_DEFENSE_ROCK * scalingRock + RADIUS_OFFENSE_BULLET) * (RADIUS_DEFENSE_ROCK * scalingRock + RADIUS_OFFENSE_BULLET))
			{
				// 弾の消滅
				pPlayerOffense->ReleaseBullet();

				// エフェクト:爆発 弾が岩に当たったとき
				CSmoke::Create(positionOffense);

				// 処理終了
				break;
			}
		}
	}
}
예제 #2
0
파일: Game.cpp 프로젝트: AT13ANo5/GLProject
//==============================================================================
// 地形との判定
//==============================================================================
void CGame::IsLandField(void)
{
	// 判定
	VECTOR3	 nor;			// 法線
	float	 height;		// 高さ
	VECTOR3	 bulletPos;		// 対象オブジェクト座標

	CPlayer* pPlayerCurrent = nullptr;		// 対象プレイヤー

	for (int cntBullet = 0; cntBullet < PLAYER_MAX; ++cntBullet)
	{
		// 対象プレイヤーの取得
		pPlayerCurrent = Player[cntBullet];

		// 弾が存在しなければ判定しない
		if (NeedsSkipBullet(pPlayerCurrent))
		{
			continue;
		}

		// 対象オブジェクト座標を取得
		bulletPos = pPlayerCurrent->Bullet()->Pos();

		// 判定
		height = Ground->GetHeight(bulletPos - VECTOR3(0.0f, BULLET_SIZE * 0.5f, 0.0f), &nor);
		if (height >= bulletPos.y)
		{
			// 弾の消滅処理
			CSoundAL::Play(CSoundAL::SE_IMPACT, bulletPos);
			pPlayerCurrent->ReleaseBullet();

			// エフェクト:爆発 弾と地形の判定
			CSmoke::Create(VECTOR3(bulletPos.x, height, bulletPos.z));
		}
	}
}
예제 #3
0
파일: Game.cpp 프로젝트: AT13ANo5/GLProject
//==============================================================================
// 攻撃判定の当たり判定 プレイヤー
//==============================================================================
void CGame::CheckHitPlayer(void)
{
	// 攻撃側の決定
	CPlayer*	pPlayerOffense = nullptr;		// 攻撃側プレイヤー
	for (int cntBullet = 0; cntBullet < PLAYER_MAX; ++cntBullet)
	{
		// プレイヤーを取得
		pPlayerOffense = Player[cntBullet];

		// 弾が存在しなければ判定しない
		if (NeedsSkipBullet(pPlayerOffense))
		{
			continue;
		}

		// 防御側の決定
		for (int cntPlayer = 0; cntPlayer < PLAYER_MAX; ++cntPlayer)
		{
			// 自身とは判定しない
			if (cntBullet == cntPlayer)
			{
				continue;
			}

			// プレイヤーを取得
			CPlayer*	pPlayerDefense = Player[cntPlayer];		// 防御側プレイヤー

			// プレイヤーが判定可能か確認
			if (NeedsSkipPlayer(pPlayerDefense))
			{
				continue;
			}

			// 当たり判定
			VECTOR3	positionOffense = pPlayerOffense->Bullet()->Pos();		// 攻撃判定中心座標
			VECTOR3	positionDefense = pPlayerDefense->Pos();				// 防御判定中心座標
			VECTOR3	vectorOffenseToDefense;									// 攻撃判定から防御判定へのベクトル
			float	distanceOffenseAndDefense;								// 判定の中心同士の距離

			positionOffense.y += HEIGHT_OFFENSE_BULLET;
			positionDefense.y += HEIGHT_DEFENSE_CHARACTER;
			vectorOffenseToDefense = positionDefense - positionOffense;
			distanceOffenseAndDefense = vectorOffenseToDefense.x * vectorOffenseToDefense.x + vectorOffenseToDefense.y * vectorOffenseToDefense.y + vectorOffenseToDefense.z * vectorOffenseToDefense.z;

			if (distanceOffenseAndDefense < (RADIUS_DEFENSE_CHARACTER + RADIUS_OFFENSE_BULLET) * (RADIUS_DEFENSE_CHARACTER + RADIUS_OFFENSE_BULLET))
			{
				// 弾の消滅
				pPlayerOffense->ReleaseBullet();

				// 当たったときの処理
				pPlayerDefense->AddPlayerLife(-1);
				pPlayerDefense->SetState(PLAYER_STATE_DAMAGE);

				// エフェクト:爆発 弾がプレイヤーに当たったとき
				if (pPlayerDefense->PlayerLife() > 0)
				{
					if (pPlayerDefense->GetPreyerFlag())
					{
						VC::Instance()->SetVibration(0.7f,30,0.7f,30);
					}
					CSoundAL::Play(CSoundAL::SE_HIT,pPlayerDefense->Pos());
					CSoundAL::Play(CSoundAL::SE_DAMAGE,pPlayerDefense->Pos());
				}
				CExplosion::Create(pPlayerDefense->Pos());

				//	長崎
				if (pPlayerDefense->PlayerLife() == 0)
				{
					//	殺された数加算
					pPlayerDefense->addDeathCount();
					CManager::SendDeath(pPlayerDefense->getDeathCount(), pPlayerDefense->getPlayerID());

					//	殺した数加算
					pPlayerOffense->addKillCount();
					CManager::SendKill(pPlayerOffense->getKillCount(), pPlayerOffense->getPlayerID());

					if (CManager::userInfo[pPlayerDefense->getPlayerID()].entryFlag == false)
					{
						if (CManager::netData.charNum == 0)
							CManager::SendDeathFlag(pPlayerDefense->getPlayerID());
					}
				}

				// 処理終了
				break;
			}
		}
	}
}