유행하던 게임의 구현 원리 이해
입력과 물리 엔진, 충돌 이벤트가 게임 규칙으로 이어지는 흐름을 코드와 실행으로 살펴봤습니다.
한창 유행하던 수박게임이 어떻게 만들어졌는지 배우려고 만든 학습용 클론. JavaScript·Matter.js로 입력, 낙하, 충돌·병합과 점수 처리 흐름을 살펴봤습니다.
한때 한창 유행하던 수박게임이 어떻게 만들어졌는지 궁금해 학습용 클론을 만들었습니다. 오픈소스 원본을 참고하고 JavaScript·Matter.js의 입력, 낙하, 충돌·병합, 점수 처리 흐름을 살펴보며 게임 구현 방식을 익혔습니다.
유행하던 수박게임의 동작을 직접 구현하면서 이해하고 싶었습니다. 화면의 물체 움직임이 입력 제어, 물리 충돌, 병합 조건과 점수 변경으로 어떻게 연결되는지 살펴볼 필요가 있었습니다.
개인 학습을 위해 브라우저에서 직접 조작할 수 있고 입력·낙하·충돌·병합과 점수 변경을 관찰할 수 있는 작은 게임이 필요했습니다.
입력과 물리 엔진, 충돌 이벤트가 게임 규칙으로 이어지는 흐름을 코드와 실행으로 살펴봤습니다.
키보드·마우스로 위치를 조절하고 낙하, 병합과 점수 변경을 확인하는 작은 클론을 만들었습니다.
오픈소스 원본을 참고해 수박게임 클론을 학습용으로 만들었습니다. 게임 동작과 코드를 살펴보며 구현 방식을 익힌 개인 학습 프로젝트입니다.
유행하던 게임의 구현 원리를 공부하려 만든 학습용 클론입니다. README의 paulantoine2/suika 원본 참고 관계를 유지하며, 현재 코드는 과일을 텍스처 대신 원형 물체로 표현합니다.

현재 코드의 책임을 논리적으로 나눈 구조도입니다. 입력·상태·충돌 처리는 실제로 대부분 main.js 안에 있습니다.
키보드·마우스 입력이 main.js의 currentBody와 disableAction을 변경하고, 과일 정의가 Bodies.circle 생성에 사용됩니다. World의 물체를 Engine과 Runner가 시뮬레이션하고 Render가 Canvas에 그립니다. collisionStart는 게임 규칙과 점수 갱신으로 이어집니다.
currentBody와 currentFruit가 조작 중인 과일을 가리킵니다. disableAction은 입력 허용 여부를, interval은 키보드 이동 타이머를 관리합니다.
FRUITS_BASE 배열의 순서가 과일 단계이며 radius가 물체 크기입니다. 합칠 때는 현재 index + 1의 데이터를 참조합니다.
World는 물체를 보관하고 Engine·Runner는 시뮬레이션을 진행합니다. Render는 Canvas를 갱신하며 collisionStart 이벤트가 게임 규칙의 진입점입니다.
코드에서 중력·충돌·물체 생성을 Matter.js에 맡기고 게임 규칙을 collisionStart 이벤트에 연결합니다. 도입 당시의 선택 이유는 작성자 확인이 필요합니다.
입력 이벤트와 게임 상태는 JavaScript로, 물체 표시는 Matter.js Render의 Canvas로 구성되어 있습니다.
currentBody, currentFruit, disableAction과 score를 브라우저에서 관리합니다. 검토한 게임 흐름에는 별도 DB나 서버 API가 포함되지 않습니다.

타이머와 충돌 이벤트는 별도로 실행됩니다. 점선은 현재 구현의 재시작 시도로, 재시작 경로는 추가 검증이 필요합니다.
과일 생성 후 위치를 조절하고 낙하 입력을 받습니다. 입력을 잠근 뒤 1초 후 다음 과일을 생성합니다. 물리 충돌에서는 먼저 상단 센서를 검사하고, 종료 대상이 아니면 두 물체의 index 존재와 동일 여부를 확인합니다. 마지막 단계가 아니면 기존 두 물체를 제거하고 다음 단계 과일을 생성한 뒤 점수를 더합니다.
마우스의 clientX에서 Canvas의 왼쪽 좌표를 뺍니다. Math.max / Math.min으로 좌표를 30 + radius부터 590 − radius 사이로 제한해 과일 중심이 벽 밖으로 나가지 않도록 합니다.
낙하 시 isSleeping을 해제하고 disableAction을 true로 바꿉니다. setTimeout이 1초 후 addFruit를 호출하고 입력을 다시 허용합니다. 물리 시뮬레이션은 이 시간에도 계속 진행됩니다.
bodyA와 bodyB에 index가 정의되어 있고 두 값이 같아야 병합합니다. 마지막 단계이면 종료하고, 아니면 두 물체를 제거한 뒤 충돌 접점에 다음 단계 원을 생성합니다.
새 과일을 World에 넣은 뒤 Math.floor(newFruit.radius × 10)을 score에 더합니다. 점수 DOM은 textContent로 갱신합니다.
소스 코드가 공개된 클론·학습 프로젝트입니다. 실제 서비스 운영 여부는 작성자 확인이 필요합니다.
저장소 코드에서 입력 → 낙하 → 충돌 판정 → 병합 → 점수 갱신을 확인할 수 있습니다. 실제 사용자 반응과 성능 개선 수치는 아직 수집하지 않았습니다.
공개 저장소 코드를 임시 로컬 환경에서 실행하고 실제 키보드·마우스 입력으로 플레이했습니다. 낙하와 병합에 따른 점수 증가를 확인해 시작·진행 화면을 캡처했습니다. 상용 게임의 완성도나 모든 종료·재시작 경로를 검증했다는 의미는 아닙니다.