//============================================================================== // 攻撃判定の当たり判定 岩 //============================================================================== 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; } } } }
//============================================================================== // 地形との判定 //============================================================================== 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)); } } }
//============================================================================== // 攻撃判定の当たり判定 プレイヤー //============================================================================== 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; } } } }