충돌 디버깅
2023. 1. 1. 00:01ㆍ개인공부/Win32API
위의 영상은 플레이어가 객체가 한 개처럼 보이지만 실제로는 2개가 겹쳐있는 형태이다. 만약 플레이어가 미사일을 발사하면 똑같은 속도로 겹쳐서 날아가는데, 이때 몬스터 객체와 충돌한 시점에서 버그가 발생한다. 왜냐하면 2개의 플레이어 미사일이 같은 프레임 내에서 같은 몬스터 객체와 충돌한 시점에 몬스터의 HP가 0이 되면 EventMgr에 몬스터 객체를 2번이나 삭제 요청을 하게 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
void CEventMgr::Excute(const tEvent& _eve)
{
switch (_eve.eEven)
{
case EVENT_TYPE::CREATE_OBJECT:
{
// lParam : Object Adress
// wParam : Group Type
CObject* pNewObj = (CObject*)_eve.lParam;
GROUP_TYPE eType = (GROUP_TYPE)_eve.wParam;
CSceneMgr::GetInst()->GetCurScene()->AddObject(pNewObj, eType);
}
break;
case EVENT_TYPE::DELETE_OBJECT:
{
// lParam : 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:
// lParam : Next Scene Type
CSceneMgr::GetInst()->ChangeScene((SCENE_TYPE)_eve.lParam);
break;
}
}
|
cs |
만약 삭제요청을 2번하면 23번 줄의 조건이 없다면 백터 내에 2번 설정될 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
void CEventMgr::update()
{
// ===================================================
// 이전 프레임에서 등록해둔 Dead Object 들을 삭제한다.
// ===================================================
for (size_t i = 0; i < m_vecDead.size(); ++i)
{
delete m_vecDead[i];
}
m_vecDead.clear();
// ============
// Event 처리
// ============
for (size_t i = 0; i < m_vecEvent.size(); ++i)
{
Excute(m_vecEvent[i]);
}
m_vecEvent.clear();
}
|
cs |
이후에 update단계에서 앞전에 Delete 된 몬스터 객체가 다시 한번 삭제시키는 버그를 발생시키기 때문에 위의 조건으로 몬스터가 죽은 상태인지 확인하여 버그를 수정하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
void CCore::progress()
{
// ==============
// Manager Update
// ==============
CTimeMgr::GetInst()->update();
CKeyMgr::GetInst()->update();
// ============
// Scene Update
// =============
CSceneMgr::GetInst()->update();
// 충돌체크
CCollisionMgr::GetInst()->update();
// ============
// Redering
// ============
// 화면 Clear
Rectangle(m_memDC, -1, -1, m_ptRseolution.x + 1, m_ptRseolution.y + 1);
CSceneMgr::GetInst()->render(m_memDC);
BitBlt(m_hDC, 0, 0, m_ptRseolution.x, m_ptRseolution.y
, m_memDC, 0, 0, SRCCOPY);
CTimeMgr::GetInst()->render();
// ================
// 이벤트 지연처리
// ================
CEventMgr::GetInst()->update();
}
|
cs |
하지만 같은 프레임내에서 발생하는 충돌은 같이 처리가 되어 2개의 발사체가 나가면
HP가 1인적은 0이 되고 ->몬스터 삭제-> 남은총 알은 지나간다 : 가 아니라
HP가 1인적은 0이 되고 ->몬스터 삭제 이벤트 발생 -> 다음 미사일 HP 0 인적은 -1이 되고 -> 몬스터가 삭제 이벤트가 발생한다.
그러므로 같은 프레임내의 충돌로 인해서 2개의 미사일이 남지않고 삭제된다.
'개인공부 > Win32API' 카테고리의 다른 글
Camera (0) | 2023.01.03 |
---|---|
Animation- Component (0) | 2023.01.02 |
충돌 (0) | 2022.12.31 |
빙글빙글 도는 오브젝트 (0) | 2022.12.29 |
Collider (0) | 2022.12.28 |