GitHub ↗
← 모든 프로젝트
웹 게임 / 2024–2025

수박 게임 클론

한창 유행하던 수박게임이 어떻게 만들어졌는지 배우려고 만든 학습용 클론. JavaScript·Matter.js로 입력, 낙하, 충돌·병합과 점수 처리 흐름을 살펴봤습니다.

JavaScriptMatter.jsVite학습 프로젝트게임 클론
수박게임 학습용 클론의 실제 플레이 화면 · 원형 물체와 점수 345
01 / PROBLEM & GOALS

문제/목표 — 왜 만들었는가

충돌 이벤트를 게임 규칙으로 바꾸는 과정

한때 한창 유행하던 수박게임이 어떻게 만들어졌는지 궁금해 학습용 클론을 만들었습니다. 오픈소스 원본을 참고하고 JavaScript·Matter.js의 입력, 낙하, 충돌·병합, 점수 처리 흐름을 살펴보며 게임 구현 방식을 익혔습니다.

구현 환경
JavaScript · Matter.js · Vite
실행 구조
브라우저 단일 페이지 · Canvas 렌더링
핵심 관심사
이벤트 처리 · 상태 제어 · 충돌 판정

기존 문제

유행하던 수박게임의 동작을 직접 구현하면서 이해하고 싶었습니다. 화면의 물체 움직임이 입력 제어, 물리 충돌, 병합 조건과 점수 변경으로 어떻게 연결되는지 살펴볼 필요가 있었습니다.

사용자가 필요로 한 것

개인 학습을 위해 브라우저에서 직접 조작할 수 있고 입력·낙하·충돌·병합과 점수 변경을 관찰할 수 있는 작은 게임이 필요했습니다.

목표

유행하던 게임의 구현 원리 이해

입력과 물리 엔진, 충돌 이벤트가 게임 규칙으로 이어지는 흐름을 코드와 실행으로 살펴봤습니다.

직접 플레이하며 동작 관찰

키보드·마우스로 위치를 조절하고 낙하, 병합과 점수 변경을 확인하는 작은 클론을 만들었습니다.

내가 맡은 역할

오픈소스 원본을 참고해 수박게임 클론을 학습용으로 만들었습니다. 게임 동작과 코드를 살펴보며 구현 방식을 익힌 개인 학습 프로젝트입니다.

유행하던 게임의 구현 원리를 공부하려 만든 학습용 클론입니다. README의 paulantoine2/suika 원본 참고 관계를 유지하며, 현재 코드는 과일을 텍스처 대신 원형 물체로 표현합니다.

02 / SOLUTION & IMPLEMENTATION

해결/구현 — 어떻게 만들었는가

전체 아키텍처

키보드·마우스 입력이 main.js의 currentBody와 disableAction을 변경하고, 과일 정의가 Bodies.circle 생성에 사용됩니다. World의 물체를 Engine과 Runner가 시뮬레이션하고 Render가 Canvas에 그립니다. collisionStart는 게임 규칙과 점수 갱신으로 이어집니다.
모듈과 상태의 연결

현재 코드의 책임을 논리적으로 나눈 구조도입니다. 입력·상태·충돌 처리는 실제로 대부분 main.js 안에 있습니다.

크게 보기 ↗
이미지의 텍스트 설명

키보드·마우스 입력이 main.js의 currentBody와 disableAction을 변경하고, 과일 정의가 Bodies.circle 생성에 사용됩니다. World의 물체를 Engine과 Runner가 시뮬레이션하고 Render가 Canvas에 그립니다. collisionStart는 게임 규칙과 점수 갱신으로 이어집니다.

main.js / 입력과 상태

currentBody와 currentFruit가 조작 중인 과일을 가리킵니다. disableAction은 입력 허용 여부를, interval은 키보드 이동 타이머를 관리합니다.

suika_fruits.js / 단계별 데이터

FRUITS_BASE 배열의 순서가 과일 단계이며 radius가 물체 크기입니다. 합칠 때는 현재 index + 1의 데이터를 참조합니다.

Matter.js / 물리와 렌더링

World는 물체를 보관하고 Engine·Runner는 시뮬레이션을 진행합니다. Render는 Canvas를 갱신하며 collisionStart 이벤트가 게임 규칙의 진입점입니다.

기술 선택 이유

