##6. 유도미사일 / 사각형 충돌 / 중재자 패턴 / 싱글톤 패턴
2020. 8. 24. 15:24ㆍ프로그래밍/Win32 API
유도미사일
void CBullet::TraceGuidedTarget()
{
if (!m_pGuidedTarget || m_pGuidedTarget->IsDead())
{
m_type = BULLET::TYPE::DEFAULT;
return;
}
float disXPos = m_pGuidedTarget->Get_Info().fX - m_info.fX;
float disYPos = m_pGuidedTarget->Get_Info().fY - m_info.fY;
float diaSquared = disXPos * disXPos + disYPos * disYPos;
if (diaSquared > m_info.fSpeed * m_info.fSpeed)
{
float hypotenuse = sqrtf(diaSquared);
float fRadFront = acosf(disXPos / hypotenuse);
if (disYPos > 0.f)
fRadFront = 2 * PI - fRadFront;
m_info.fX += m_info.fSpeed * cosf(fRadFront);
m_info.fY -= m_info.fSpeed * sinf(fRadFront);
m_info.fAngle = fRadFront * 180.f / PI;
}
}
사각형 충돌 체크
bool CCollisionMgr::CheckRect(const CObj& _obj1, const CObj& _obj2, float* _xOffset, float* _yOffset)
{
float fDisX = abs(_obj1.Get_Info().fX - _obj2.Get_Info().fX);
float fDisWidth = (float)(_obj1.Get_Info().iWidth >> 1) + (_obj2.Get_Info().iWidth >> 1);
float fDisY = abs(_obj1.Get_Info().fY - _obj2.Get_Info().fY);
float fDisHeight = (float)(_obj1.Get_Info().iHeight >> 1) + (_obj2.Get_Info().iHeight >> 1);
if (fDisX < fDisWidth && fDisY < fDisHeight)
{
*_xOffset = fDisWidth - fDisX;
*_yOffset = fDisHeight - fDisY;
return true;
}
return false;
}
void CCollisionMgr::SetNoMove(const vector<CObj*>& _dst, vector<CObj*>& _src)
{
float xOffset = 0.f, yOffset = 0.f;
for (auto& Dst : _dst)
{
for (auto& Src : _src)
{
if (CheckRect(*Dst, *Src, &xOffset, &yOffset))
{
if (xOffset > yOffset)
{
if (Dst->Get_Info().fY < Src->Get_Info().fY)
Src->Accumulate_YPos(yOffset);
else
Src->Accumulate_YPos(-yOffset);
}
else
{
if (Dst->Get_Info().fX < Src->Get_Info().fX)
Src->Accumulate_XPos(xOffset);
else
Src->Accumulate_XPos(-xOffset);
}
}
}
}
}
중재자 패턴(Mediator Pattern)
모든 클래스간의 복잡한 로직(상호작용)을 캡슐화하여 하나의 클래스에 위임하여 처리하는 패턴
M:N의 관계에서 M:1의 관계로 복잡도를 떨어뜨려 유지보수 및 재사용의 확장성에 유리하다
싱글톤 패턴(Singleton Pattern)
프로그램이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고(static) 그 메모리에 인스턴스를 만들어 사용하는 패턴
생성자를 private로 선언하여 개체 생성을 막음
인스턴스가 절대적으로 한 개만 존재하도록 보장하고 싶을 경우 사용
싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스 간에 결합도가 높아지는 문제
// CObjMgr.h
class CObj;
class CObjMgr
{
private:
CObjMgr();
~CObjMgr();
public:
void Init();
void Update();
void LateUpdate();
void Render(HDC _DC);
void Release();
static CObjMgr* GetInstance();
static void DestroyInstance();
//...
private:
static CObjMgr* m_pInstance;
vector<CObj*> m_vecObj[OBJ::ID_END];
//...
};
#define g_ObjMgr CObjMgr::GetInstance()
// CObjMgr.cpp
// ...
CObjMgr* CObjMgr::m_pInstance = nullptr;
CObjMgr * CObjMgr::GetInstance()
{
if (!m_pInstance)
m_pInstance = new CObjMgr;
return m_pInstance;
}
void CObjMgr::DestroyInstance()
{
SAFE_DELETE(m_pInstance);
}
// ...
'프로그래밍 > Win32 API' 카테고리의 다른 글
##8. 비트맵 / 더블 버퍼링 / FSM / 스프라이트 / Scene 전환 (0) | 2020.09.15 |
---|---|
##7. 라인태우기 / KeyMgr / 점프 (0) | 2020.09.15 |
##5. 삼각함수 (0) | 2020.08.20 |
##4. 탱크 만들기 (0) | 2020.08.18 |
##3. 충돌체크 / 추상팩토리패턴 / 컨테이터 순차접근 / 문자열출력 (0) | 2020.08.17 |