不规则精灵重叠点击问题

不行,判断不准确


用多边形检测不行吗

你是说Mask的图片遮罩还是碰撞组件的polygonCollider吗,这两个东西,mask会增加drawcall,多边形碰撞组件编辑麻烦,对几百个小地图手动编辑太复杂。

使用像素检测,检测点到对象里该坐标的颜色是否是透明的。

是这样想的,但是还没找到怎么去实现


正在参考这篇几年前的文章,用cocos新版本的TS语言去重写一下看看

不用 mask遮罩, 可以事先把图片的大致多边形区域算出,然后检测的时候只需要用cc.Intersection.pointInPolygon这个方法判断即可

正在研究怎么获得有颜色的不透明多边形区域,卡就卡在这里了。判断点在不在区域内有现成API好弄。

这个按钮了解一下

了解了,以前没用过这个按钮哈哈,这个作为备选方案。我再研究下那个像素检测的办法。

搞出来了,那个东西

放一个刚体在上面,然后做一次hittest就OK了

总结:
1,像素检测的办法
方案提供者:Frogince
分析:新版本官方建议用convertToNodeSpaceAR,精灵的锚点设置为(0,0),注意不能用自定义尺寸进行改变大小,可以用缩放的方式,SizeMode的选择。仅Web平台有效。
代码如下,绑定到需要的精灵上即可


2,多边形碰撞组件自动获得多边形区域点,
方案提供者:zhuhf zhuhangfeng
分析:适合数量较少,比较固定的节点。

image
判断点是否在区域内cc.Intersection.pointInPolygon
代码如下:


所以根据自己的需要,选择相应的方法吧,谢谢大家集思广益,踊跃参与。

1赞

:+1:很棒的意见,这个项目没用物理引擎,现在用的像素那个方法

像素的方法,第一个是getHtmlElemntObj这块,getTexture自动合图和不合图应该是有区别的,貌似得做一下兼容;第二点就是看起来只是用在web端的。第三点是这个脚本如果是挂载到图片上的,那么就得做一下事件吞噬的处理。要不然事件应该没法传递到下层吧。

image

第二点如果有很大的量的需要, 可以做一个插件,动态的生成节点,加图片,加PolygonCollide组件, 调用Regenerate Points方法(这个目前没找到怎么调), 保存, 解析出顶点数据,存到另一个json

这个一个图片几百个点,手动点那个按钮,都要卡几秒才出来。如果图太多,用代码动态的方式,可能初始化效率上有点慢

这么做的目的是先导出顶点,存储在一个json里面,然后在程序运行过程中, 只需要这个json中的顶点数据就行了, 不需要额外的使用PolygonCollider组件去动态获取

哦哦,但是有点花时间,在这个功能上。可行性倒是可以。