去年做了一款 TV 端游戏,跟手机游戏差别还挺大的。遥控器、手柄操作,焦点导航,都是些新东西。这篇记录一下 TV 盒子开发的核心要点和踩过的坑。
TV 游戏 vs 手机游戏
1 | ┌─────────────────────────────────────────────────────────────┐ |
常见 TV 设备类型
| 设备类型 | 典型产品 | 输入设备 | 系统版本 |
|---|---|---|---|
| Android TV | Mi Box, Nvidia Shield | 遥控器/手柄 | Android 8+ |
| 智能电视 | 小米电视, TCL | 遥控器 | 自研/Android |
| IPTV 机顶盒 | 华为, 中兴 | 专用遥控器 | Android 4.4+ |
| OTT 盒子 | Fire TV, Apple TV | 遥控器/手柄 | Fire OS/tvOS |
按键事件处理
Android 按键映射
1 | // 常见 TV 按键键值 |
Cocos2d-x 按键事件处理
Java 层按键分发
1 | // Cocos2dxGLSurfaceView.java |
关键注意事项:
- 必须冒泡:除返回键外,其他按键最好都冒泡给系统处理
- 返回键特殊处理:返回键冒泡会导致游戏直接切换到后台
- 部分盒子限制:有些机顶盒只能监听按下(onKeyDown)或抬起(onKeyUp)中的一个
C++ 层按键处理
1 | // TVInputManager.h |
1 | // TVInputManager.cpp |
UI 焦点导航系统
焦点管理架构
1 | ┌─────────────────────────────────────────┐ |
焦点导航实现
1 | // TVFocusManager.h |
1 | // TVFocusManager.cpp |
可聚焦按钮实现
1 | // TVButton.h |
1 | // TVButton.cpp |
踩坑记录
坑 1:Home 键无法监听
现象: 按 Home 键无法在游戏内捕获,直接返回系统桌面
原因: Home 键是系统级按键,普通应用无法拦截(安全机制)
解决方案:
1 | // 无法直接监听 Home 键,但可以通过生命周期感知 |
坑 2:部分盒子只能监听按下或抬起
现象: 某些机顶盒只触发 onKeyDown 或 onKeyUp 之一
解决方案:
1 | // 在按键管理器中统一处理 |
坑 3:返回键冒泡导致应用退出
现象: 按返回键时游戏直接退到后台,没有触发游戏内的返回处理
解决方案:
1 | // 关键:返回键消费事件,不冒泡给系统 |
坑 4:焦点丢失或无法导航
现象: 按方向键焦点没有按预期移动
常见原因和解决方案:
1 | // 1. 确保邻居节点正确设置 |
坑 5:不同厂商遥控器按键差异
现象: 不同品牌盒子的遥控器按键值不一致
解决方案:
1 | // 按键映射配置 |
UI 设计最佳实践
设计原则
1 | ┌─────────────────────────────────────────────────────────────┐ |
焦点指示器设计
1 | // 创建发光边框效果 |
写在最后
TV 盒子/机顶盒游戏开发的关键要点:
按键处理:
- 除返回键外,其他按键建议冒泡
- 兼容部分盒子只能监听按下或抬起的情况
- Home 键无法监听,通过生命周期处理
焦点导航:
- 实现焦点管理器处理方向键导航
- 每个可交互元素需要明确的邻居关系
- 提供清晰的焦点视觉反馈
UI 设计:
- 大字体大按钮,远距离可识别
- 简洁层级,避免过深的菜单
- 考虑电视过扫描的安全边距
兼容性:
- 不同厂商按键映射可能存在差异
- 需要在主流设备上进行充分测试
- 提供按键映射配置能力
有问题欢迎留言交流。