# MotionGameAndroid **Repository Path**: sgyk/motion-game-android ## Basic Information - **Project Name**: MotionGameAndroid - **Description**: 体感游戏 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-18 - **Last Updated**: 2026-09-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 拍泡泡 · Android 版 和 iOS 版 (`../MotionGame`) 功能对齐的 Android 实现:前置摄像头识别上半身,挥手把泡泡拍掉。 给 3–6 岁小孩玩——没有计时、没有失败、泡泡飘过去就再飘一个。 ## 技术栈 | 环节 | iOS 版 | Android 版 | | --- | --- | --- | | UI | SwiftUI | 原生 View + XML | | 相机 | AVFoundation | CameraX(Preview + ImageAnalysis) | | 姿态识别 | Vision `VNDetectHumanBodyPoseRequest` | MediaPipe Tasks `PoseLandmarker`(`numPoses = 2`) | | 画面渲染 | SpriteKit(`BubbleScene`) | 自绘 `Canvas`(`GameView` + `Choreographer`) | | 平滑 | 1€ 滤波 | 同一套 1€ 滤波(照搬) | | 音效 | AVAudioEngine 现场合成 | SoundPool + 现场合成的 WAV | **为什么不用 ML Kit 的 Pose Detection**:那套一次只输出一个人,双人同屏就没法做了。 MediaPipe 的 PoseLandmarker 支持 `numPoses > 1`,模型随包内置,离线也能跑。 ## 玩法 - **一个人玩**:竖屏,整块屏幕都是你的。举手拍泡泡。 - **两个人玩**:横屏,屏幕左右各一半,一人一半互不干扰。计分可选合作(合起来算一个分)或比赛(各算各的)。 - **三种泡泡**:普通泡泡 +1;卡通小动物泡泡(🦋🐳🍓…,更小更快)+2;炸弹 💣 扣 1 分并震动。分数不会低于 0。 ## 目录 ``` app/src/main/java/com/demo/motiongame/ ├── MainActivity.kt 相机、菜单、HUD、调试面板 ├── GameSession.kt 「相机→识别→滤波→手势→游戏」总线,每个玩家一套流水线 ├── PoseAnalyzer.kt CameraX + MediaPipe,输出屏幕坐标关键点 ├── GameView.kt 自绘泡泡/骨架/取景框/特效 + 游戏循环 ├── BubbleField.kt 泡泡生成、漂移、碰撞、计分 ├── GestureEngine.kt 关键点 → 手的位置 ├── OneEuroFilter.kt 1€ 滤波 ├── SoundPlayer.kt 合成音效 └── PoseTypes.kt 枚举与配色 app/src/main/assets/pose_landmarker_lite.task MediaPipe 姿态模型(约 5.7MB) ``` ## 构建 需要 JDK 17+、Android SDK(platform 35 + build-tools 35)。用 Android Studio 直接打开本目录即可。 命令行: ```bash export JAVA_HOME=/path/to/jdk21 export ANDROID_HOME=$HOME/Library/Android/sdk ./gradlew :app:assembleDebug adb install -r app/build/outputs/apk/debug/app-debug.apk ``` ## 在模拟器里试 Android 模拟器可以把 Mac 的摄像头直通给虚拟设备,所以体感能真跑(这点比 iOS 模拟器强): ```bash emulator -avd <名字> -camera-front webcam0 -camera-back none ``` 首次启动会弹系统授权,允许模拟器用摄像头即可。 ## 调试面板 底部齿轮按钮打开(内容随模式变化): - 手掌大小 / 手臂伸长:手感不对时先调这两个 - 泡泡速度 / 炸弹多少 / 小可爱多少 - 识别灵敏度:置信度门槛,太高会漏关节,太低会有「幽灵手臂」 - 音效 / 记住模式 / 显示骨架 / 显示取景框 「记住模式」打开后,下次启动直接进上次的玩法,不用再过菜单。 ## 几个实现要点 - **坐标统一**:关键点在 `PoseAnalyzer` 里就换算成视图归一化坐标(原点左上,0…1), 顺手处理了前置摄像头的镜像;上层完全不用关心分辨率、旋转、裁剪。 预览是 FILL_CENTER,所以按长边比例缩放 + 居中偏移;屏幕转的时候要同步 `ImageAnalysis.targetRotation`, 否则关键点会歪 90°。 - **三态取景框**:灰=没看到人,黄=看到人但手不在画面里,绿=稳定锁定且手可见。 只给「有/没有」两态会让人以为「明明识别到了怎么拍不到」——这游戏的输入是手。 - **退火**:丢帧时稳定计数每帧 -2,连续 14 帧才清空画面,避免框和骨架闪烁。 - **切模式会重建玩家流水线**,滤波器和手势引擎都是每玩家独立的。