한 번 누르면 얼마나 올라갈까
틈새 통과 비행 게임에서 모든 판단은 "언제 누르는가" 하나로 줄어듭니다. 캐릭터는 매 프레임 일정한 중력으로 가속되며 떨어지고, 누르는 순간 속도가 위쪽으로 고정값으로 덮어써집니다. 누르는 횟수나 힘을 조절할 수는 없고, 오직 간격만 선택할 수 있습니다. 이 단순함 때문에 같은 코스를 익숙해질수록 손이 먼저 타이밍을 기억하게 되며, 반대로 한 번의 어긋남이 곧 종료로 이어집니다. 이 글은 코드에서 읽은 물리 값과 점수별 간격 수치를 풀어서, 막연히 "감"으로만 하던 판단을 숫자로 설명합니다.
물리 규칙
- 캔버스: 360×480. 캐릭터는 가로 위치 80에 고정되고 위아래로만 움직입니다. 충돌 판정은 반지름 14(폭·높이 28)의 정사각형 범위입니다.
- 중력: 프레임마다 속도에 0.45를 더하고, 그 속도만큼 위치를 이동합니다. 가만히 두면 계속 빨라지며 떨어집니다.
- 날개짓: 누르면 속도가 -7.6(위쪽)으로 바로 바뀝니다. 연타해도 속도가 더해지지 않고 같은 값으로 다시 덮어쓰기만 됩니다. 한 번 누르고 가만히 있을 때 정점까지 17프레임(약 0.28초) 올라가고 총 60.4만큼 상승합니다.
- 낙하 시간: 화면 한가운데에서 가만히 두면 약 32프레임(0.53초) 만에 바닥에 닿습니다. 맨 위에서 맨 아래까지는 약 45프레임(0.75초)입니다.
- 종료 조건: 장애물과 겹치거나, 캐릭터 가장자리가 화면 위·아래 끝을 넘으면 즉시 끝납니다. 천장과 바닥도 장애물과 같은 취급입니다.
- 점수: 장애물을 통과할 때마다 1점. 장애물의 오른쪽 끝이 캐릭터 왼쪽 끝을 지나는 순간 집계됩니다.
누르는 속도와 평균 상승 속도
날개짓 효과가 속도 덮어쓰기라서, 일정한 간격으로 계속 누르면 위로 올라가는 평균 속도가 눌러야 하는 간격에 따라 결정됩니다. 아래 표는 같은 간격으로 계속 눌렀다고 가정하고 코드의 물리 규칙을 반복 계산한 값입니다. 양수는 평균적으로 올라가는 속도, 음수는 평균적으로 내려가는 속도입니다.
| 누르는 간격 | 초당 누르는 횟수 | 평균 상승 속도 |
|---|---|---|
| 6프레임마다 | 10.0회 | +362px/초 (올라감) |
| 10프레임마다 | 6.0회 | +308px/초 (올라감) |
| 17프레임마다 | 3.5회 | +213px/초 (올라감) |
| 25프레임마다 | 2.4회 | +105px/초 (올라감) |
| 34프레임마다 | 1.8회 | −17px/초 (내려감) |
간격이 짧을수록 많이 올라가고, 간격이 길어지면 올라가는 속도가 줄어 어느 시점부터는 오히려 내려갑니다. 이 균형점 근처에서 일정하게 누르면 높이를 유지하는 "호버링"이 되지만, 간격이 조금만 어긋나도 위아래로 크게 출렁입니다. 실전에서는 일정 간격을 지키기보다 틈새 높이를 보고 한 번씩 끊어 눌러 높이를 조정하는 방식이 더 안정적입니다.
점수에 따라 틈새·속도·간격이 변하는 방식
난이도는 점수로 정해집니다. 틈새는 점수 1점마다 3씩 좁아지다 120에서 멈추고, 속도는 점수 1점마다 0.05씩 빨라지다 4.6에서 멈추며, 장애물 사이 간격은 점수 2점마다 1프레임씩 짧아지다 70프레임에서 멈춥니다. 세 가지는 서로 다른 점수에서 멈추기 때문에 구간마다 체감 난이도가 달라집니다.
| 점수 | 틈새 높이 | 캐릭터 제외 여유 | 속도 | 장애물 간 거리 | 틈새 구간 통과 시간 |
|---|---|---|---|---|---|
| 0 | 190 | 162 | 2.40/프레임 | 240px (1.67초) | 0.51초 |
| 10 | 160 | 132 | 2.90/프레임 | 276px (1.58초) | 0.43초 |
| 20 | 130 | 102 | 3.40/프레임 | 306px (1.50초) | 0.36초 |
| 24 | 120 | 92 | 3.60/프레임 | 317px (1.47초) | 0.34초 |
| 30 | 120 | 92 | 3.90/프레임 | 332px (1.42초) | 0.32초 |
| 44 | 120 | 92 | 4.60/프레임 | 359px (1.30초) | 0.27초 |
| 60 | 120 | 92 | 4.60/프레임 | 322px (1.17초) | 0.27초 |
"캐릭터 제외 여유"는 틈새 높이에서 캐릭터 높이 28를 뺀, 위아래로 흔들릴 수 있는 폭입니다. 날개짓 1회 상승량 60과 비교해 보면, 점수 24점 이후 여유 92에서는 한 번 누를 때 올라가는 높이가 여유의 66%에 이릅니다. "틈새 구간 통과 시간"은 장애물이 캐릭터와 가로로 겹쳐 있는 시간입니다(장애물 폭 46 + 캐릭터 폭 28를 속도로 나눈 값). 속도가 빨라지면 이 시간이 짧아져, 틈새 안에서 높이를 고칠 기회가 거의 없어집니다.
계산 예시
예시 1. 첫 장애물까지의 시간. 장애물은 첫 날개짓 후 100프레임 만에 오른쪽 밖(x=406)에서 생성되고, 캐릭터와 겹치기 시작하는 지점(x=94)까지 초당 144px의 속도로 이동합니다. 따라서 처음 장애물과 만나기까지 약 3.8초 걸립니다. 이 시간 동안 높이를 틈새 높이에 맞춰 두는 것이 초반의 핵심입니다.
예시 2. 한 번에 이동해야 하는 최대 높이. 틈새 위치는 위쪽 40, 아래쪽 40의 여백을 남기고 무작위로 정해집니다. 틈새 높이가 120이면 틈새 상단은 40에서 320 사이에서 정해지므로 연속한 두 틈새의 높이 차이는 최대 280입니다(틈새 높이가 같을 때). 이 차이를 1.30초 안에 올라가거나 내려가야 합니다. 내려가는 쪽은 중력이 도와 짧게 끝나지만, 올라가는 쪽은 날개짓을 여러 번 이어야 하므로 위쪽 틈새로 이어지는 구간이 더 까다롭습니다.
예시 3. 오래 버티면 얼마나 걸릴까. 한 번도 부딪히지 않는다고 가정하고 코드 규칙을 그대로 계산하면, 점수 24에 닿는 시점은 시작 후 약 40초, 점수 44는 약 67초, 점수 60은 약 87초입니다. 점수 60부터는 틈새·속도·간격이 모두 하한·상한에 닿아 더 어려워지지 않으므로, 그 시점을 넘기면 같은 난이도가 계속됩니다. 이 시간은 이론상 최단치이며 실제 기록과 다를 수 있습니다.
전략: 코드 규칙에서 도출되는 것
- 틈새 정중앙을 목표로 하지 마세요. 틈새 안 여유가 위아래 같기 때문에 중앙이 가장 안전하지만, 이동 중에는 다음 틈새 방향으로 미리 치우쳐 통과하는 편이 이득입니다. 장애물 열을 벗어난 뒤 다음 장애물이 오기 전까지는 천장과 바닥만 조심하면 되는 구간입니다.
- 구간은 "장애물 사이"와 "장애물 안"으로 나뉩니다. 장애물 사이(수백 px 구간)에서는 높이를 크게 옮기고, 장애물과 겹친 짧은 시간에는 불필요한 조작을 줄이세요. 점수 44 이후 겹치는 시간은 0.27초 정도에 불과합니다.
- 연타는 도움이 되지 않습니다. 같은 속도로 덮어쓰기만 되기 때문에 너무 자주 누르면 높이를 제어하지 못하고 천장에 부딪힙니다. 위쪽 장애물과 천장이 가까운 경우 특히 위험합니다.
- 천장과 바닥 근처는 쓸 일이 없습니다. 틈새는 천장과 바닥에서 최소 40만큼 떨어져 생성되므로 화면 끝에 붙어 날 필요가 없습니다. 높이를 중간대에 두고 움직이면 천장·바닥 종료를 피하기 쉽습니다.
- 눈은 캐릭터가 아니라 다음 틈새에 두세요. 캐릭터는 가로로 고정되어 있어 위치가 변하지 않습니다. 변하는 것은 장애물의 높이뿐이므로 시선을 장애물 쪽에 두는 것이 입력 타이밍을 맞추는 데 유리합니다.
흔한 실수와 오해
- 세게 누르면 더 높이 올라간다고 생각하기 쉽지만, 누르는 강도는 반영되지 않습니다. 모든 입력이 같은 효과입니다.
- 처음에 가만히 있으면 바로 떨어진다고 걱정할 필요가 없습니다. 첫 클릭 전까지는 캐릭터가 제자리에서 흔들리고, 첫 클릭 순간부터 게임이 시작됩니다.
- 종료 후 연타 때문에 바로 재시작되지 않도록, 게임이 끝난 뒤 약 0.6초 동안은 화면을 눌러도 재시작되지 않습니다.
- 스페이스바는 버튼에 포커스가 있을 때 버튼 동작과 겹칠 수 있어, 버튼을 누른 뒤에는 포커스를 자동으로 해제하도록 했습니다.
한계와 저장되는 정보
이 게임은 한 가지 규칙(점수에 따른 간격 조절)만 가진 단순한 구조이며, 캐릭터 선택·코스 변경·아이템은 없습니다. 장애물 높이는 Math.random()으로 정해지며 같은 배열이 반복되지 않는 일반 난수입니다. 최고 점수는 이 브라우저의 localStorage에 gap-flight-dodge-best 키로만 저장됩니다. 서버로 전송되지 않고 다른 기기와 동기화되지 않으며, 브라우저의 사이트 데이터를 삭제하면 사라집니다. 시크릿 모드에서는 창을 닫으면 기록이 유지되지 않을 수 있습니다.
다른 아케이드 게임도 즐겨보세요
비슷하게 장애물을 피하는 게임을 원한다면 장애물 점프 게임이나도로 건너기 게임, 좌우 차선을 옮겨 가며 피하는 차선 피하기 레이싱 게임도 확인해보세요.
자주 묻는 질문
키보드로도 플레이할 수 있나요?
네. 스페이스바나 위쪽 화살표 키를 누르면 클릭했을 때와 동일하게 위로 날아오릅니다. 터치 화면에서는 캔버스를 탭하면 됩니다.
틈새 위치는 어떻게 정해지나요?
장애물이 생성될 때마다 위·아래 40의 여백을 남기고 무작위 높이로 정해집니다. 현재 틈새 높이에 따라 가능한 위치 범위가 달라지며, 점수가 높아져 틈새가 좁아질수록 연속한 틈새 사이의 높이 차이가 커질 수 있습니다.
왜 점수가 오를수록 어려워지나요?
틈새는 점수 24점까지 점점 좁아지고, 속도는 점수 44점까지 빨라지며, 장애물 간 간격은 점수 60점까지 짧아집니다. 이후에는 더 어려워지지 않고 같은 난이도가 유지됩니다.
고주사율 모니터에서 더 빨라지지 않나요?
빨라지지 않습니다. 게임 로직을 초당 60번의 고정 간격으로 계산하므로 60Hz나 144Hz 화면 모두 같은 속도로 진행됩니다.
최고 점수는 어디에 저장되나요?
이 브라우저의 localStorage(gap-flight-dodge-best)에만 저장되며, 사이트 데이터를 삭제하면 함께 사라집니다. 다른 기기와는 공유되지 않습니다.