最近在作的一款游戏中,用到点与旋转矩形的断定来得到一个选中的物体。在此作个记录
如图所示,黄色的颜料屏是旋转的,若是不作处理直接判断点是否在矩形中,那么点击红点的位置会断定为选中物体。显然这是不对的。
若是物体没有旋转,判断方法就很简单了。html
static isPositionInRect(point: cc.Vec2, rect: cc.Rect) { return point.x <= rect.x + rect.width/2 && point.x >= rect.x - rect.width/2 && point.y <= rect.y + rect.height /2&& point.y >= rect.y - rect.height /2; }
我这个矩形锚点为为(0.5,0.5),若是锚点不是(0.5,0.5)能够自行修改。
可是判断一个点在旋转后的矩形中就没有这么简单了。node
x2 = x * cos(O) - y * sin(O) y2 = x * sin(O) + y * cos(O)
获得了这个公式,咱们接下来就是要旋转触摸点了。不过这个时候咱们要肯定要绕哪一个点旋转,是坐标系的原点吗?不是的,而是咱们要碰撞的矩形的中心点,由于矩形是绕这个点旋转的。
编程
最终咱们获得一个完整的断定函数微信
/** * 判断点是否在旋转后的矩形中 * @param point 触摸点的坐标 * @param node 碰撞节点,锚点必须为(0.5,0.5) */ static isPosInRotationRect(point: cc.Vec2, node: cc.Node) { let hw = node.width / 2; let hh = node.height / 2 let O = node.angle; let center = node.position; let X = point.x let Y = point.y let r = -O * (Math.PI / 180) let nTempX = center.x + (X - center.x) * Math.cos(r) - (Y - center.y) * Math.sin(r); let nTempY = center.y + (X - center.x) * Math.sin(r) + (Y - center.y) * Math.cos(r); if (nTempX > center.x - hw && nTempX < center.x + hw && nTempY > center.y - hh && nTempY < center.y + hh) { return true; } return false }
以上就是如何断定一个点在旋转后的矩形中的一种方式。在网上搜索的时候发现有不少种实现方式,可是感受都比较繁琐。有兴趣的小伙伴能够本身去研究研究。不过用我这个断定函数已经能够达到目的了。函数
欢迎扫码关注公众号《微笑游戏》,浏览更多内容。.net