和旋轉後的矩形碰撞


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章