🍉 수박 키우기

개발 노트 — 물리와 종료 판정

초기 v1의 구조에서 현재 구현으로: 과일이 합쳐지고 판이 끝나는 조건을 설명합니다.

작성·운영: 몽실 · 규칙 대조 및 수정:

초기 v1의 물리 구조를 소개하던 문서를 현재 코드 기준으로 정리했습니다. 여기서 설명하는 범위는 수박 키우기의 충돌·합성·종료 판정입니다. 현재 서비스에는 서버 랭킹과 대결 기능도 있으며, 그 구조는 대결 동기화 노트에서 다룹니다.

같은 화면 좌표 안에서 움직이는 원

게임은 과일을 반지름이 다른 원으로 다룹니다. 물리는 1/120초 단위로 계산하며, 화면을 다시 그리는 주기와 구분합니다. 위치는 게임 내부 좌표를 사용합니다. 따라서 중력 2200이라는 수치를 실제 세계의 m/s²와 바로 비교할 수는 없습니다.

현재 물리 설정
항목값적용 방식
보드440 × 620화면 크기에 맞게 표시 배율 조정
중력2200 내부좌표/초²각 물리 단계에서 수직 속도에 시간 간격을 곱해 더함
반발계수0.12충돌 후 상대 속도를 계산할 때 적용
질량반지름²큰 과일과 작은 과일의 위치·충격 분담에 사용
위치 보정3패스겹친 원을 반복해서 분리
속도 상한각 축 ±1600가로·세로 속도를 각각 제한
드롭 간격0.55초다음 과일을 떨어뜨릴 수 있을 때까지 대기

접촉부터 새 과일까지

  1. 두 원 중심의 거리와 반지름 합을 비교해 겹침을 찾습니다.
  2. 첫 번째 보정 패스에서 같은 단계가 만나면 합성합니다. 좌우·위아래 같은 방향 조건은 없습니다.
  3. 사용된 두 과일을 제거 대상으로 표시하고 새 단계 과일을 만듭니다. 같은 물리 계산 중 이미 사용된 과일을 다시 합치지 않도록 확인합니다.
  4. 수박 두 개가 만난 경우에는 새 과일을 생성하지 않고 둘을 제거합니다.

세 과일이 거의 동시에 닿아도 하나의 과일을 두 합성에 중복 사용하는 것은 의도된 동작이 아닙니다. 현재 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로 실행할 수 있습니다. 판정 전체를 검증한 실험 결과로 확대해 해석하지 않습니다.

직접 비교하려면 같은 날짜의 챌린지를 다시 시작하고 처음 조준 위치와 드롭 간격을 기록해 보세요. 입력 시점이 바뀌면 충돌 결과도 달라질 수 있습니다. 이상 동작을 제보할 때는 브라우저, 화면 크기, 모드와 직전 입력을 함께 남기면 재현 조건을 좁힐 수 있습니다.

과일 수치표 · 플레이어용 배치 공략 · 재현 방법과 함께 제보하기