본문 바로가기

Win32 API44

Win32 API 기초 : Event Manager (2) 이벤트 매니저를 통한오브젝트의 생성과 제거를 구현하겠습니다. CEventMgr 클래스의 헤더 파일을 보시면 vector형 멤버 m_vecDeadObj가 추가되었습니다. 해당 멤버는 제거될 예정인 오브젝트를 저장하는 vector이죠. 생성되는 오브젝트와 다르게, 제거할 오브젝트는 따로 보관하고 있죠. 이유는 만약 현재 프레임이 58 프레임이고오브젝트 1이 제거되었다고 합시다. 그래서 58 프레임 마지막 순간에 오브젝트 1을 제거하고이를 다음 프레임인 59 프레임에 적용시키려고 합니다. 이때 문제가 될 수 있는 점은 오브젝트 1과 관련된다른 오브젝트들은 오브젝트 1이 제거된 사실을 59 프레임 때 모른다는 것이죠. 그래서 관련된 오브젝트들이 오브젝트 1에 접근하려고하면 실제로는 제거가 되었으므로 문제가 발생.. 2024. 8. 15.
Win32 API 기초 : Collider 활용 & Event Manager (1) 충돌 여부를 판정할 수 있는 함수를 구현했는데,실제 충돌 후 발생하는 동작은 오브젝트마다다를 수 있습니다. 즉 충돌이 발생한 경우 오브젝트마다다 다르게, 충돌 이벤트를 구현해야 하는 것이죠. 예를 들어 플레이어가 몬스터가 발사하는미사일에 맞았을 때 10의 데미지를 받고,플레이어가 몬스터와 직접 닿았을 때는30의 데미지를 받으며 밀려나는 동작을 수행하고 싶습니다. 첫 상황은 플레이어의 Collider와몬스터 미사일의 Collider와의 충돌이고,두 번째 상황은 플레이어의 Collider와몬스터의 Collider와의 충돌이죠. 그렇다고 이것을 구현하기 위해 Collider 클래스를 파생시켜플레이어 타입의 Collider 자식 클래스를,몬스터 타입의 Collider 자식 클래스,미사일 타입의 Collider .. 2024. 8. 11.
Win32 API 기초 : Collider (6) 두 오브젝트의 Collider가충돌했다는 판정을 어떻게 할 수 있을까요?  위 그림과 같이 두 Collider가 충돌하고 있는상황이라고 가정해 봅시다. 왼쪽 Collider의 가로의 총 길이는 10,오른쪽 Collider의 가로의 총 길이도 10이라고 하죠. 각 Collider의 총 가로 길이를 절반으로 나누고더하면 10이 나오죠? 여기서 각 Collider의 x 좌푯값을 뺀 값이10보다 작다면 두 Collider는 충돌하고 있다고 볼 수 있다는 것이죠. 물론 y 좌푯값도같은 조건을 충족해야 정말 충돌하고 있다고확정 지을 수 있겠죠.  아래 그림처럼 두 Collider의 x 좌푯값을 서로 뺐을 때10 이상이라면 충돌하고 있지 않은 것입니다.  이러한 조건 체크를 콜리전 매니저의 멤버 함수인  IsColl.. 2024. 8. 10.
Win32 API 기초 : Collider (5) Collider끼리 복사가 발생할 수 있습니다. Collider A의 값을 기반으로 Collider B를 생성할 수도 있는 것이죠. 그러나 조심해야 할 점이 있는데,기본 복사 생성자를 통해 복사를 진행하면Collider마다 갖고 있는 고유한 값인 멤버 m_iID의값도 복사시킬 것이고 각 Collider가 어떤 오브젝트에달려있는지 나타내는 멤버 m_pOwner의 값도그대로 복사하게 되는 문제가 생기죠. 그래서 아래 코드처럼 Collider의 복사 생성자를 직접 구현하여기본 복사 생성자가 아닌 위에서 구현한 생성자가 호출되도록 할 것입니다. 복사가 발생하더라도 멤버 m_pOwner의 값은무조건 nullptr로 초기화, 멤버 m_iID의 값은정적 변수인 g_iNextID에서 하나 올린 값으로초기화하면 문제가 .. 2024. 8. 5.
Win32 API 기초 : Collider (4) Start 씬에서 두 개의 그룹을 받으면그 두 그룹은 서로 충돌 가능한 그룹으로 볼 것입니다. 그래서 Start 씬을 세팅하기 위한 함수 Enter의 46번째 줄에 있는 코드를 보시면콜리전 매니저가 플레이어와 몬스터 그룹을인자로 받는 CheckGroup 함수를 호출하고 있죠.  CheckGroup 함수는 콜리전 매니저의 멤버 함수로  두 그룹을 인자로 받습니다. 일단 왼쪽 인자를 행으로,오른쪽 인자를 열로 봅니다. 근데 두 값을 비교했을 때왼쪽의 값이 더 크다면왼쪽 인자의 값을 열로,오른쪽 인자의 값을 행으로 보게 됩니다. 즉 더 작은 값을 행으로, 큰 값을 열로 하는 거죠.  그리고 n번 행과 1을 열의 값만큼시프트 연산한 값을 & 연산합니다. 이 연산의 의미는 만약  n번 행에특정 그룹이 이미 충돌하.. 2024. 8. 4.
Win32 API 기초 : Collider (3) CPlayer 클래스의 생성자가 호출되면, 즉 플레이어가 생성될 때 Collider를 만들죠. Collider의 크기는 설정해 주었으니 22번째 줄에 있는 SetColliderOffset 함수를 통해오브젝트 위치로부터 얼마만큼 떨어진 위치에Collider를 위치시킬 것인지 설정해 줍니다.     몬스터가 생성될 때에도 몬스터에 Collider를 붙여줍시다. 마찬가지로 Collider의 Offset을 설정해 주고,23번째 줄에 있는 SetColliderSize 함수를 통해크기를 설정해 줍니다.  그리고 몬스터의 render 함수에도 component_render 함수를 호출하여몬스터 오브젝트에 Collider가 있다면Collider도 윈도우 창에 그릴 수 있도록 해야겠죠.  몬스터( 분홍 상자 )와 플레이.. 2024. 7. 28.