일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Javascript
- doit코틀린프로그래밍
- 지식나눔강좌
- 김성엽
- 리뷰
- Visual Studio
- CS
- c#
- Windows
- Programming
- 포인터
- c
- 티스토리
- 배열
- Direct2D
- Desktop
- Tips프로그래밍강좌
- tipssoft
- Win32
- c++
- 알고리즘
- 문법
- 백준
- 프로그래밍
- Tips강좌
- 이지스퍼블리싱
- VS ERROR
- 함수
- 연산자
- Kotlin
Archives
- Yesterday
- Today
- Total
F.R.I.D.A.Y.
물리엔진 - 중력 구현 안정화 본문
반응형
이전 포스트의 마지막 부분에서 문제점 하나를 언급했었죠, 이번 포스트에서는 그 문제점을 해결하는 방법을 풀어봅니다.
# 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