제거,추가 등 일어난 Event들을 프레딤 단위로 동결 해야한다.
프로그램 실행 중 갑자기 제거하면
그걸 참조 하고있던 포인터들은 갑자기 nullptr을 가르키는 것과 같은
동결 시키지 않으면 많은 문제가 생긴다.
제거 이벤트때 필요한 것
일어난 프레임에선 이벤트를 발생 시키지 않고
다음 프레임에서 일어날거라고 미리 알려준다
다음프레임에서 이벤트가 발생
추가
제거
화면 전환
등등
이벤트를 추가->업데이트 (추가된 이벤트를 이벤트 타입에 따른 실행)
void CEventMgr::AddEvent(tEvent _even)
{
m_vecEvent.push_back(_even);
}
void CEventMgr::update()
{
/*====================================
이전프레임에서 등록해둔 Dead Obj를 삭제
==================================== */
for (size_t i = 0; i < m_vecDead.size(); ++i)
{
if(m_vecDead[i]!=nullptr)
delete m_vecDead[i];
for (int j = 0; j < (int)GROUP_TYPE::END; ++j)
{
vector<CObject*>& vec = CSceneMgr::GetInst()->Get_pCurScene()->Get_vecpobj((GROUP_TYPE)j);
for (int k = 0; k < (int)vec.size(); ++k)
{
if (vec[k] == m_vecDead[i])
vec.erase(vec.begin() + k);
}
}
/*====================================
Evemt 처리
==================================== */
for (size_t i = 0; i < m_vecEvent.size(); ++i)
{
Excute(m_vecEvent[i]);
}
m_vecEvent.clear();
}
타입에 따라 실행
void CEventMgr::Excute(const tEvent& _eve)
{
switch (_eve.eEven)
{
case EVENT_TYPE::CREAT_OBJECT:
//lParam:Object Adress
//wParam:GrouP type
{
CObject* pNewobj = (CObject*)_eve.lParam;
GROUP_TYPE eType = (GROUP_TYPE)_eve.wParam;
CSceneMgr::GetInst()->Get_pCurScene()->AddObject(pNewobj, eType);
}
break;
case EVENT_TYPE::DELETE_OBJECT:
{
//iParam:Object Adress
//Object를 Dead 상태로 변경
//삭제 예정 오브젝트들을 모아둔다
CObject* pDeadObj = (CObject*)_eve.lParam;
if (!pDeadObj->IsDead())
{
pDeadObj->SetDead();
m_vecDead.push_back(pDeadObj);
}
}
break;
case EVENT_TYPE::SCENE_CHANGE:
{
//lparnm:Next Scene Type
CSceneMgr::GetInst()->ChangeScene((SCENE_TYPE)_eve.lParam);
}
break;
}
}
DWORW_PTR
플랫폼 종류에 따라 솔루션이 4 or 8byte 로 정해줌
제거 이벤트를 제외한
다른이벤트들은 rendering 까지 끝난후에 이벤트를 처리하면된다
다른 이벤트들과 달리
처음 말했듯이 삭제 할거라고 트리거를 시켜주고
그 다음 프레임에 트리거된 obj들을 삭제 해야 함
삭제 예정 obj들을 모아둔 다음
다음 프레임에 제거 처리
case EVENT_TYPE::DELETE_OBJECT:
{
//iParam:Object Adress
//Object를 Dead 상태로 변경
//삭제 예정 오브젝트들을 모아둔다
CObject* pDeadObj = (CObject*)_eve.lParam;
if (!pDeadObj->IsDead())
{
pDeadObj->SetDead();
m_vecDead.push_back(pDeadObj);
}
}
Scene에서 죽은 취급된 obj는 update를 하지 않는다
finalupdate는 진행한다
죽은 obj는 render을 진행 하지 않는다
라면 충돌이 끝난 상태라고 한다
if (IsCollision(pLeftCol, pRightCol))
{ //현재 충돌 중이다
if (iter->second)//이전 충돌
{
if (vecLeft[i]->IsDead() || vecRight[j]->IsDead())
{
pLeftCol->OnCollisionExit(pRightCol);
pRightCol->OnCollisionExit(pLeftCol);
}
}
}