F.R.I.D.A.Y.

물리엔진 - 중력 구현 안정화 본문

DEV/Direct2D

물리엔진 - 중력 구현 안정화

F.R.I.D.A.Y. 2021. 5. 10. 05:36
반응형

 이전 포스트의 마지막 부분에서 문제점 하나를 언급했었죠, 이번 포스트에서는 그 문제점을 해결하는 방법을 풀어봅니다.

 

# Direct2D를 활용합니다.


문제점

 이전 포스트에서 만든 프로그램의 문제는 다음과 같았습니다.

 

바닥에 닿지 않았는데 초기 위치로 돌아가버린다

 

 이 문제는 언급했듯이, 이동 속도가 남은 공간보다 커서 공간을 넘어서다보니 초기 위치로 돌아가도록 명령이 실행됐기 때문입니다.

 

문제 해결하기

 문제점에서 언급한 것처럼 그럼 이동 속도를 조절해주면 되겠네요. 첫 번째 if 구문은 현재 위치에 대한 판단을, 두 번째 if는 다음 위치에 대한 판단을 통해 이동 속도를 조절합니다. 두 if 구문 중 하나만 실행하면 되므로 else 로 묶어서 속도 향상을 꾀합니다.

	if (rcCenter.y + rcSize.height / 2 > clientSize.bottom) {
		rcCenter.y = 40;
		dropSpeed = 0.f;
	}else if (rcCenter.y + rcSize.height / 2 + dropSpeed > clientSize.bottom) {
		float gap = clientSize.bottom - rcCenter.y - rcSize.height / 2;
		dropSpeed = gap;

	}

	rcCenter.y += dropSpeed;

 근데 문제 하나가 있습니다. 이렇게 구현하면 바닥에는 닿지만 초기 위치로 이동을 안합니다. 이는 첫 번째 if 구문의 판정식이 잘못 되었기 때문입니다.

 

 두 번째 if 구문에서 차이만큼만 더했기 때문에 clientSize.bottom의 크기와 rcCenter.y + rcSize.height / 2의 값이 동일하게 되고, 이는 곧 등호가 표시되지 않았기에 판정식이 false가 되어버려 이동하지 않게 됩니다. 따라서 등호를 넣어 판정식이 정상적으로 동작하도록 코드를 수정합니다.

	if (rcCenter.y + rcSize.height / 2 >= clientSize.bottom) {

 

 그럼 더 안정적인 그리기가 가능해집니다.

void MainWindow::Calculate()
{
	static float gravity = 3.f;
	static float dropSpeed = 0.f;
	dropSpeed += gravity;

	if (rcCenter.y + rcSize.height / 2 >= clientSize.bottom) {
		rcCenter.y = 40;
		dropSpeed = 0.f;
	}
	
	else if (rcCenter.y + rcSize.height / 2 + dropSpeed > clientSize.bottom) {
		float gap = clientSize.bottom - rcCenter.y - rcSize.height / 2;
		dropSpeed = gap;

	}

	rcCenter.y += dropSpeed;
}

 

# index

728x90
반응형

'DEV > Direct2D' 카테고리의 다른 글

물리엔진 - 점프 구현하기  (0) 2021.05.13
물리엔진 - 벽 충돌 part1. 바닥 구현  (0) 2021.05.11
물리엔진 - 중력 구현  (0) 2021.05.10
Direct2D - SetTransform  (0) 2021.05.05
Direct2D - WIC IWICBitmapFlipRotator  (0) 2021.05.04
Comments