시간 안에 상대편을 하나씩 물풍선에 가두고 터뜨리는 게임이에요. 물풍선을 팡! 터뜨릴 때 기분이 얼마나 좋은지 몰라요.
눈이 댕그랗고 입을 삐죽이는 캐릭터도 귀여운데다 알록달록한 아이템이 많이 나옵니다. 예를들어 스케이트를 먹으면 달리는 속도가 빨라지고, 거북이를 먹으면 느려집니다. 물풍선에 갇힌 상대편을 터뜨리거나, 아이템을 먹을 때는 모두 ‘충돌’ 원리를 사용한답니다.
아케이드는 점과 점의 충돌
‘크레이지아케이드’는 캐릭터가 상하좌우로만 움직일 수 있습니다. 그래서 충돌 원리를 적용할 때 캐릭터나 아이템 모양에 구애받지 않지요. 맵은 가로세로 좌표로, 그리고 캐릭터와 아이템은 좌표 위의 두 점으로 인식합니다. 만약 두 점의 좌표가 똑같다면 서로 부딪쳤다고 볼 수 있어요. 즉, 캐릭터가 물풍선을 터뜨리거나 아이템을 먹은 경우지요.
캐릭터의 생김새에 따라 충돌했는지 알아내는 방법이 달라집니다. 그 중 비교적 간단한 원리가 바로 ‘벽돌 깨기’에 나오는 점과 선의 충돌입니다. 공(점)이 떨어지는 자리에 판자(선)를 갖다 대면, 공이 부딪혔다가 튕겨 오르면서 벽돌을 부숩니다. 좌표에서 점이 선 위에 놓여 있다면 둘이 충돌했다고 볼 수 있지요.
이것을 쉽게 보기 위해 수학에서는 ‘맨해튼 거리’를 이용합니다. 대각선을 생각하지 않고 가로와 세로만 고려해 거리를 재는 방법이지요. 예를들어 2차원 좌표에서 A와 B의 맨해튼 거리는 두점을 이은 선의 길이가 아니라 A에서 B까지 직각으로 가는 선의 길이가 됩니다.
만약 점 C가 A와 B를 잇는 선과 충돌한다면 점이 선 위에 있어야 하겠지요. 결국 A와 B의 맨해튼 거리는 A와 C, 그리고 B와 C의 맨해튼 거리를 합친 값과 같아집니다.
배트민턴 칠 때는 사각형과 사각형의 충돌
여러분이 좋아하는 게임 속 캐릭터와 아이템은 어떻게 생겼나요? 도형이 복잡할수록 충돌을 계산하는 데 오래 걸립니다. 테두리를 따라 직선과 곡선을 각각 계산하기가 번거롭기 때문이지요.
그래서 게임에서는 원이나 사각형이 캐릭터와 아이템을 두르고 있다고 가정하고 충돌을 계산해요(바운딩박스). 그러면 계산도 수월해지고 정확도도 높아집니다. 어떤 게임은 원이나 사각형이 한 개가 아닌, 여러 개가 아이템 하나를 이룬다고 가정해 정확도를 높이기도 합니다.
단순 2차원 게임에서는 사각형과 사각형 사이의 충돌이 가장 많습니다. 배드민턴을 치는 게임을 예로 들면, 라켓이 셔틀콕을 치는 순간 사각형과 사각형이 부딪쳤다고 볼 수 있지요. A와 B, 두사각형이 2차원 좌표에 놓여 있다고 가정하면, 서로 상하좌우가 만나는지 확인해 충돌 여부를 알아낼 수 있습니다. 예를 들어 A의 윗변과 B의 아랫변, A의 아랫변과 B의 윗변, A의 왼쪽변과 B의 오른쪽변, A의 오른쪽변과 B의 왼쪽변이 서로 만나거나 상대 도형 안에 들어간다면 두 사각형은 서로 부딪친 것이지요.
바운딩박스를 원으로 인지하는 경우에는 좌표에 놓인 두 원이 겹치는지 아닌지로 확인합니다. 두 원의 중심 간의 거리가 두 원의 반지름의 합보다 작다면 원끼리 부딪쳤다고 볼 수 있지요.
만약 3차원으로 배드민턴을 치는 게임이라면 어떨까요? 이럴 때는 바운딩박스를 육면체로 인지해요. 즉, 꼭짓점 8개와 변 12개가 서로 만나는지 또는 상대 도형 안에 들어가는지 확인합니다.
여러분이 좋아하는 게임에는 어떤 충돌 원리가 들어 있나요? 그리고 캐릭터와 아이템이 어떤 모양으로 인지될지 한번 상상해보세요.