##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);
}
// ...