Cocos Creator编写新手引导模块,如何让玩家只能点击允许点击的按钮?

前言

新手引导,是每个做游戏的人都逃不过的宿命……

这玩意,做简单了,跟没做一样。
做复杂了,也跟没做一样恨不得自己写一套脚本。

怎样在简单和复杂之间找到平衡点,是一门讨价还价的艺术。

方案

新手引导中,最怕的是什么?

最怕的是,玩家不按套路出牌。

所以,只允许玩家点击允许点击的位置,虽然比较生硬,但是是比较常见的做法。

简单列一下步骤:

  1. 标记可操作区域(俗称“掏洞”)

首先,通常会先把按钮所在区域用高亮显示,提示玩家“只有这里可以点”。

Cocos Creator中,提供了Mask组件,勾选inverted(反向遮罩),可以快速的进行掏洞。

这个组件会在子节点上掏出一个洞来,所以添加一个半透明的黑色子节点,就可以显示高亮区域了。

像这样子:

  1. 判断玩家的触摸操作是否在可操作区域

需要在操作区域上方添加一个Node,监听触摸事件。

根据需要,可以只监听触摸初始 cc.Node.EventType.TOUCH_START事件。

然后检查触摸的坐标(默认是世界坐标),是否在高亮区域中。

一般来说,通过矩形判定就好了,并不需要做到像素级别的精准度。

所以,需要先获得可操作性区域在世界坐标下的矩形(一般不是boundingBox)。

这里需要注意下cc.rect的参数,x和y指的是rect的origin,也就是左下角。

https://xmanyou.com/cocos-creator-cc-rect-x-y-parameter-means-origin/

  1. 吞噬不在可操作区域内的触摸事件

如果该操作不在可操作区域内,则需要将该事件吞噬,需要调用cc.Node.touchListener.setSwallowTouches(true)

注意,只调用event.stopPropagation是不够的。

参考代码:

   let pos = evt.getLocation();
   if(!this._inputArea.contains(pos)){
       // 不在高亮区域内则禁止继续传递并吞噬该事件
       evt.stopPropagation();
       this.inputTestLayer["_touchListener"].setSwallowTouches(true);
       // return true; // 返回true和stopPropagation效果一样,表示不再传递该事件
   }
   // return false;

参考