
개발 · 출시 · 약 5분
몬스터가 몰릴 때 좌우로 떨리는 이유: 이동·방향·표시를 나누어 검사하기
던전즈 앤 나이츠의 벽·군중 경계에서 발생한 방향 반복 전환을 바탕으로, 실제 경로 진행과 순간적인 자세 변경을 따로 검증하는 방법을 정리합니다.
Wolfgadeok · 업데이트
방향을 고정하면 떨림은 가려져도 길 막힘은 남는다
몬스터가 많아지면 목표를 향한 이동, 서로 밀리지 않기 위한 군중 보정, 벽의 충돌 보정이 같은 프레임에 작용합니다. 최종 좌표가 오른쪽으로 아주 조금 움직였다는 이유만으로 오른쪽을 보고, 다음 프레임의 작은 왼쪽 보정에 다시 반전하면 화면에서는 좌우로 빠르게 떨립니다. 이때 반전만 막아 버리면 보기에는 조용해져도 몬스터가 벽 뒤에서 영원히 내려오지 못하는 문제가 남을 수 있습니다.
던전즈 앤 나이츠에서는 실제 좌표의 변화와 바라보는 방향을 구분합니다. 일반 보행의 방향 후보는 군중·충돌이 만든 미세한 최종 변위보다 계획한 이동을 기준으로 삼습니다. 경로 또는 장애물 경계 근처에는 별도의 작은 방향 유지 범위를 두고, 계속 추격하거나 측면으로 이동하는 중의 반대 방향 의도는 120ms 유지될 때 반영합니다. 최초 방향과 공격 방향까지 일괄적으로 늦추는 처리는 하지 않습니다.
- 같은 몬스터의 목표점, 계획 이동, 충돌 후 실제 변위, 최종 facing을 한 시간축에 기록합니다.
- 보행 중 좌우 반전과 공격을 시작하며 상대를 바라보는 전환을 구분하여 집계합니다.
- 반전 횟수가 줄어든 뒤에도 몬스터가 통로를 지나 목표 쪽으로 실제로 전진하는지 확인합니다.
한두 픽셀 왕복을 정상적인 전진으로 착각하지 않기
대각선 장애물의 표면에서는 앞으로 한 픽셀 미끄러졌다가 다시 뒤로 밀리는 움직임이 반복될 수 있습니다. 총 이동 거리만 보면 계속 움직이므로 정체 타이머가 초기화되지만, 시작점과 현재점 사이의 순이동은 거의 없습니다. 현재 이동 루틴은 의도한 방향으로 실제 변위가 얼마나 진행했는지 투영하여 검사하고, 여전히 벽에 제약받는 작은 진행은 정체 시간을 즉시 지우지 않고 점진적으로 줄입니다. 막힘이 누적되면 기존 우회 경로 탐색이 작동할 수 있게 하는 방식입니다.
타일의 공유 경계에서도 충돌 판정과 경로 탐색의 해석이 같아야 합니다. 충돌은 열린 쪽 경계를 허용하는데 경로 탐색이 floor()로 막힌 이웃 셀만 선택하면 도달 불가로 잘못 판단할 수 있습니다. 이 게임은 현재 점에서 실제로 연결되는 이동 가능 셀을 찾고, 셀 사이 구간도 이동 가능 여부를 검사합니다. 막힌 타일을 열거나 충돌을 건너뛰는 것으로 몬스터를 통과시키지는 않습니다.
짧은 군중 정지와 실제 대기를 다른 표시로 다룬다
경로가 정상이어도 앞 몬스터를 기다리는 한두 프레임 동안 상태가 walk → idle → walk로 바뀔 수 있습니다. 이때 대기 자세가 순간적으로 끼어드는 현상은 좌우 반전과는 또 다른 표시 문제입니다. 별도의 표시 함수는 이미 걷고 있던 몬스터가 추격·측면 이동 중 군중 때문에 잠깐 멈춘 경우에만 120ms 미만의 구간을 보행 모습으로 이어 줍니다. 이 함수는 몬스터의 실제 위치, 충돌, 공격 타이머를 변경하지 않습니다.
유예를 모든 상태에 적용하면 피격이나 사망 반응이 늦고, 정말 길을 못 찾는 몬스터가 계속 제자리걸음을 하게 됩니다. 그래서 공격·피격·사망, 실제 대기 판단, 도달 불가 경로와 처음부터 idle인 상태는 즉시 실제 상태를 표시합니다. 지속된 군중 정지도 유예가 끝나면 idle로 바뀝니다. 방향 확인의 120ms와 짧은 정지 표시의 120ms는 숫자가 같아도 서로 다른 문제를 다루는 조건입니다.
- 16ms 동안만 멈췄다가 걷는 사례와 120ms 이상 계속 멈추는 사례를 분리합니다.
- 표시 유예 중 공격·피격·사망을 발생시켜 즉시 해당 상태를 선택하는지 확인합니다.
- 표시 함수를 호출하기 전후의 전투 데이터를 비교하여 표시 보정이 게임 상태를 수정하지 않는지 검사합니다.
48마리와 64마리 시나리오에서 무엇을 측정했나
회귀 테스트에는 64마리를 대각선 장애물 주변에 배치하고 12초 동안 갱신하는 장면이 있습니다. 33ms, 1000/60ms, 1000/30ms 간격을 각각 사용하며, 계속 보행 중인 몬스터가 120ms 미만 간격으로 연속 반전하는 사슬이 없는지 검사합니다. 또 48마리 혼합 군중에서는 이동 불가 타일 침범 0회와 공격 시작 토큰 위반 0회를 확인하면서, 플레이어가 있는 높이 부근까지 도달한 몬스터가 30마리 이상인지도 검사합니다. 방향만 잠근 수정이 통과하지 못하도록 진행 조건을 함께 둔 것입니다.
한 칸짜리 출입구를 찾는 장면, 대각선에서 두 픽셀씩 왕복하던 장면과 맵 가장자리의 돌진 접근점도 별도 회귀로 남겼습니다. 나이트와 엘린의 실제 입력을 넣는 64마리 전투 테스트는 짧은 군중 정지 표시, 피격과 공급 아이템 획득을 함께 검사합니다. 이 시나리오들은 2026년 10월 7일 코드 대조 과정에서도 통과했습니다. 다만 이는 정해진 초기 상태와 입력의 시뮬레이션 결과이며, 모든 군중 배치나 실제 휴대폰의 장시간 성능을 보증하는 수치가 아닙니다.
- 난수 시드와 초기 위치를 고정해 실패했던 장면을 반복 재현합니다.
- 반전 횟수뿐 아니라 금지 구역 침범, 일정 시간의 순이동, 목표 높이 도달 여부를 함께 기록합니다.
- 갱신 간격과 몬스터 종류를 바꿔 재검사한 뒤 실제 브라우저에서 이미지 전환까지 확인합니다. 시뮬레이션 통과와 화면 품질 검증은 별개입니다.