Event Manager

김태훈·2024년 1월 9일
0

Win32API

목록 보기
13/24
post-custom-banner

Evenet manager

제거,추가 등 일어난 Event들을 프레딤 단위로 동결 해야한다.
프로그램 실행 중 갑자기 제거하면
그걸 참조 하고있던 포인터들은 갑자기 nullptr을 가르키는 것과 같은
동결 시키지 않으면 많은 문제가 생긴다.

지연처리

제거 이벤트때 필요한 것
일어난 프레임에선 이벤트를 발생 시키지 않고
다음 프레임에서 일어날거라고 미리 알려준다
다음프레임에서 이벤트가 발생

Event type

추가
제거
화면 전환
등등

이벤트를 추가->업데이트 (추가된 이벤트를 이벤트 타입에 따른 실행)

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을 진행 하지 않는다

현재 충돌중이고, 이전에도 충돌이었지만 둘중 하나라도 dead상태

라면 충돌이 끝난 상태라고 한다

	if (IsCollision(pLeftCol, pRightCol))
		{  //현재 충돌 중이다
			
					
				if (iter->second)//이전 충돌
				{   

					if (vecLeft[i]->IsDead() || vecRight[j]->IsDead())
					{
						pLeftCol->OnCollisionExit(pRightCol);
						pRightCol->OnCollisionExit(pLeftCol);

					}

				}
			}
profile
복습을 위한 핵심 내용 및 모작
post-custom-banner

0개의 댓글