WIN32API FrameWork/한단계씩 직접 구현

79. 측면 충돌 체크(프레임워크 완성)

hyrule 2022. 6. 16. 16:17

http://hyrule.tistory.com/111 

 

*** 공부 방법 ***

1. 코딩을 해야 하는 부분은 첫 부분에 변수나 함수, 메소드에 대한 선언이 코드블럭으로 표시되어 있다. //ex) MakeFunction(); 2. 코드블럭 하단에는 해당 선언에 대한 구현 로직이 작성되어 있다. 처

hyrule.tistory.com

 


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);
}

정상적으로 측면 충돌이 된다.

 

GameFrameworkStepbyStep_79_Complete.zip
11.06MB