鸿蒙游戏中的手势系统详解


网罗开发 (小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验 。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员

👋 大家好,我是展菲!

📱 全网搜索"展菲",即可纵览我在各大平台的知识足迹。

每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。

文章目录

引言

很多开发者第一次做鸿蒙游戏时,对"手势"都有一个非常简单的理解:

ts 复制代码
TapGesture()

或者:

ts 复制代码
PanGesture()

然后就结束了。但当游戏复杂起来以后,你会发现:

复制代码
点击只是开始
拖拽需要状态
缩放需要协同
摇杆需要持续输入
技能释放需要组合手势

这时候问题就来了:

手势到底是 UI 功能,还是游戏系统?

很多项目后期越来越乱,根本原因就在这里:

ts 复制代码
UI处理手势
UI修改状态
UI触发逻辑

最后变成:

复制代码
UI = 输入层
UI = 逻辑层
UI = 状态层

整个架构直接失控,所以我们讨论一个核心问题:

鸿蒙游戏中的手势系统,到底应该如何设计?

一、手势的本质是什么?

很多人认为:

复制代码
手势 = 操作

实际上不是,对于游戏来说:

手势本质是输入事件(Input Event)

例如:

点击

ts 复制代码
Tap

代表:

复制代码
用户发起了一次输入

拖拽

ts 复制代码
Pan

代表:

复制代码
用户持续输入方向信息

双指缩放

ts 复制代码
Pinch

代表:

复制代码
用户希望改变视角

所以:

手势不是业务逻辑,而是输入信号。

二、很多项目为什么会失控?

先看一个真实项目经常出现的代码:

ts 复制代码
TapGesture()
.onAction(() => {

  store.hp -= 10

  enemy.hp -= 20

  dropSystem.drop()

})

看起来很方便,但问题巨大:

复制代码
UI直接改状态
UI直接调System
UI知道业务细节

结果:

复制代码
无法复用
无法测试
无法扩展

三、正确架构:Input System

正确模型应该是:

text 复制代码
Gesture
    ↓
InputSystem
    ↓
System
    ↓
Store
    ↓
UI

这里有一个关键变化:

手势不再驱动游戏,而是驱动 InputSystem。

四、第一步:统一输入模型

不要让:

ts 复制代码
TapGesture
PanGesture
PinchGesture

直接进入业务层,统一转换为:

ts 复制代码
enum InputAction {

  ATTACK,

  MOVE,

  SKILL,

  CAMERA

}

例如:

点击攻击按钮

ts 复制代码
TapGesture()

转换:

ts 复制代码
InputAction.ATTACK

摇杆拖动

ts 复制代码
PanGesture()

转换:

ts 复制代码
InputAction.MOVE

这样:

System 永远不知道用户用了什么手势。

它只知道:

ts 复制代码
用户要移动

五、第二步:InputSystem 接管手势

ts 复制代码
class InputSystem {

  dispatch(action: InputAction) {

    switch(action) {

      case ATTACK:
        battleSystem.attack(store)
        break

      case MOVE:
        moveSystem.move(store)
        break

    }

  }

}

这里非常关键:

复制代码
UI 不知道 BattleSystem
UI 不知道 MoveSystem

全部通过:

ts 复制代码
InputSystem

转发。

六、拖拽为什么最容易写崩?

因为拖拽不是:

text 复制代码
一次事件

而是:

text 复制代码
连续事件

例如:

ts 复制代码
PanGesture()
.onActionUpdate(...)

会不断触发:

text 复制代码
x
y
dx
dy

如果直接写:

ts 复制代码
store.playerX += dx

很快就会出问题:

复制代码
性能下降
状态混乱
多端不同步

正确方式:

ts 复制代码
InputAction.MOVE

传递给:

ts 复制代码
MoveSystem

由系统统一计算。

七、摇杆系统其实是手势系统

很多人以为:

复制代码
摇杆是UI组件

其实不是,本质上:

text 复制代码
摇杆 = PanGesture

只是经过转换:

ts 复制代码
(dx, dy)

变成:

ts 复制代码
(directionX, directionY)

然后交给:

ts 复制代码
MoveSystem

处理,所以:

摇杆本质是持续输入系统。

八、技能释放如何设计?

复杂游戏经常会出现:

text 复制代码
点击
长按
滑动
组合拖拽

例如:

text 复制代码
点击 = 普攻

长按 = 蓄力

拖动 = 指定方向

很多项目会写:

ts 复制代码
if (...)

然后:

ts 复制代码
if (...)

再:

ts 复制代码
if (...)

最后变成:

复制代码
一团乱麻

正确方式,统一进入:

ts 复制代码
SkillInputSystem

例如:

ts 复制代码
SkillCommand {
  type: CHARGE_ATTACK
  direction: vector
}

然后:

ts 复制代码
SkillSystem.execute()

九、多端场景为什么更重要?

鸿蒙最大的特点:

复制代码
手机
平板
PC
TV

输入方式完全不同。

手机:

text 复制代码
触摸

PC:

text 复制代码
鼠标
键盘

TV:

text 复制代码
遥控器

如果业务层直接依赖:

ts 复制代码
TapGesture

就废了。

正确做法,统一转换:

ts 复制代码
InputAction

例如:

text 复制代码
Tap
MouseClick
RemoteClick

全部映射:

ts 复制代码
ATTACK

于是:

System 永远不关心输入设备。

十、AISystem 其实也是输入源

这是很多人忽略的一点,玩家输入:

ts 复制代码
ATTACK

AI输入:

ts 复制代码
ATTACK

本质一样,所以:

text 复制代码
UserInput
AIInput

都应该进入:

ts 复制代码
InputSystem

最终形成:

text 复制代码
Gesture
Keyboard
Mouse
AI
      ↓
 InputSystem
      ↓
    System
      ↓
    Store
      ↓
      UI

十一、一个关键认知升级

初学者理解:

text 复制代码
手势 = UI功能

进阶之后理解:

text 复制代码
手势 = 输入设备

再进一步:

手势只是游戏状态变化的触发器。

真正决定世界如何变化的,仍然是:

text 复制代码
System

总结

鸿蒙游戏中的手势系统,本质不是:

text 复制代码
TapGesture
PanGesture
PinchGesture

而是:

text 复制代码
Input System

推荐最终架构:

text 复制代码
Gesture
Keyboard
Mouse
AI
      ↓
 InputSystem
      ↓
 BattleSystem
 MoveSystem
 SkillSystem
      ↓
    Store
      ↓
      UI

如果用一句话总结:

在鸿蒙游戏中,手势只是输入,System 才是行为的真正执行者。

相关推荐
不羁的木木1 小时前
Form Kit(卡片开发服务)学习笔记02-环境搭建与基础配置
笔记·学习·harmonyos
G_dou_2 小时前
# Flutter+OpenHarmony 实战:ToDo待办清单
flutter·harmonyos
不羁的木木2 小时前
Form Kit(卡片开发服务)学习笔记04-交互事件与跳转处理
笔记·学习·交互·harmonyos
不爱吃糖的程序媛10 小时前
Flutter 三方库适配鸿蒙教程
flutter·华为·harmonyos
不羁的木木11 小时前
HarmonyOS文件基础服务(Core File Kit)实战演练04-文件监听与流式读写
华为·harmonyos
不羁的木木12 小时前
ArkWeb实战学习笔记05-综合实战:构建混合应用
笔记·学习·harmonyos
kyh100338112013 小时前
Cocos Creator 《打螺丝消除游戏》源码+实现
游戏·微信小程序·小程序·打螺丝小游戏源码·微笑小游戏源码
芒鸽13 小时前
鸿蒙应用测试实战:从单元测试到自动化测试
华为·单元测试·harmonyos
Davina_yu14 小时前
Hello HarmonyOS:搭建DevEco Studio开发环境与第一个应用运行(1)
harmonyos·鸿蒙原生开发