10. TEST_FIXTURE(FixtureBot3, UpdateVision) { // 등뒤에 있기 m_pBot1->SetPos(Vector2D(0, 0)); m_pBot1->RotateFacingTowardPosition(Vector2D(1, 0)); // fov 가 a 도라고 하면 실제로는 -a/2 ~ a/2 사이에 보여야 한다. m_pBot1->SetFieldOfView(DegsToRads(180.0)); // m_pBot1~m_pBot2, m_pBot1~m_pBot3 중에서 가까운 녀석이 타겟이 된다. m_pBot3->SetPos(Vector2D(-3, 0)); m_pBot2->SetPos(Vector2D(-1, 0)); // 뒤에서는 안 보이고 CHECK(!isSecondInFOVOfFirst( m_pBot1->Pos(), m_pBot1->Facing(), m_pBot2->Pos(), m_pBot1->FieldOfView())); m_pBot2->SetPos(Vector2D(2, 0)); // 앞에서는 보인다 CHECK(isSecondInFOVOfFirst( m_pBot1->Pos(), m_pBot1->Facing(), m_pBot2->Pos(), m_pBot1->FieldOfView())); m_pBot1->m_pSensoryMem->UpdateVision(); // 앞에 있는 bot2 는 보고, bot3 는 못본다. 각도만 신경쓰고, 거리는 신경 안쓴다. MemoryRecord& info2 = m_pBot1->GetSensoryMem()->m_MemoryMap[m_pBot2]; CHECK(info2.bWithinFOV); MemoryRecord& info3 = m_pBot1->GetSensoryMem()->m_MemoryMap[m_pBot3]; CHECK(!info3.bWithinFOV); // 벽에 가려지지만 않으면 모두 sense 를 할 수 있다. std::list<Raven_Bot*> SensedBots = m_pBot1->GetSensoryMem()->GetListOfRecentlySensedOpponents(); CHECK_EQUAL(2, SensedBots.size()); // Update -> UpdateMovement 에서 위치 못하도록 못 움직이게 만든다. m_pBot1->SetMaxSpeed(0.0); m_pBot1->Update(); // TakeAimAndShoot Raven_TargetingSystem* pTargetSys1 = m_pBot1->GetTargetSys(); CHECK(0 < pTargetSys1->GetTimeTargetHasBeenVisible()); Raven_Bot* pTarget = m_pBot1->GetTargetBot(); CHECK(pTarget); CHECK_EQUAL(pTarget->ID(), m_pBot2->ID()); CHECK_EQUAL(1, m_World.GetNumProjectiles()); // 총알 하나 발사 }
11. TEST_FIXTURE(FixtureBot2, Bot1ShootBoltToBot2){ CHECK_EQUAL(100, m_pBot1->Health()); m_pBot1->SetPos(Vector2D(0, 0)); m_pBot2->SetPos(Vector2D(2, 0)); Bolt* pBolt = m_World.AddBolt(m_pBot1, Vector2D(4, 0)); CHECK(IsSimilarVector2D(Vector2D(0, 0), pBolt->Pos(), 0.01)); CHECK(!pBolt->isDead()); m_World.Update(); CHECK(IsSimilarVector2D(Vector2D(5, 0), pBolt->Pos(), 0.01)); // 이동했다. CHECK(pBolt->isDead()); // m_pBot2 에 맞았다. CHECK_EQUAL(99, m_pBot2->Health()); // hp 가 1 줄었다.}