Cocos2d-x绘制圆角矩形

来源:互联网 发布:ubuntu 14.10下载 编辑:程序博客网 时间:2024/06/06 06:49

原文:点击打开链接


/*
* @brief        画圆角矩形    
* @param        origin            矩形开始点
* @param        destination        矩形结束点
* @param        radius            圆角半径
* @param        segments        圆角等份数,等份越多,圆角越平滑
* @param        bFill            是否填充
* @param        color            填充颜色
* @attention        
*/
void DrawPrimitivesTest::ccDrawRoundRect( Point origin, Point destination, float radius, unsigned int segments, bool bFill, Color4F color)
{
        //算出1/4圆
    
    const float coef    = 0.5f * (float)M_PI / segments;
    Point * vertices    = new Point[segments + 1];
    Point * thisVertices = vertices;
    for(unsigned int i = 0; i <= segments; ++i, ++thisVertices)
    {
        float rads        = (segments - i)*coef;
        thisVertices->x    = (int)(radius * sinf(rads));
        thisVertices->y    = (int)(radius * cosf(rads));
    }
    //
    Point tagCenter;
    float minX    = MIN(origin.x, destination.x);
    float maxX    = MAX(origin.x, destination.x);
    float minY    = MIN(origin.y, destination.y);
    float maxY    = MAX(origin.y, destination.y);
    
    unsigned int dwPolygonPtMax = (segments + 1) * 4;
    Point * pPolygonPtArr = new Point[dwPolygonPtMax];
    Point * thisPolygonPt = pPolygonPtArr;
    int aa = 0;
    //左上角
    tagCenter.x        = minX + radius;
    tagCenter.y        = maxY - radius;
    thisVertices    = vertices;
    for(unsigned int i = 0; i <= segments; ++i, ++thisPolygonPt, ++thisVertices)
    {
        thisPolygonPt->x    = tagCenter.x - thisVertices->x;
        thisPolygonPt->y    = tagCenter.y + thisVertices->y;
        ++aa;
    }
    //右上角
    tagCenter.x        = maxX - radius;
    tagCenter.y        = maxY - radius;
    thisVertices    = vertices + segments;
    for(unsigned int i = 0; i <= segments; ++i, ++thisPolygonPt, --thisVertices)
    {
        thisPolygonPt->x    = tagCenter.x + thisVertices->x;
        thisPolygonPt->y    = tagCenter.y + thisVertices->y;
        ++aa;
    }
    //右下角
    tagCenter.x        = maxX - radius;
    tagCenter.y        = minY + radius;
    thisVertices    = vertices;
    for(unsigned int i = 0; i <= segments; ++i, ++thisPolygonPt, ++thisVertices)
    {
        thisPolygonPt->x    = tagCenter.x + thisVertices->x;
        thisPolygonPt->y    = tagCenter.y - thisVertices->y;
        ++aa;
    }
    //左下角
    tagCenter.x        = minX + radius;
    tagCenter.y        = minY + radius;
    thisVertices    = vertices + segments;
    for(unsigned int i = 0; i <= segments; ++i, ++thisPolygonPt, --thisVertices)
    {
        thisPolygonPt->x    = tagCenter.x - thisVertices->x;
        thisPolygonPt->y    = tagCenter.y - thisVertices->y;
        ++aa;
    }
    
    if(bFill){
        DrawPrimitives::drawSolidPoly(pPolygonPtArr, dwPolygonPtMax, color);
    }else
    {
        DrawPrimitives::setDrawColor4F(color.r, color.g, color.b, color.a);
        DrawPrimitives::drawPoly(pPolygonPtArr, dwPolygonPtMax, true);
    }
    
    CC_SAFE_DELETE_ARRAY(vertices);
    CC_SAFE_DELETE_ARRAY(pPolygonPtArr);

}


/** * @brief        画圆角矩形 * @param        origin            矩形开始点 * @param        destination        矩形结束点 * @param        radius            圆角半径 * @param        segments        圆角等份数,等份越多,圆角越平滑 * @param        bFill            是否填充 * @param        color            填充颜色 * @attention */ccDrawRoundRect:function(bgSpr, origin, destination, radius, segments){    var pClip = new cc.ClippingNode();    // 设置是否反向,将决定画出来的圆是透明的还是黑色的    pClip.setInverted(false);    pClip.setAnchorPoint(cc.p(0, 0));    pClip.setPosition(cc.p(-7, -7));    // 算出1/4圆    var coef = 0.5*Math.PI/segments;    var vertices = new Array(segments+1);    for(var i=0; i<= segments;i++){        var rads = (segments-i)*coef;        vertices[i].x = parseInt(radius*Math.sin(rads));        vertices[i].y = parseInt(radius*Math.cos(rads));    }    //    var tagCenter;    var minX = Math.min(origin.x, destination.x);    var maxX = Math.min(origin.x, destination.x);    var minY = Math.min(origin.y, destination.y);    var maxY = Math.min(origin.y, destination.y);    var polygonArr = new Array((segments+1)*4);    var aa = 0;    //左上角    tagCenter.x = minX + radius;    tagCenter.y = maxY - radius;    for(var i=0; i<=segments;i++){        polygonArr[i].x = tagCenter.x-vertices[i].x;        polygonArr[i].y = tagCenter.y+vertices[i].y;        aa = aa+1;    }    //右上角    tagCenter.x = maxX - radius;    tagCenter.y = maxY - radius;    var initVal = aa;    for(var i=initVal; i<=(initVal+segments);i++){        polygonArr[i].x = tagCenter.x+vertices[segments-(i-initVal)].x;        polygonArr[i].y = tagCenter.y+vertices[segments-(i-initVal)].y;        aa = aa+1;    }    //右下角    tagCenter.x = maxX - radius;    tagCenter.y = minY + radius;    var initVal = aa;    for(var i=initVal; i<=(initVal+segments);i++){        polygonArr[i].x = tagCenter.x+vertices[i-initVal].x;        polygonArr[i].y = tagCenter.y-vertices[i-initVal].y;        aa = aa+1;    }    //左下角    tagCenter.x = minX + radius;    tagCenter.y = minY + radius;    var initVal = aa;    for(var i=initVal; i<=(initVal+segments);i++){        polygonArr[i].x = tagCenter.x-vertices[segments-(i-initVal)].x;        polygonArr[i].y = tagCenter.y-vertices[segments-(i-initVal)].y;        aa = aa+1;    }    var pStencil = new cc.DrawNode();    pStencil.drawPoly(polygonArr, (segments+1)*4, false, {r:1.0, g:0, b:0, a:1});    pStencil.setPosition(cc.p(0, 0));    pClip.setStencil(pStencil);    pClip.addChild(bgSpr, 1);    pClip.setContentSize(bgSpr.getContentSize());    return pClip;}

0 0
原创粉丝点击