和旋转后的矩形碰撞


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;
    },
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值