버그 발생 과정


오브젝트와 충돌 처리 후 미끄러짐 효과를 구현하던 중 속도에 따라 어떤 속도는 지나가지고 어떤 속도는 지나갈 수 없는 버그가 생겼다.

내가 정한 캐릭터의 내부 속도단위는 16x16 기준 1000을 곱한 16000x16000이다. 그리고 중심점을 기준으로 해서 16000 x 16000 + 8000이 현재 캐릭터가 위치한 내부 좌표가 된다.

가령 현재 좌표에서 오른쪽으로 이동했을 때 충돌이 발생했을 경우 자신의 위치 지점에서 충돌박스를 위 아래로 두 개 생성해 각각 위아래로 캐릭터의 반지름만큼 더해 방금 충돌한 객체를 지나칠 수 있는 방향이 어디인지 알아낸다. 만약 충돌한 객체의 위 방향에 위치할 경우 위쪽으로 미끄러지게끔 할 수 있다. 미끄러지는 속도는 현재의 캐릭터 속도에 비례한다.

하지만 캐릭터 기본 속도 1000 기준으로 900이나 1200같은 100단위의 속도에서는 미끄러지지 못하고 다른 칸에 있는 객체와 이중으로 겹쳐 재 충돌하는 문제가 발생해서 갇히는 버그가 생겼다. 해당 버그를 해결하기위해서 캐릭터의 크기를 줄여보거나 속도의 변경을 제한을 뒀지만 이는 임시적인 해결책일 뿐 근본적인 해결이 되지 못했다.

버그 해결

내부 속도 단위 검사를 했던 것이 버그의 원인이었다.
예를들어, 캐릭터는 Y좌표 3000에 있고 속도는 900이라고 하자. 오른쪽으로 이동하려는 순간 충돌이 발생한다. 맞은편 충돌한 객체의 좌표는 5000이고 Y좌표에 반지름을 8000더하면 충돌한 객체를 피해갈 수 있으므로 900의 속도로 아래로 미끄러지게 된다. 이때 캐릭터의 좌표는 3900이 되버리낟. 만약 이렇게 미끄러지다가 라인을 발견하면 그 라인을 타서 이동이 가능하게 해야한다. 하지만 다음 라인에 있는 충돌 객체의 위쪽면이 11000이라면 캐릭터가 미끄러진 방향의 대한 좌표가 11900이되서 다시 충돌이 발생하게 된다. 그럼 다시 위로 미끄러지고 이 과정이 반복되어 길을 지나가지 못하고 위치가 흔들리는 버그가 생기게된다


해결은 충돌을 검사할 때 일정 속도를 가지고 이동하는 객체는 충돌 검사를 시도할 때 내부 단위에 대한 소수점은 전부 버리면 된다.

보통 속도 ( 이동속도 1000 )

느린 속도 ( 이동속도 500 )