6.1 儿童节 CocosCreator 超级大礼包来啦!感觉一天假期不够用

为啥说是托呢,,,,

输入pdf没反应呀?

有效果的啊!

非常实用啊,太感谢了,

为啥我没有?

感谢感谢,辛苦

加我微信:z6346289 我发你吧!

感谢感谢,辛苦

新手关注了

mark!!!

哇,2020年的六一帖子都炸出了!欢迎大家明天来参活动!

https://weidian.com/?userid=1157275030&distributorId=1555671256

mmmmmmmmmmmmark

看了下,好像没有一个不规则形状的button实现,我说的不是采用camera摄像来判断像素的方式,因为这种方式会导致一个问题,那就是2个挨得特别近的不规则按钮会出现重叠问题

那就用polygonCollider包围盒来做不规则按钮,想要什么形状自己调。

可是我的按钮图片大小是没定死的,是需要动态加载按钮图片的,所以在编辑器中提前用polygonCollider是不现实的,这种方式只适合小白

//判断点p是否在多边形polygon内(含边上),polygon是顶点数组,每2个数代表一个顶点坐标
export function isCollidePointPolygon(px: number, py: number, polygon: number[]): boolean {
let flag = false;
for (let i = 0, len = polygon.length, j = len - 2; i < len; j = i, i += 2) {
let ax = polygon[i];
let ay = polygon[i + 1];
let bx = polygon[j];
let by = polygon[j + 1];
if (px === ax && py === ay || px === bx && py === by) return true;// 点与多边形顶点重合
if (ay === by && py === ay && (ax < px && px < bx || bx < px && px < ax)) return true;// 点的射线和多边形的一条边重合,并且点在边上
if ((ay < py && py <= by) || (by < py && py <= ay)) {// 判断线段两端点是否在射线两侧
let x = ax + (py - ay) * (bx - ax) / (by - ay);// 求射线和线段的交点x坐标,交点y坐标当然是py
if (x === px) return true;// 点在多边形的边上
if (x > px) flag = !flag;// x大于px来保证射线朝右
}
}
return flag;
}

这个我该怎么拿到?我现在遇到的是如何根据按钮图片来拿这个数据,因为按钮是动态的,按钮的图片是需要动态请求服务器的,所以我是根本不知道这些polygon: number[]到底是什么,当然我可以都存到数据库里面,但是如果可以从动态的btn的spriteFrame中获取到该图片对应的边界数组值,那不是更好吗?所以想问下各位到底有什么办法?记住我表述的特点:button的spriteFrame是动态请求网络得到的图片,并非前端提前知道的!
如下下图中的2个按钮:
image
不要想通过棱形来判断,这种棱形并非绝对的棱形(总之这种方式不行,pass)
如果是通过添加一个新的摄像机来判断像素也是不行的,我试过,因为2个按钮是重叠在一起的,如果红色按钮节点在后面,则通过这种方式后,我点击重叠部分是判断不到我点中了黑色按钮。。。
而且这2张图片是按钮,但是按钮图片又没定死,也就是可能大一点,可能小一点,可能不是那么棱形化,比如不一定是60度角,也可能是50等等角度,总之图片是不定死的
就论坛上面的人的所有解决方案,我找不到任何一种,真的有老哥可以给点思路吗?

多边形的顶点数据也让服务器传给你啊

所以我就是想有没有通过前端获取顶点数据的方法?

取到图片像素数据,然后逐行从左往右遍历,透明像素flag = false,有颜色的像素flag = true;当flag发生变化时就是轮廓点,记录到顶点数组。
大部分情况不需要逐行,间隔几行遍历一次就行。
但是写这个还不如让美术直接把顶点量出来给你,放到服务器上,跟图片一起传过来简单又高效。