Elipair
← 프로젝트 목록

Block Drag

2025.05 – 2025.07 · Flutter · Supabase

Google Play · App Store 출시

공간 감각을 활용하는 퍼즐 게임

Flutter · Supabase

배경

Block Drag는 매 턴 주어지는 블록 3개를 드래그 앤 드롭으로 그리드에 놓아 가로·세로 라인을 완성하는 모바일 퍼즐 게임입니다. 그리드는 6x6과 8x8 중에서 고르고, 보드에는 장애물이 무작위로 놓입니다. 남은 블록을 하나도 놓을 수 없으면 게임이 끝나고, 보상형 광고를 보면 이어서 할 수 있습니다.

개발부터 스토어 배포, 출시 후 업데이트까지 혼자 진행한 1인 개발 프로젝트입니다.

맡은 역할

  • 게임 로직 — 블록 생성, 라인 클리어, 게임 오버 판정, 점수·콤보 규칙
  • UI와 연출 — 드래그 경로 표시, 클리어·콤보 이펙트, 테마, 튜토리얼
  • 사운드와 진동 — 배경음악·효과음, 진동 피드백
  • 수익화와 배포 — AdMob 광고, Google Play·App Store 배포와 업데이트

과정

첫 주에 게임의 뼈대를 만들었습니다. 2025년 4월 3일 첫 커밋 당일에 장애물을 넣었고, 이튿날 게임 오버를 판정하는 DFS 알고리즘을 고쳤습니다. 4월 8일에는 광고를 붙였습니다.

재미는 숫자를 계속 고치며 찾았습니다. 장애물 생성 확률, 점수, 콤보 제한, 블록 가중치를 여러 번 조정했습니다. 4월 말에는 MAX 콤보에 도달하면 긴 블록을 주는 Fantastic 콤보를 넣었습니다.

구조 개선은 두 번에 걸쳐 했습니다. 9월에 게임 로직을 서비스 단위로 나눴지만, 1,200줄이 넘는 Provider 파일이 남았습니다. 그래서 12월에 Clean Architecture 기준으로 프로젝트 전체를 다시 세웠습니다.

다시 세운 뒤 기능을 하나씩 되살렸습니다. 사운드는 걷어냈다가 앱 생명주기와 연동되는 구조로 다시 넣었습니다. 이어서 튜토리얼, 크리티컬 라인 미션, 게임 통계와 티어 시스템을 추가했습니다.

기술적 결정

Clean Architecture로 전체 리빌드

  • 상황게임 상태와 규칙이 1,200줄이 넘는 Provider 파일 하나에 몰려 있었습니다.
  • 결정4계층으로 나눠 규칙은 domain 서비스로, 상태는 Riverpod 코드 생성과 Freezed 불변 엔티티로 옮겼습니다.
  • 결과레거시 코드를 지운 시점에 flutter analyze 결과가 59 errors에서 0 issues가 됐습니다.

로그인은 붙였다가 내려놓기

  • 상황2.1.0에서 Supabase 로그인과 랭킹을 붙였고, 12월 리빌드 때 걷어냈다가 Google OAuth로 다시 붙였습니다.
  • 결정2026년 1월 2일 Supabase 의존성을 제거하고, 로그인 버튼에는 "준비중입니다" 안내만 남겼습니다.
  • 결과게임 상태와 최고 점수는 서버 없이 기기에 저장하는 구조로 배포를 이어갔습니다.

업데이트 안내는 GitHub에 둔 appcast로

  • 상황버전 단위로 수정과 기능을 자주 배포했습니다.
  • 결정upgrader 패키지와 GitHub 저장소에 둔 appcast 파일로, 새 버전이 나오면 앱 안에서 알리게 했습니다.

결과

  • Google Play와 App Store에 출시했습니다.
  • 2.0.0(2025-05-10), 2.1.0(2025-07-25)을 거쳐 2.2.x 버전까지 업데이트를 배포했습니다.
  • v2.2.9에서는 설정의 "점수표시" 옵션이 점수 애니메이션에 적용되지 않던 문제를 고쳤습니다.