일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- c#
- Windows
- 프로그래밍
- Programming
- Win32
- Direct2D
- 포인터
- Javascript
- c
- Tips강좌
- VS ERROR
- Desktop
- 지식나눔강좌
- 문법
- 배열
- 리뷰
- CS
- Tips프로그래밍강좌
- tipssoft
- 연산자
- 티스토리
- 함수
- Visual Studio
- Kotlin
- 백준
- 이지스퍼블리싱
- 알고리즘
- 김성엽
- doit코틀린프로그래밍
- c++
- Yesterday
- Today
- Total
F.R.I.D.A.Y.
물리엔진 - 벽 충돌 part2. 좌우 벽 구현 본문
위 시리즈와 연계해 작성합니다. 프로젝트 코드는 다음에서 이어집니다.
좌우 벽 충돌
플래시 게임 등에서 바닥을 형성한 것 외에 추가로 구현한 것이 있습니다. 좌우로 벽을 만났을 때 캐릭터가 이동하지 못하도록 하는 것입니다. 이것 또한 Calculate 메서드에서 처리하면 구현할 수 있습니다.
<벽 충돌 part.1 바닥 구현>과 방향만 다르지 동일한 내용이기 때문에 해당 코드를 참고해 역으로 계산하면 수비게 코드를 작성할 수 있습니다.
또한, 좌우 이동은 서로 상반된 명령이기 때문에 연산 간소화를 위하 처음에 분기를 통해 연산 규모를 줄입니다.
if(moveSpeed < 0.f){
}
위 분기는 캐릭터가 좌측으로 움직이려할 때의 연산입니다. 그 안에 추락하는 코드와 유사하게 코드를 작성해주면 됩니다.
if (moveSpeed < 0.f) {
for (size_t i = 0; i < cGround; ++i) {
if (!(ground[i].top < rcCenter.y + rcSize.height / 2.f &&
rcCenter.y - rcSize.height / 2.f < ground[i].bottom)) continue;
// y축 위치가 맞지 않는 애들 제외
if (rcCenter.x - rcSize.width / 2.f < ground[i].right) continue;
// 위치보다 우측에 있는것들 제외
if (abs(ground[i].right - rcCenter.x - rcSize.width / 2.f) < 0.001f) {
// 맡닿은 벽이 있으면 중단 중단
moveSpeed = 0.f;
break;
}
if (rcCenter.x - rcSize.width / 2.f + moveSpeed < ground[i].right) {
// 이동속도보다 간격 없으면 그 차이를 이동속도로 수정
float gap = ground[i].right - rcCenter.x + rcSize.width /2.f;
moveSpeed = gap;
}
}
}
이 코드에서는 바닥으로 작용하는 벽은 상관하지 않는데, 두 번째 if 분기에서 벽의 우측 값이 현재 위치보다 높기때문에 알아서 빠져나갑니다.
이 코드를 구현하면 아래 영상에서 보는 것과 같이 좌측에서 우측으로 갈 때는 벽을 무시하지만, 우측에서 좌측으로 갈 때는 벽의 영향을 받는다는 것을 알 수 있습니다.
좌측에서 우측으로 이동하는 것에도 영향을 주려면 우측에서 좌측으로 이동하는 코드에 반대로 동작하면 됩니다.
if (moveSpeed < 0.f) {
...
}
else if(moveSpeed > 0.f) {
for (size_t i = 0; i < cGround; ++i) {
if (!(ground[i].top < rcCenter.y + rcSize.height / 2.f && rcCenter.y - rcSize.height / 2.f < ground[i].bottom)) continue;
// y축 위치가 맞지 않는 애들 제외
if (ground[i].left < rcCenter.x + rcSize.width / 2.f) continue;
if (abs(rcCenter.x + rcSize.width / 2.f - ground[i].left) < 0.001f) {
moveSpeed = 0.f;
break;
}
if (ground[i].left < rcCenter.x + rcSize.width / 2.f + moveSpeed) {
float gap = ground[i].left - (rcCenter.x + rcSize.width / 2.f);
moveSpeed = gap;
}
}
}
동일한 방식으로 위쪽으로 점프할 때 벽을 만나면 통과하지 못하도록 구성할 수 있습니다.
생각해보기
해당 포스트의 코드와 함께 구현을 했다면, 특정 상황[# 찾아보세요 :)]에서 벽으로 인식한 대상을 넘어서는 문제가 발생합니다. 해당 문제는 이동하는 곳의 시점을 정확하게 체크하지 않고, 한 곳[# 위에서 아래로 내려오는 것에 대한 구현을 하지 않았기 때문이 아닙니다.]을 빠트렸기 때문에 발생합니다.
# index
'DEV > Direct2D' 카테고리의 다른 글
지뢰찾기 - 그리기 툴 (0) | 2021.07.03 |
---|---|
지뢰찾기 (0) | 2021.06.28 |
물리엔진 - 좌우 이동 (0) | 2021.05.14 |
물리엔진 - 점프 구현하기 (0) | 2021.05.13 |
물리엔진 - 벽 충돌 part1. 바닥 구현 (0) | 2021.05.11 |