跳到主要内容

触摸输入、命中与事件边界

级别:首作必学。 输入代码要处理玩家意图、命中区域和当前是否允许操作,不能只监听一个点击事件。

从触摸到有效操作​

一次触摸可能开始在按钮内,结束在按钮外,也可能被系统取消。按下态应在结束、取消和禁用时恢复。点击通常在抬起时确认,拖拽则需要记录起始点、位移和当前手指标识。

Cocos UI 可以使用 Node.EventType.TOUCH_START、TOUCH_END、TOUCH_CANCEL 等事件。普通按钮优先使用 Button 组件及其事件配置;卡牌视图可用节点事件。避免同时在同一个按钮上绑定 Button 点击和自定义触摸完成,导致一次操作执行两遍。

处理多点与重复输入​

翻牌配对把每次有效操作转成 flip(cardId)。规则层拒绝已经翻开的牌和 resolving 阶段的输入。即使视图漏设禁用状态,也不能绕开这个约束。

拖拽游戏应在开始时认领一个触摸标识,其余手指按设计忽略或单独处理。不要把所有触摸合并成一个不断被覆盖的全局坐标。

命中与遮挡​

触摸不响应时检查:节点是否激活、UITransform 尺寸是否足够、父层级是否缩放、上层遮罩是否拦截、输入监听是否已注册。透明图片或空白区域也可能仍有命中矩形。

视觉按钮很小但触摸区很大时,要检查相邻操作的命中区是否重叠。手机上的手指会遮挡信息,拖拽目标和提示不应只出现在手指正下方。

事件传播与关闭遮罩​

弹窗通常需要外层阻止输入穿透,内部按钮正常接收。点击关闭按钮时,确认不会同时触发背景上的牌。按事件传播规则处理,不依赖“看起来已经盖住了”的视觉判断。

小练习​

分别尝试:按下后移出、两指同时点两张牌、快速双击同一张、弹窗打开时点棋盘、锁屏取消触摸。记录每种序列的预期与实际。

完成标准:一次有效操作只产生一次规则转换;取消后无残留按下态;无效操作不会扣回合。坐标转换见2D 空间。

参考:Cocos 节点事件、微信触摸对象。