BLE 기반 오프라인 팀 감지 술래잡기 앱
경도는 블루투스 저전력(BLE) 기술을 활용한 실외 술래잡기 게임입니다. 인터넷 연결 없이도 근접 감지가 가능하며, 상대팀의 정확한 위치나 인원수를 알 수 없어 긴장감 있는 게임 플레이를 제공합니다.
- 오프라인 근접 감지: BLE 신호로 상대팀 감지 (GPS 미사용)
- 정보 비대칭: 상대팀 감지 여부만 표시 (거리/인원수 비공개)
- 실시간 동기화: Supabase Realtime으로 게임 상태 동기화
- 간편한 참여: QR 코드 또는 방 코드로 빠른 참여
| 분류 | 기술 |
|---|---|
| 앱 | Flutter, Dart |
| 상태관리 | Provider |
| BLE | flutter_blue_plus, ble_peripheral |
| 백엔드 | Supabase (PostgreSQL, Realtime, RPC) |
| 코드생성 | freezed, json_serializable |
- Flutter 3.x
- Dart 3.x
- Supabase 프로젝트
# 저장소 클론
git clone https://github.com/j-token/play-tag.git
cd play-tag
# 의존성 설치
cd app && flutter pub get
# 코드 생성
flutter pub run build_runner build --delete-conflicting-outputs
# 환경변수 설정
cp app/.env.example app/.env
# .env 파일에 Supabase URL과 Anon Key 입력cd app && flutter runSupabase SQL Editor에서 마이그레이션 파일을 순서대로 실행:
server/supabase/migrations/
├── 00001_create_rooms_table.sql
├── 00002_create_players_table.sql
├── 00003_enable_realtime.sql
├── 00004_rls_policies.sql
├── 00005_helper_functions.sql
└── ...
play-tag/
├── app/ # Flutter 앱
│ └── lib/
│ ├── config/ # 테마, 상수
│ ├── core/ # 라우터, 에러, 유틸리티
│ ├── data/ # 모델, 서비스
│ ├── screens/ # 화면 위젯
│ ├── providers/ # 상태 관리
│ ├── services/ # 비즈니스 로직
│ └── widgets/ # 공용 위젯
│
├── server/ # 백엔드
│ └── supabase/
│ └── migrations/ # SQL 마이그레이션
│
└── docs/ # 문서 (PRD, Spec)
- 방 생성: 방장이 게임 설정 후 방 생성
- 참여: QR 스캔 또는 코드 입력으로 참여
- 대기실: 팀 배정 및 준비 완료 대기
- 카운트다운: 게임 시작 전 준비 시간
- 게임 진행: BLE로 상대팀 감지
- 종료: 제한 시간 또는 승리 조건 달성
# 테스트 실행
cd app && flutter test
# 코드 분석
cd app && flutter analyze
# 모델 수정 후 코드 생성
cd app && flutter pub run build_runner build --delete-conflicting-outputsMIT License