var boundingClass = { /* * 获取一个点旋转一定角度后的新坐标 * origin: 原点,就是p点环绕其转动的点 * p: 要旋转的点 * ro: 旋转角度 * 公式是 : * x0=(x-b)*cos(a)-(y-c)*sin(a); (x,y) ----P点 (b,c)----origin点 a----角度 * y0=(y-c)*cos(a)+(x-b)*sin(a); x1=x0+b; y1=y0+c; (x1,y1)----旋转后的点 *x2 = (x1 - x0) * cosa - (y1 - y0) * sina + x0 y2 = (y1 - y0) * cosa + (x1 - x0) * sina + y0 如果是顺时针旋转: x2 = (x1 - x0) * cosa + (y1 - y0) * sina + x0 y2 = (y1 - y0) * cosa - (x1 - x0) * sina + y0 */ getRectPoint:function(origin, p, angle ){ var radian = angle * Math.PI / 180; var originx = origin.x; var originy = origin.y; var px = p.x; var py = p.y; var x0 = (px - originx) * Math.cos(radian) + (py - originy) * Math.sin(radian) + originx; var y0 = (py - originy) * Math.cos(radian) - (px - originx) * Math.sin(radian) + originy; return cc.p(x0, y0); }, getRectEachPointFish:function(obj){ /* b c * |---------------------| * | | * | | | | |---------------------| a d 保存的坐标要按abcd的形式保存 */ var w = obj.width - 10; var h = obj.height/2; var objx = obj.x; var objy = obj.y; var fishTyID = obj.fishTypeID; //美人鱼 金龙单独处理 var fourPointArr = []; var startPointArr = [ cc.p(objx+(w>>1), objy+(h>>1)), cc.p(objx-(w>>1), objy+(h>>1)), cc.p(objx-(w>>1), objy-(h>>1)), cc.p(objx+(w>>1), objy-(h>>1)), ]; for(var i = startPointArr.length - 1; i >= 0; --i){ fourPointArr[i] = this.getRectPoint(obj, startPointArr[i], obj.getRotation()) } //obj.convertToNodeSpace(); //测试框 //var s_draw = null; //if(obj._thisParent.getChildByTag(100000000)){ // obj._thisParent.removeChildByTag(100000000); //} //s_draw = new cc.DrawNode(); //s_draw.setAnchorPoint(0, 0); //s_draw.drawPoly(fourPointArr, null, 0.8, cc.Color(Math.random(), Math.random(), Math.random() ,0)); //s_draw.setTag(100000000); //obj._thisParent.addChild(s_draw); startPointArr = []; obj = null; return fourPointArr; }, isContain:function(mp1, mp2, mp3, mp4, mp){ if (this.Multiply(mp, mp1, mp2) * this.Multiply(mp, mp4, mp3) <= 0 && this.Multiply(mp, mp4, mp1) * this.Multiply(mp, mp3, mp2) <= 0) return true; return false; }, Multiply:function(p1, p2, p0){ return ((p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y)); }, //获取子弹上面的点 getBulletPoint:function(obj){ var fourPointArr = []; var w = obj.width; var h = obj.height; var objx = obj.x; var objy = obj.y; var startPointArr = [ cc.p(objx+(w>>1), objy+(h>>1)), cc.p(objx-(w>>1), objy+(h>>1)), cc.p(objx, obj.y+(h>>1)), ]; for(var i = startPointArr.length - 1; i >= 0; --i){ fourPointArr[i] = this.getRectPoint(obj, startPointArr[i], obj.getRotation()); //obj.convertToNodeSpace() } //测试框 //var s_draw = null; //if(obj.getChildByTag(100000000)){ // obj.removeChildByTag(100000000); //} //s_draw = new cc.DrawNode(); //s_draw.setAnchorPoint(0, 0); //s_draw.drawPoly(startPointArr, null, 0.8, cc.Color(Math.random(), Math.random(), Math.random() ,0)); //s_draw.setTag(100000000); //obj.addChild(s_draw); //obj = null; return fourPointArr; }, rorationRectCollide:function(obj1, obj2) { var dis = this.getTowPointDistance(cc.p(obj1.x, obj1.y), cc.p(obj2.x, obj2.y)); if (dis <= obj1.width + obj2.height) { var arr1 = this.getRectEachPointFish(obj1); //获取四个顶点的坐标 var arr2 = this.getBulletPoint(obj2); for(var k = arr2.length - 1; k >= 0; --k){ if(this.isContain(arr1[0], arr1[1], arr1[2], arr1[3], arr2[k])){ return true; }else{ return false; } } } return false; }, };
和旋转后的矩形碰撞
最新推荐文章于 2024-03-09 23:17:06 发布