MGeo地址匹配镜像评测:开箱即用,专为中文地址场景优化
2026/4/15 6:25:18
为了提供良好的用户体验,我们实现了双控制系统:屏幕触控按钮和键盘控制。触控按钮方便移动端操作,键盘控制适合PC端开发调试。本文将详细讲解两种控制方式的实现。
采用经典的D-Pad布局(十字方向键):
if(!isGameOver)Container(padding:constEdgeInsets.all(20),child:Column(children:[// 上按钮(单独一行)Row(mainAxisAlignment:MainAxisAlignment.center,children:[_buildControlButton(Icons.arrow_upward,(){_changeDirection(Direction.up);}),],),constSizedBox(height:10),// 左、暂停、右按钮(一行三个)Row(mainAxisAlignment:MainAxisAlignment.center,children:[_buildControlButton(Icons.arrow_back,(){_changeDirection(Direction.left);}),constSizedBox(width:20),_buildControlButton(isPaused?Icons.play_arrow:Icons.pause,(){setState((){isPaused=!isPaused;});},),constSizedBox(width:20),_buildControlButton(Icons.arrow_forward,(){_changeDirection(Direction.right);}),],),constSizedBox(height:10),// 下按钮(单独一行)Row(mainAxisAlignment:MainAxisAlignment.center,children:[_buildControlButton(Icons.arrow_downward,(){_changeDirection(Direction.down);}),],),],),),布局特点:
Widget_buildControlButton(IconDataicon,VoidCallbackonPressed){returnContainer(width:60,height:60,decoration:BoxDecoration(color:Colors.green,borderRadius:BorderRadius.circular(12),),child:IconButton(icon:Icon(icon,color:Colors.white,size:30),onPressed:onPressed,),);}样式特点:
_buildControlButton(Icons.arrow_upward,(){_changeDirection(Direction.up);})事件流程:
KeyboardListener(focusNode:_focusNode,onKeyEvent:_handleKeyEvent,child:Scaffold(// 游戏内容),)组件说明:
Flutter中KeyEvent有两种类型:
void_handleKeyEvent(KeyEventevent){if(eventisKeyDownEvent){// 按键按下// 处理按键}if(eventisKeyUpEvent){// 按键抬起// 一般不处理}}事件类型:
latefinalFocusNode_focusNode;@overridevoidinitState(){super.initState();_focusNode=FocusNode();_focusNode.requestFocus();// 请求焦点}@overridevoiddispose(){_focusNode.dispose();// 释放焦点super.dispose();}FocusNode作用:
重要提示:
caseLogicalKeyboardKey.keyW:_changeDirection(Direction.up);return;caseLogicalKeyboardKey.keyS:_changeDirection(Direction.down);return;caseLogicalKeyboardKey.keyA:_changeDirection(Direction.left);return;caseLogicalKeyboardKey.keyD:_changeDirection(Direction.right);return;WASD布局:
W A S DcaseLogicalKeyboardKey.arrowUp:_changeDirection(Direction.up);return;caseLogicalKeyboardKey.arrowDown:_changeDirection(Direction.down);return;caseLogicalKeyboardKey.arrowLeft:_changeDirection(Direction.left);return;caseLogicalKeyboardKey.arrowRight:_changeDirection(Direction.right);return;方向键布局:
↑ ← ↓ →Flutter的LogicalKeyboardKey枚举提供跨平台的按键映射:
import'package:flutter/services.dart';switch(event.logicalKey){caseLogicalKeyboardKey.keyW:caseLogicalKeyboardKey.arrowUp:_changeDirection(Direction.up);return;// ...}优势:
caseLogicalKeyboardKey.space:setState((){isPaused=!isPaused;});return;功能说明:
caseLogicalKeyboardKey.keyR:if(isGameOver){_initGame();}return;功能说明:
@overridevoidinitState(){super.initState();_focusNode=FocusNode();_focusNode.requestFocus();// 自动获取焦点_initGame();}为什么需要自动获取焦点?
class_GameHomePageStateextendsState<GameHomePage>{latefinalFocusNode_focusNode;@overridevoidinitState(){super.initState();_focusNode=FocusNode();_focusNode.requestFocus();_initGame();}void_changeDirection(DirectionnewDirection){if((direction==Direction.up&&newDirection!=Direction.down)||(direction==Direction.down&&newDirection!=Direction.up)||(direction==Direction.left&&newDirection!=Direction.right)||(direction==Direction.right&&newDirection!=Direction.left)){nextDirection=newDirection;}}void_handleKeyEvent(KeyEventevent){if(eventisKeyDownEvent){switch(event.logicalKey){caseLogicalKeyboardKey.keyW:caseLogicalKeyboardKey.arrowUp:_changeDirection(Direction.up);return;caseLogicalKeyboardKey.keyS:caseLogicalKeyboardKey.arrowDown:_changeDirection(Direction.down);return;caseLogicalKeyboardKey.keyA:caseLogicalKeyboardKey.arrowLeft:_changeDirection(Direction.left);return;caseLogicalKeyboardKey.keyD:caseLogicalKeyboardKey.arrowRight:_changeDirection(Direction.right);return;caseLogicalKeyboardKey.space:setState((){isPaused=!isPaused;});return;caseLogicalKeyboardKey.keyR:if(isGameOver){_initGame();}return;}}}@overridevoiddispose(){gameTimer?.cancel();_focusNode.dispose();super.dispose();}@overrideWidgetbuild(BuildContextcontext){returnKeyboardListener(focusNode:_focusNode,onKeyEvent:_handleKeyEvent,child:Scaffold(body:Column(children:[// 游戏画面Expanded(child:CustomPaint(painter:GamePainter(...),),),// 控制按钮if(!isGameOver)Container(padding:constEdgeInsets.all(20),child:Column(children:[Row(mainAxisAlignment:MainAxisAlignment.center,children:[_buildControlButton(Icons.arrow_upward,(){_changeDirection(Direction.up);}),],),constSizedBox(height:10),Row(mainAxisAlignment:MainAxisAlignment.center,children:[_buildControlButton(Icons.arrow_back,(){_changeDirection(Direction.left);}),constSizedBox(width:20),_buildControlButton(isPaused?Icons.play_arrow:Icons.pause,(){setState((){isPaused=!isPaused;});},),constSizedBox(width:20),_buildControlButton(Icons.arrow_forward,(){_changeDirection(Direction.right);}),],),constSizedBox(height:10),Row(mainAxisAlignment:MainAxisAlignment.center,children:[_buildControlButton(Icons.arrow_downward,(){_changeDirection(Direction.down);}),],),constSizedBox(height:10),Text('或使用 WASD / 方向键控制',style:TextStyle(fontSize:14,color:Colors.grey[400],),),],),),],),),);}Widget_buildControlButton(IconDataicon,VoidCallbackonPressed){returnContainer(width:60,height:60,decoration:BoxDecoration(color:Colors.green,borderRadius:BorderRadius.circular(12),),child:IconButton(icon:Icon(icon,color:Colors.white,size:30),onPressed:onPressed,),);}}操作演示:
双系统优势:
本文讲解了双控制系统实现:
关键要点:
下篇预告:《Flutter for OpenHarmony 实战:开发调试中的三个典型Bug》
欢迎加入开源 OpenHarmony 跨平台社区,获取更多技术支持和资源:
如果本文对您有帮助,欢迎点赞、收藏和评论。您的支持是我持续创作的动力!