[DevLog] Maplestory 모작 개발일지 #15
1. 날짜 (Date)
2025/02/27
2. 작업 목표 (Daily Goals)
캐릭터 움직임 속도를 이용하도록 리팩토링
3. 진행 사항 (Progress)
캐릭터의 좌, 우 이동 속도가 다른 문제 해결
4. 문제점 및 해결 방법 (Challenges & Solutions)
-
Rigidbody::Velocity를 조작하여 캐릭터를 움직였을 때, 왼쪽으로는 빠르게, 오른쪽으로는 느리게 이동함
캐릭터를 화면 안으로 조정해주는 과정에서 std::clamp<int>를 사용해서 문제가 발생했다. 위치를 저장하는 Vector2는 내부에 float로 좌표를 저장한다. 또한 현재 프레임 당 캐릭터의 이동 거리는 평균 1.8 정도이다. 처음 x 좌표가 5라고 할 때, 오른쪽으로 이동한 다음 프레임에서의 정확한 위치는 6.8이고, 왼쪽으로 이동한 후의 정확한 위치는 3.2이다. 여기서 int로 템플릿화 된 clamp함수에 인자로 들어가게 되면 오른쪽으로 이동한 후 버려지는 값은 0.8이고, 왼쪽으로 이동한 후 버려지는 값은 0.2이다. 또한 결과 값이 int로 반환되므로, 매 프레임마다 오른쪽으로 이동한 경우 0.8, 왼쪽으로 이동한 경우 0.2 만큼의 거리가 손실된다(0 <= x <= resolution.x). std::clamp<float>로 바꾸거나 이동 거리의 소수점이 0.5 정도 되면 괜찮을까? 아니다. Bitblt 등 렌더링하는 함수는 결국 int형으로 좌표를 입력받기 때문에 소수점값에서 손실이 생겨 std::clamp<float>는 임시방편에 불과하다. 또한 이동 거리의 소수점이 0.5인 경우에도, x의 좌표는 양수에서만 존재하기 때문에 문제가 된다. 다시 처음 위치가 5인 경우를 생각해 보자. 왼쪽으로 0.5 이동한 경우 4.5, 오른쪽으로 0.5 이동한 경우 5.5의 위치가 된다. 이 때, int형으로 암묵적 형변환이 일어나면 전자의 경우 4, 후자의 경우 5가 되므로 정확한 위치의 보장이 어렵다. 더 자연스러운 움직임을 위해, HDC에 그리기 직전에 std::round() 함수로 보정하기로 했다.
5. 다음 단계 (Next Steps)
캐릭터 움직임 속도를 이용하도록 리팩토링
6. 회고 (Reflection)
일찍 일어나서 공부하러 오니까 집중이 잘된다. 오랜만이라 그런가?
생각보다 캐릭터 움직임 구현이 케이스가 많고, 회사 지원이랑 겹쳐서 시간도 많이 잡아먹고 있다. 분발해서 빨리 끝내보자.
Leave a comment