Matter.js · 물리 시뮬레이션

코드에서 중력·충돌·물체 생성을 Matter.js에 맡기고 게임 규칙을 collisionStart 이벤트에 연결합니다. 도입 당시의 선택 이유는 작성자 확인이 필요합니다.

JavaScript · Canvas

입력 이벤트와 게임 상태는 JavaScript로, 물체 표시는 Matter.js Render의 Canvas로 구성되어 있습니다.

DB · API · 인프라 구조

브라우저 내부 상태

currentBody, currentFruit, disableAction과 score를 브라우저에서 관리합니다. 검토한 게임 흐름에는 별도 DB나 서버 API가 포함되지 않습니다.

핵심 처리 흐름

과일 생성 후 위치를 조절하고 낙하 입력을 받습니다. 입력을 잠근 뒤 1초 후 다음 과일을 생성합니다. 물리 충돌에서는 먼저 상단 센서를 검사하고, 종료 대상이 아니면 두 물체의 index 존재와 동일 여부를 확인합니다. 마지막 단계가 아니면 기존 두 물체를 제거하고 다음 단계 과일을 생성한 뒤 점수를 더합니다.
낙하부터 병합까지의 처리 흐름

타이머와 충돌 이벤트는 별도로 실행됩니다. 점선은 현재 구현의 재시작 시도로, 재시작 경로는 추가 검증이 필요합니다.

크게 보기 ↗
이미지의 텍스트 설명

과일 생성 후 위치를 조절하고 낙하 입력을 받습니다. 입력을 잠근 뒤 1초 후 다음 과일을 생성합니다. 물리 충돌에서는 먼저 상단 센서를 검사하고, 종료 대상이 아니면 두 물체의 index 존재와 동일 여부를 확인합니다. 마지막 단계가 아니면 기존 두 물체를 제거하고 다음 단계 과일을 생성한 뒤 점수를 더합니다.

  1. 01. 입력 좌표를 게임 좌표로 변환

    마우스의 clientX에서 Canvas의 왼쪽 좌표를 뺍니다. Math.max / Math.min으로 좌표를 30 + radius부터 590 − radius 사이로 제한해 과일 중심이 벽 밖으로 나가지 않도록 합니다.

  2. 02. 낙하와 다음 턴을 분리

    낙하 시 isSleeping을 해제하고 disableAction을 true로 바꿉니다. setTimeout이 1초 후 addFruit를 호출하고 입력을 다시 허용합니다. 물리 시뮬레이션은 이 시간에도 계속 진행됩니다.

  3. 03. 충돌 객체를 검증한 뒤 병합

    bodyA와 bodyB에 index가 정의되어 있고 두 값이 같아야 병합합니다. 마지막 단계이면 종료하고, 아니면 두 물체를 제거한 뒤 충돌 접점에 다음 단계 원을 생성합니다.

  4. 04. 물체 변화와 점수 반영

    새 과일을 World에 넣은 뒤 Math.floor(newFruit.radius × 10)을 score에 더합니다. 점수 DOM은 textContent로 갱신합니다.

03 / RESULTS & VALIDATION

결과/검증 — 그래서 무엇이 좋아졌는가

실제 서비스 적용 여부

소스 코드가 공개된 클론·학습 프로젝트입니다. 실제 서비스 운영 여부는 작성자 확인이 필요합니다.

구현된 플레이 흐름

저장소 코드에서 입력 → 낙하 → 충돌 판정 → 병합 → 점수 갱신을 확인할 수 있습니다. 실제 사용자 반응과 성능 개선 수치는 아직 수집하지 않았습니다.

검증 방법과 근거

공개 저장소 코드를 임시 로컬 환경에서 실행하고 실제 키보드·마우스 입력으로 플레이했습니다. 낙하와 병합에 따른 점수 증가를 확인해 시작·진행 화면을 캡처했습니다. 상용 게임의 완성도나 모든 종료·재시작 경로를 검증했다는 의미는 아닙니다.

실행 화면

원형 과일 물체가 쌓이고 점수가 표시되는 수박게임 클론
실제 플레이 화면

공개 코드 직접 실행 · 키보드·마우스 조작 후 플레이 화면

수박게임 학습용 클론의 시작 상태
게임 시작 화면

과일은 현재 코드의 원형 물체 표현을 그대로 사용했습니다.