작성·운영: 몽실 · 규칙 대조 및 수정:
초기 v1의 물리 구조를 소개하던 문서를 현재 코드 기준으로 정리했습니다. 여기서 설명하는 범위는 수박 키우기의 충돌·합성·종료 판정입니다. 현재 서비스에는 서버 랭킹과 대결 기능도 있으며, 그 구조는 대결 동기화 노트에서 다룹니다.
같은 화면 좌표 안에서 움직이는 원
게임은 과일을 반지름이 다른 원으로 다룹니다. 물리는 1/120초 단위로 계산하며, 화면을 다시 그리는 주기와 구분합니다. 위치는 게임 내부 좌표를 사용합니다. 따라서 중력 2200이라는 수치를 실제 세계의 m/s²와 바로 비교할 수는 없습니다.
| 항목 | 값 | 적용 방식 |
|---|---|---|
| 보드 | 440 × 620 | 화면 크기에 맞게 표시 배율 조정 |
| 중력 | 2200 내부좌표/초² | 각 물리 단계에서 수직 속도에 시간 간격을 곱해 더함 |
| 반발계수 | 0.12 | 충돌 후 상대 속도를 계산할 때 적용 |
| 질량 | 반지름² | 큰 과일과 작은 과일의 위치·충격 분담에 사용 |
| 위치 보정 | 3패스 | 겹친 원을 반복해서 분리 |
| 속도 상한 | 각 축 ±1600 | 가로·세로 속도를 각각 제한 |
| 드롭 간격 | 0.55초 | 다음 과일을 떨어뜨릴 수 있을 때까지 대기 |
접촉부터 새 과일까지
- 두 원 중심의 거리와 반지름 합을 비교해 겹침을 찾습니다.
- 첫 번째 보정 패스에서 같은 단계가 만나면 합성합니다. 좌우·위아래 같은 방향 조건은 없습니다.
- 사용된 두 과일을 제거 대상으로 표시하고 새 단계 과일을 만듭니다. 같은 물리 계산 중 이미 사용된 과일을 다시 합치지 않도록 확인합니다.
- 수박 두 개가 만난 경우에는 새 과일을 생성하지 않고 둘을 제거합니다.
세 과일이 거의 동시에 닿아도 하나의 과일을 두 합성에 중복 사용하는 것은 의도된 동작이 아닙니다. 현재 tests/physics.test.cjs의 세 과일 접촉 검사는 이 조건을 확인합니다. 이 테스트 하나가 모든 쌓임이나 기기에서의 움직임을 검증하는 것은 아닙니다.
종료는 속도가 아니라 위험 게이지로 판단합니다
빨간 선은 내부 세로 좌표 110에 있습니다. 생성된 지 1초가 지나지 않은 과일은 위험 검사에서 제외합니다. 검사 대상 중 하나라도 과일의 윗부분이 선 위에 있으면 위험 시간이 쌓이고, 모두 선 아래로 내려오면 그 시간이 두 배 속도로 줄어듭니다. 누적 위험 시간이 1초를 넘으면 종료합니다.
수치로 보는 판정 예시
가상 계산 예시: 위험 상태가 0.6초 이어졌다면 게이지는 약 0.6초입니다. 이어서 0.2초 동안 안전하면 0.4초가 줄어 약 0.2초가 남습니다. 다시 위험해지면 남은 값부터 쌓입니다.
실제 종료 시점은 고정 시간 간격의 경계와 과일 움직임에 따라 달라집니다. 한 과일이 연속으로 정확히 1초 머물렀는지만 따지는 방식은 아닙니다.
이 구조는 쌓인 과일의 미세한 떨림을 종료 조건에서 분리합니다. 플레이어에게는 위험 게이지가 남은 여유를 보여 줍니다. 조작 중 쉬어야 한다면 솔로 모드의 일시정지를 사용할 수 있습니다.
현재 확인할 수 있는 범위
저장소의 tests/physics.test.cjs에는 같은 과일의 중복 합성 방지와 오늘의 챌린지 재시작 시 미리보기까지 포함한 시드 순서 재현 검사가 있습니다. 개발 환경에서 node --test tests/physics.test.cjs로 실행할 수 있습니다. 판정 전체를 검증한 실험 결과로 확대해 해석하지 않습니다.
직접 비교하려면 같은 날짜의 챌린지를 다시 시작하고 처음 조준 위치와 드롭 간격을 기록해 보세요. 입력 시점이 바뀌면 충돌 결과도 달라질 수 있습니다. 이상 동작을 제보할 때는 브라우저, 화면 크기, 모드와 직전 입력을 함께 남기면 재현 조건을 좁힐 수 있습니다.