*** 공부 방법 ***
1. 코딩을 해야 하는 부분은 첫 부분에 변수나 함수, 메소드에 대한 선언이 코드블럭으로 표시되어 있다. //ex) MakeFunction(); 2. 코드블럭 하단에는 해당 선언에 대한 구현 로직이 작성되어 있다. 처
hyrule.tistory.com
- 이제 게임오브젝트들간의 충돌을 계산하는 '충돌체' 처리를 구현할 단계이다.
- 일단은 가장 느리지만 단순한 방법으로 충돌 처리를 구현한다.
-- 한 충돌체에 대하여 다른 나머지 모든 충돌체들과의 충돌 여부를 계산한다.
cf)충돌 처리는 계산 자원을 많이 잡아먹는 과정이기에 최적화가 많이 필요하다. 나중에 가면 '공간분할'이라는 방법을 통해 충돌을 계산할 예정.
flag.h
< enum class ECollisionChannel >
- 충돌체는 자신이 어떤 충돌체와 충돌했을 때 반응할 것인지에 대한 정보를 가지고 있어야 한다.
- 자신이 쏜 총알에 아군이 맞거나, 적이 쏜 총알에 적이 죽거나 하는 등의 일은 없어야 한다.
- Default, Player, Monster, PlayerAttack, MonsterAttack, Max 정도로 구분해 주자
< enum class ECollisionInteraction >
- 충돌 '타입'
- Ignore: 무시
- Collision: 충돌
GameInfo.h
< struct CollisionProfile >
- 위의 열거체를 가지고 있는 구조체 -> 사전에 설정해서 저장해놓고 불러다가 쓰기 위한 용도
- std::string Name: 문자열
- ECollisionChannel Channel
- bool Enable: 해당 프로파일 처리를 활성화할것인지 말것인지.
- std::vector<ECollisionInteraction> vecCollisionInteraction: 위의 충돌 채널 열거체를 인덱스로 써서, 해당 채널에 대해 충돌인지 아닌지를 저장하기 위한 배열 -> 생성자에서 미리 프로필 채널의 최대 크기만큼 확보해놓는다.
class CCollisionManager
- 충돌체 관리자
- 충돌체는 씬별로 관리되어야 하므로, 실제 충돌체 업데이트는 CSceneCollision 클래스를 만들어 별도로 관리해 줄 예정.
- 여기에서는 충돌체 프로파일 목록을 관리한다.
- 싱글턴 패턴으로 선언 및 정의, CGameManager에서 생성, 초기화 및 제거
< m_mapProfile >
- unoredred map
- Key로 이름(문자열) 사용. Value는 CollisionProfile 포인터.
< CollisionProfile* FindProfile() >
- 인자로 이름(문자열)을 받아 map에서 찾아 값을 반환해주는 메소드
< bool CreateProfile() >
- 이름와 CollisionProfile의 멤버 변수를 인자로 받아 CollisionProfile을 만들고 넣어준다.
- 인자로 들어온 CollisionInteraction값은 기본값을 Collision으로 설정해 주고, 이 인자로 들어온 값을 모든 Channel에 대해 일괄로 설정해준다.
< bool SetCollisionInteraction() >
- 문자열 이름과 CollisionProfile 열거체의 원소, CollisionInteraction을 인자로 받아 해당 CollisionProfile의 값을 바꿔 준다.
class CCollisionManager
- 초기화 함수에서 CreateProfile() 메소드를 통해 프로필별 기본 충돌 프로필을 하나씩 등록시켜 주자.
-- Default, Player, Monster, PlayerAttack, MonsterAttack
- SetCollisionInterAction() 메소드를 통해 충돌 채널에 대한 충돌 판정을 입맛대로 설정해준다.
CreateProfile("Default", ECollision_Channel::Default, true);
CreateProfile("Player", ECollision_Channel::Player, true, ECollision_Interaction::Ignore);
CreateProfile("Monster", ECollision_Channel::Monster, true, ECollision_Interaction::Ignore);
CreateProfile("PlayerAttack", ECollision_Channel::PlayerAttack, true, ECollision_Interaction::Ignore);
CreateProfile("MonsterAttack", ECollision_Channel::MonsterAttack, true, ECollision_Interaction::Ignore);
SetCollisionInteraction("Player", ECollision_Channel::Default, ECollision_Interaction::Collision);
SetCollisionInteraction("Player", ECollision_Channel::MonsterAttack, ECollision_Interaction::Collision);
SetCollisionInteraction("Player", ECollision_Channel::Monster, ECollision_Interaction::Collision);
SetCollisionInteraction("Monster", ECollision_Channel::Default, ECollision_Interaction::Collision);
SetCollisionInteraction("Monster", ECollision_Channel::PlayerAttack, ECollision_Interaction::Collision);
SetCollisionInteraction("Monster", ECollision_Channel::Player, ECollision_Interaction::Collision);
SetCollisionInteraction("PlayerAttack", ECollision_Channel::Default, ECollision_Interaction::Collision);
SetCollisionInteraction("PlayerAttack", ECollision_Channel::Monster, ECollision_Interaction::Collision);
SetCollisionInteraction("MonsterAttack", ECollision_Channel::Default, ECollision_Interaction::Collision);
SetCollisionInteraction("MonsterAttack", ECollision_Channel::Player, ECollision_Interaction::Collision);
'WIN32API FrameWork > 한단계씩 직접 구현' 카테고리의 다른 글
43. 충돌 처리 3 - 충돌체 2 (0) | 2022.05.30 |
---|---|
43. 충돌 처리 2 - 충돌체 1 (0) | 2022.05.30 |
41. 카메라 (0) | 2022.05.29 |
40. Y Sort Rendering (0) | 2022.05.28 |
39. 배경화면 생성 및 플레이어 이동 (0) | 2022.05.28 |