画矩形c语言pta,Cocos2d-x:裁剪节点圆角矩形(将节点处理成圆角)

核心:

1、首先需要使用上节提到的ClippingNode进行裁剪;

2、绘制圆角矩形模版;

3、用模版去裁剪;

定义静态方法:

ClippingNode* drawRoundRect(Node *newNode,float radius,unsigned int segments);

具体实现:

/*

* @brief 画圆角矩形模版,并裁剪节点

* @param origin 矩形开始点

* @param destination 矩形结束点

* @param radius 圆角半径

* @param segments 圆角等份数,等份越多,圆角越平滑

* @attention

*/

ClippingNode* MapLayer::drawRoundRect(Node* newNode,unsigned int segments){

Point origin = newNode->getPosition();

Point destination = Point(newNode->getPosition().x + newNode->getContentSize().width,newNode->getPosition().y + newNode->getContentSize().height);

ClippingNode* pClip = ClippingNode::create();

pClip->setInverted(false);//设置是否反向,将决定画出来的圆是透明的还是黑色的

pClip->setAnchorPoint(Point(0,0));

//算出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;

// log("%f,%f",thisPolygonPt->x,thisPolygonPt->y);

++aa;

}

//右上角

tagCenter.x = maxX - radius;

tagCenter.y = maxY - radius;

thisVertices = vertices + segments;

for (unsigned int i = 0; i <= segments; ++i,--thisVertices)

{

thisPolygonPt->x = tagCenter.x + thisVertices->x;

thisPolygonPt->y = tagCenter.y + thisVertices->y;

// log("%f,thisPolygonPt->y);

++aa;

}

//右下角

tagCenter.x = maxX - radius;

tagCenter.y = minY + radius;

thisVertices = vertices;

for (unsigned int i = 0; i <= segments; ++i,++thisVertices)

{

thisPolygonPt->x = tagCenter.x + thisVertices->x;

thisPolygonPt->y = tagCenter.y - thisVertices->y;

// log("%f,thisPolygonPt->y);

++aa;

}

//左下角

tagCenter.x = minX + radius;

tagCenter.y = minY + radius;

thisVertices = vertices + segments;

for (unsigned int i = 0; i <= segments; ++i,--thisVertices)

{

thisPolygonPt->x = tagCenter.x - thisVertices->x;

thisPolygonPt->y = tagCenter.y - thisVertices->y;

// log("%f,thisPolygonPt->y);

++aa;

}

//设置参数

static Color4F red(1,1);//顶点颜色设置为红色,参数是R,G,B,透明度

//注意不要将pStencil addChild

DrawNode *pStencil = DrawNode::create();

pStencil->drawPolygon(pPolygonPtArr,dwPolygonPtMax,red,red);//绘制这个多边形

pStencil->setPosition(Point(0,0));

pClip->setStencil(pStencil);

pClip->addChild(newNode,1);

pClip->setContentSize(newNode->getContentSize());

CC_SAFE_DELETE_ARRAY(vertices);

CC_SAFE_DELETE_ARRAY(pPolygonPtArr);

return pClip;

}

其中,实现了圆角矩形模板、并根据模板才用ClippingNode对newNode节点进行裁剪。

// 裁剪圆角

auto newCardNode = CSLoader::createNode("node_layer.csb");

// 裁剪圆角

auto newNode = this->drawRoundRect(newCardNode,16,200);

newNode->setPosition(cardNode->getPosition());

newNode->setScale(0.85);

rootNode->addChild(newNode,4);//4

oldNode->setVisible(false);

将裁剪后的Node加入到我们自己的根节点rootNode,替换原来的oldNode,并将oldNode设置为InVisible。这样我们就得到了裁剪后的圆角矩形。

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值