버튼 하나로 하는 ORBIT RUSH에서 중력·분열·블랙홀 노드와 탭·프레스·릴리즈 세 가지 입력이 어떻게 리듬 패턴을 넓히는지, 각 노드의 시간 규칙과 시각 표현, 미스 처리 방식을 코드 기준으로 설명합니다.">
DEV NOTE · ORBIT RUSH

중력·분열·블랙홀: 탭 하나로 리듬 어휘를 늘리는 법

궤도 크기 세 가지만으로 만들 수 있는 박자 길이는 ½, 1, 2박뿐이다. 이것만으로는 곡이 조금만 복잡해져도 표현할 수 있는 리듬이 바닥난다. ORBIT RUSH v3는 버튼을 늘리는 대신 특수 노드 세 종류와 입력 동사 세 가지(탭, 누름, 뗌)로 이 문제를 풀었다. 각 노드가 어떤 시간 규칙을 갖고, 화면에서 그것을 어떻게 미리 알려 주는지 정리한다.

세 가지 길이로는 부족하다

일반 노드만 쓰면 리듬은 ½·1·2박의 조합이다. 4/4 박자의 단순한 곡이라면 이걸로도 충분해 보이지만, 실제로 플레이하면 금방 단조로워진다. 1.5박처럼 박 사이에 걸치는 길이가 없어서 당김음을 만들 수 없고, ½박보다 촘촘한 연타도 없으며, 길게 버티는 음을 표현할 방법도 없다.

해결책으로 가장 쉬운 것은 궤도 크기를 다섯, 여섯 단계로 늘리는 것이다. 하지만 크기 차이가 작아질수록 순간적으로 구분하기 어려워지고, "크기 = 박자"라는 규칙의 장점인 즉시 읽힘이 사라진다. 그래서 크기는 세 단계로 두고, 별의 모양을 바꿔 규칙을 덧붙이는 쪽을 택했다. 별 모양은 크기와 독립된 정보 채널이라 서로 헷갈리지 않는다.

중력 노드: ½박을 더하는 소용돌이

중력 노드(◎)는 보라색 소용돌이로 그려진다. 규칙은 하나다. 원래 궤도 박자에 ½박을 더한다. 작은 궤도는 1박, 중간은 1.5박, 큰 궤도는 2.5박이 된다. 1.5박과 2.5박이 생기면서 박 사이에 걸치는 리듬이 처음으로 가능해졌다.

문제는 "왜 더 오래 도는가"를 눈으로 납득시키는 일이었다. 위성이 같은 크기의 원을 그냥 더 천천히 돌면 플레이어는 그것을 버그로 느낀다. 그래서 중력 노드에서는 위성이 궤도를 도는 동안 반지름이 점점 줄어들어 마지막에는 원래의 60%까지 안쪽으로 감겨 들어간다. 소용돌이에 빨려 들어가느라 시간이 더 걸린다는 이야기를 그림이 대신 해 주는 셈이다. 발사 마커는 원래 궤도 위에 그려지므로 입력 위치는 변하지 않는다.

분열 노드: 두 번 치는 쌍둥이

분열 노드(◉)는 쌍둥이 점으로 표시되고, 위성이 하나 더 생긴다. 쌍둥이 위성은 본체보다 정확히 ½박 앞서 같은 궤도를 돈다. 쌍둥이가 마커에 닿을 때 한 번, ½박 뒤 본체가 닿을 때 한 번, 모두 두 번 탭한다. 첫 탭은 점수와 콤보만 올리고 위성을 발사하지 않으며, 두 번째 탭이 실제 발사다. 화면에서는 발사 마커 바깥에 1.5배 크기의 빈 삼각형이 하나 더 그려져 이 별이 두 번 치는 별이라는 것을 알린다.

생성기는 분열 노드를 ½박 궤도에 놓지 않는다. ½박 궤도에서 쌍둥이가 ½박 앞서 있으면 위성이 도착하는 순간이 곧 첫 탭 시각이 된다. 앞 별에서 발사하자마자 바로 다시 쳐야 하고, 쌍둥이가 마커에 다가오는 모습을 볼 시간이 전혀 없다. 그래서 분열이 ½박 궤도에 걸리면 일반 노드로 바꾼다. 중간 궤도라면 ½박 뒤와 1박 뒤, 큰 궤도라면 1.5박 뒤와 2박 뒤에 두 번 치게 된다.

