加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cocos2dx图片精灵裁剪圆角矩形方法

发布时间:2020-12-14 17:05:23 所属栏目:百科 来源:网络整理
导读:在做项目中,需要对图片进行裁剪已统一所有图片的边角,在网上查找方法结合自己的项目,书写了一个专门做裁剪的函数,供大家参考; 本方法是对图片的边角进行像素点的裁剪,在使用中发现如果大料使用对图片的裁剪,对程序的性能还是有点影响的,会降低cocos2

在做项目中,需要对图片进行裁剪已统一所有图片的边角,在网上查找方法结合自己的项目,书写了一个专门做裁剪的函数,供大家参考;

本方法是对图片的边角进行像素点的裁剪,在使用中发现如果大料使用对图片的裁剪,对程序的性能还是有点影响的,会降低cocos2dx的帧率; ClippingNode* ccDrawRoundRect(cocos2d::Sprite *bgSprite,cocos2d::Vec2 origin,cocos2d::Vec2 destination,float radius,unsigned int segments){ Sprite *thisbgSprite = bgSprite; ClippingNode* pClip = ClippingNode::create(); pClip->setInverted(false);//设置是否反向,将决定画出来的圆是透明的还是黑色的 // this->addChild(pClip); pClip->setAnchorPoint(Point(0,0)); pClip->setPosition(-7,-7); //算出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(thisbgSprite,1); pClip->setContentSize(thisbgSprite->getContentSize()); CC_SAFE_DELETE_ARRAY(vertices); CC_SAFE_DELETE_ARRAY(pPolygonPtArr); return pClip; }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读