1. 项目概述
作为一名长期从事跨平台开发的工程师,我最近在探索Flutter在OpenHarmony平台上的应用可能性。俄罗斯方块这个经典游戏成为了我的实验对象,它不仅能够验证Flutter在OpenHarmony上的表现,还能展示跨平台开发的强大之处。
在前两篇文章中,我们已经完成了游戏核心逻辑和界面渲染的实现。现在,我们需要让游戏真正"活"起来——通过键盘和触摸控制方块移动,管理游戏状态,处理各种交互场景。这些功能对于任何游戏开发来说都是至关重要的核心环节。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 键盘事件监听实现
2.1 RawKeyboardListener深度解析
在Flutter中处理键盘事件,RawKeyboardListener是我们的首选工具。这个Widget提供了一个低级别的键盘事件监听接口,让我们能够捕获几乎所有的键盘输入。
dart复制RawKeyboardListener(
focusNode: _focusNode,
onKey: _handleKeyEvent,
autofocus: true,
child: Scaffold(
// 游戏主界面
body: GameBoard(),
),
)
这里有几个关键点需要注意:
focusNode是必须的,它管理着Widget的焦点状态onKey回调会接收所有的键盘事件autofocus设置为true可以让Widget在创建时自动获取焦点
重要提示:记得在State的dispose()方法中释放FocusNode资源,否则会导致内存泄漏。
2.2 按键映射策略
处理按键事件时,我们需要考虑几个方面:
- 只响应按键按下事件(KeyDown)
- 支持多种按键布局(方向键和WASD)
- 防止按键重复触发
dart复制void _handleKeyEvent(RawKeyEvent event) {
if (event is! RawKeyDownEvent) return;
final logicalKey = event.logicalKey;
if (logicalKey == LogicalKeyboardKey.arrowLeft ||
logicalKey == LogicalKeyboardKey.keyA) {
_game.moveLeft();
}
// 其他按键处理...
}
我建议使用LogicalKeyboardKey而不是PhysicalKeyboardKey,因为前者与按键的功能相关,后者与物理位置相关,更适合处理不同键盘布局的情况。
2.3 多按键布局支持
为了照顾不同玩家的习惯,我实现了两套控制方案:
| 功能 | 主按键 | 备选按键 |
|---|---|---|
| 左移 | 左箭头(←) | A键 |
| 右移 | 右箭头(→) | D键 |
| 加速下落 | 下箭头(↓) | S键 |
| 旋转 | 上箭头(↑) | W键/Space键 |
| 暂停/继续 | P键 | 无 |
这种设计让习惯WASD控制的PC游戏玩家和习惯方向键的玩家都能舒适地操作。
3. 触摸控制实现
3.1 移动端控制UI设计
在移动设备上,我们需要设计直观的触摸控制界面。我的设计方案包括:
- 方向控制区:模拟传统方向键布局
- 功能按钮区:放置旋转和暂停按钮
- 视觉反馈:按钮按下时有明显的状态变化
dart复制Widget _buildControls() {
return Container(
padding: EdgeInsets.all(12),
decoration: BoxDecoration(
color: Colors.grey[850],
borderRadius: BorderRadius.circular(10),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
// 旋转按钮
_buildControlButton('↻', () => _game.rotate()),
SizedBox(height: 8),
// 方向控制
Row(
mainAxisSize: MainAxisSize.min,
children: [
_buildControlButton('←', () => _game.moveLeft()),
SizedBox(width: 8),
_buildControlButton('↓', () => _game.moveDown()),
SizedBox(width: 8),
_buildControlButton('→', () => _game.moveRight()),
],
),
],
),
);
}
3.2 按钮交互优化
为了让触摸控制更加友好,我实现了以下优化:
- 按钮大小自适应:根据屏幕尺寸动态调整
- 触觉反馈:使用HapticFeedback在按钮按下时提供震动反馈
- 视觉反馈:按钮按下时改变颜