검은 원에 주황 점선 고리를 두른 블랙홀 노드들 사이에서 위성이 안쪽으로 감겨 들며 PERFECT 판정이 뜬 장면
내 음악 모드에서 블랙홀을 홀드하는 장면. 검은 원과 주황 고리가 블랙홀 노드다.

블랙홀 노드: 누르고, 버티고, 떼기

블랙홀(●)은 검은 원에 주황 고리를 두른 별이다. 위성이 마커에 닿을 때 누르고, 정확히 1박을 유지한 뒤 떼어야 탈출한다. 입력 동사로 보면 탭 대신 누름과 뗌이 각각 하나의 판정이 된다. 누름도 판정, 뗌도 판정이라 블랙홀 하나에서 콤보가 2 오른다.

홀드 중의 화면 표현에 공을 들였다. 누르고 있는 동안 위성은 블랙홀 중심을 향해 반지름의 72%만큼 빨려 들어가면서, 한 박 동안 520°를 회전한다. 평소보다 훨씬 빠르게 감기며 작아지는 위성이 "놓으면 튕겨 나간다"는 긴장을 만든다. 홀드 길이는 언제나 1박으로 고정했다. 블랙홀마다 길이가 다르면 그 길이를 화면에 숫자나 게이지로 따로 표시해야 하는데, 그러면 크기만 보고 읽는 규칙이 흐려진다.

블랙홀도 ½박 궤도에는 놓지 않는다. 이 경우는 일반 노드로 바꾸지 않고 궤도를 1박 크기로 키운다. 누르기 전에 접근을 지켜볼 최소한의 시간을 주기 위해서다.

입력 하나를 세 동사로 나누기

입력 처리는 이 세 동사를 모든 장치에서 똑같이 받도록 짰다. 키보드는 keydown이 누름, keyup이 뗌이고, 키를 누르고 있을 때 반복해서 들어오는 keydown은 무시한다. 터치와 마우스는 pointerdown과 pointerup, 그리고 손가락이 화면 밖으로 미끄러지는 pointercancel도 뗌으로 본다. 게임패드는 버튼 상태를 매 프레임 비교해 눌림·떨어짐 순간을 뽑는다.

게임 로직 쪽은 누름 함수와 뗌 함수 두 개뿐이다. 누름 함수는 현재 히트가 탭이든 블랙홀 누름이든 똑같이 판정하고, 블랙홀이면 홀드 상태를 켠다. 뗌 함수는 홀드 중일 때만 동작한다. 그래서 일반 탭 뒤에 손을 떼는 동작은 아무 영향이 없고, 플레이어는 "치는 별"과 "버티는 별"을 구분하기만 하면 된다.

놓치기 쉬운 예외도 있다. 홀드 중에 다른 창으로 전환하거나 탭이 숨겨지면 keyup이 오지 않을 수 있다. 이때 홀드가 영원히 켜져 있지 않도록 창의 blur와 visibilitychange에서 강제로 뗌을 넣는다. 그리고 블랙홀 누름을 놓치면 뗌 히트까지 함께 미스 처리하고 위성을 바로 다음 별로 보낸다. 누르지도 않았는데 뗌을 기다리면 플레이어는 무엇을 해야 할지 모르는 채로 한 박을 멈춰 있어야 하기 때문이다.

마지막으로 노드를 꺼내는 순서도 정해 두었다. 기본 5트랙은 특수 노드를 하나씩 소개하도록 확률을 배치했다. FIRST ORBIT에는 특수 노드가 없고, NEON TIDE에서 중력(10%), SOLAR FLARE에서 분열(12%), QUASAR에서 블랙홀(10%)이 처음 나온다. EVENT HORIZON은 셋을 모두 조금씩 더 높은 비율로 섞는다. 트랙 선택 카드에는 그 트랙에 등장하는 노드 기호(◎ ◉ ●)를 표시해, 무엇을 만날지 미리 알 수 있게 했다.

정리

버튼 하나짜리 게임의 표현력은 버튼 수가 아니라 입력을 몇 가지 의미로 쪼갤 수 있느냐에 달려 있다. ORBIT RUSH는 탭·누름·뗌 세 동사에 ½박 연장, ½박 선행, 1박 유지라는 세 가지 시간 규칙을 붙였고, 각 규칙마다 위성이 왜 그렇게 움직이는지 보여 주는 그림을 짝지었다. 다음 노드를 더한다면 같은 기준을 지킬 생각이다. 크기로 읽는 규칙을 흐리지 않을 것, 그리고 그림만 보고 규칙을 짐작할 수 있을 것.