Cocos Creator编写新手引导模块,如何让玩家只能点击允许点击的按钮?
前言
新手引导,是每个做游戏的人都逃不过的宿命……
这玩意,做简单了,跟没做一样。
做复杂了,也跟没做一样恨不得自己写一套脚本。
怎样在简单和复杂之间找到平衡点,是一门讨价还价的艺术。
方案
新手引导中,最怕的是什么?
最怕的是,玩家不按套路出牌。
所以,只允许玩家点击允许点击的位置,虽然比较生硬,但是是比较常见的做法。
简单列一下步骤:
- 标记可操作区域(俗称“掏洞”)
首先,通常会先把按钮所在区域用高亮显示,提示玩家“只有这里可以点”。
Cocos Creator中,提供了Mask组件,勾选inverted(反向遮罩),可以快速的进行掏洞。
这个组件会在子节点上掏出一个洞来,所以添加一个半透明的黑色子节点,就可以显示高亮区域了。
像这样子:
- 判断玩家的触摸操作是否在可操作区域
需要在操作区域上方添加一个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/
- 吞噬不在可操作区域内的触摸事件
如果该操作不在可操作区域内,则需要将该事件吞噬,需要调用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;