물리 엔진 없이 물리를 흉내내기 — 아슬탑의 균형 시뮬레이션 만들기
아슬탑은 시소 위에 다양한 모양의 블록을 쌓는 게임입니다. 처음 버전은 모든 블록을 그냥 사각형으로 취급해서, 폭과 높이만으로 쌓는 위치를 계산했습니다. 문제는 나중에 삼각형, 사다리꼴, L자 같은 각진 도형을 추가하면서 시작됐습니다. 사각형 근사 방식 그대로는 삼각형 위에 블록을 놓아도 마치 사각형 위에 놓은 것처럼 평평하게 얹혀서, 빈 공간이 무시되고 이상하게 공중에 떠 있는 것처럼 보였습니다.
표면 높이 함수라는 해결책
실제로 필요했던 건 무거운 물리 엔진이 아니라, 각 도형의 가로 위치별로 "여기 표면의 높이가 얼마인가"를 알려주는 함수 하나였습니다. 삼각형이라면 중앙이 가장 높고 양 끝으로 갈수록 0에 가까워지는 함수, L자라면 왼쪽 절반은 높고 오른쪽 절반은 낮은 계단형 함수 식으로요. 이 함수만 도형마다 정확히 정의해두면, 그 위에 새 블록을 놓을 때 표면을 따라 자연스럽게 자리 잡게 만들 수 있습니다.
기울기까지 반영하기
여기서 한 단계 더 나아가, 사용자가 요청한 개선사항은 "빗면 위에 놓인 블록이 실제로 그 경사만큼 기울어져야 한다"는 것이었습니다. 블록 바닥의 양 끝이 닿는 표면 높이 차이를 계산해서 회전각을 구하고, 캔버스에서 그 블록을 그릴 때 중심이 아니라 바닥 중앙을 회전축으로 삼아야 했습니다. 처음에는 중심을 축으로 회전시켰더니 한쪽 모서리가 표면을 파고들고 반대쪽은 공중에 뜨는 겹침 버그가 생겼는데, 회전축을 바닥으로 옮기고 나서야 실제 유리판을 얹은 것처럼 표면에 밀착됐습니다.
기울어진 블록이 다시 표면이 된다
마지막 퍼즐은, 이렇게 기울어진 블록 위에 또 다른 블록을 쌓을 때였습니다. 기울어진 블록의 표면도 다시 그 기울기를 반영해서 계산해야, 탑이 층층이 쌓일수록 점점 더 위태로워지는 진짜 균형 게임이 됩니다. 물리 엔진 없이 삼각함수 몇 줄로 이 모든 걸 구현했다는 게, 개발자로서 가장 만족스러운 부분입니다.
가짜 물리가 주는 자유
진짜 물리 엔진, 이를테면 상용 게임에서 흔히 쓰는 강체 시뮬레이션을 그대로 가져왔다면 오히려 더 어려웠을 수도 있습니다. 실제 물리 엔진은 관성, 마찰, 충돌 반발 같은 요소를 전부 정밀하게 계산해야 하고, 그만큼 예측하기 어려운 결과가 나올 위험도 커집니다. 반면 표면 높이 함수 방식은 처음부터 '게임으로서 재미있는 정도의 그럴듯함'만 목표로 삼았기 때문에, 붕괴 판정 기준이나 기울기 한계값 같은 걸 순전히 플레이 테스트를 통해 감각적으로 조율할 수 있었습니다. 정교함보다 조율 가능성이 더 중요한 순간이 있다는 걸, 이 게임을 만들며 다시 확인했습니다.