class CGameObject
- 물리 시뮬레이션 && 좌,우측 이동량이 감지되었을 때만 작동한다.
- 우측 이동/좌측 이동 두 상황으로 나눈다.
- 로직은 착지 알고리즘과 비슷하다.
1. 이전 위치와 현재 위치를 연결한 사각형을 만든다.(위 이미지 참고)
2. 지나온 지점에 있었던 타일들을 모조리 구한다.
3. 이동 불가 타일이 있었는지 순회를 돌며 확인을 한다.
-- 타일 주소를 받는다.
-- 해당 타일이 이동 불가 타일이나 측면 충돌 체크 타일이 아닐 경우 continue.
-- 캐릭터가 밟고 있는 타일에 대해서는 체크 x(continue)
--- 밟고 있는 타일에 대해서 체크하면 이런 턱에서 걸릴수도 있음
--- 타일의 Pos.y에서 0.001정도 더한 값에서,
구한 사각형의 RB.y에서 0.001 정도 뺀 값보다 큰 경우 continue 해 주면 됨.
---- 부동소수점의 오차 방지를 위해서 빼주는 것임
-- 이후 위치관계를 확인한다.
-- 위처럼 충돌이 확인되었을 경우,
-- 충돌한 게임오브젝트를 다시 겹치는 만큼 반댓쪽으로 밀어 준다.
-- 이동량도 그만큼 감소해야 하므로 이동량도 밀어 준만큼 뺴준다.
-- 여기서 충돌처리가 되었으면 다른 타일은 더이상 체크할필요가 없으므로 모든 반복문을 빠져나간다.(break)
class CPlayer
- 현재 플레이어의 좌/우 애니메이션 재생 판정은 '이동량'으로 확인하고 있다.
- 그런데, 측면 충돌 처리 과정에서 충돌이 일어났을 경우 다시 반대 방향으로 밀어내고 있다.
--> 그래서 이런 현상이 발생한다.
//왼쪽을 보고 있는데
if (!m_isRightDir)
{
//움직임이 오른쪽으로 생겼다면
if (m_MoveDist.x > 0)
{
m_isRightDir = true;
SetPivot(0.f, 1.f);
}
}
else
{
//반대의 경우
if (m_MoveDist.x < 0)
{
m_isRightDir = false;
SetPivot(1.f, 1.f);
}
}
- 이 코드가 문제였다.
- 플레이어 애니메이션을 이동량에 따라서 변경하는 것이 아닌, 키 입력에 따라서 변경되도록 코드를 수정해 준다.
--> 키 입력시 호출되는 콜백 메소드로 이 코드를 옮겨 준다.
void CPlayer::MoveLeft()
{
m_isRightDir = false;
SetPivot(1.f, 1.f);
SetDir(-1.f, 0.f);
MoveDir(m_Dir);
}
void CPlayer::MoveRight()
{
m_isRightDir = true;
SetPivot(0.f, 1.f);
SetDir(1.f, 0.f);
MoveDir(m_Dir);
}
정상적으로 측면 충돌이 된다.
'WIN32API FrameWork > 한단계씩 직접 구현' 카테고리의 다른 글
78. 바닥 충돌 체크 (0) | 2022.06.16 |
---|---|
77. 타일맵 에디터 8: Save & Load 3 (0) | 2022.06.15 |
76. 타일맵 에디터 7: Save & Load 2 - 문제 해결 (0) | 2022.06.15 |
75. 타일맵 에디터 6: 빈 타일, 배경화면 설정 (0) | 2022.06.14 |
74. 타일맵 에디터 5: Save & Load (0) | 2022.06.14 |