COCOS2dx 3.5 实现带白色边框圆形头像功能

本文介绍了一种在Cocos2d-x中实现平滑无锯齿圆形头像的方法。利用ClippingNode结合额外的圆环图片,解决了实心圆形蒙层带来的锯齿问题。分享了具体的实现代码及使用步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cocos下实现圆形头像最初始考虑的是ClippingNode,但是无论实心圆形蒙层使用DrawNode还是图片都会遮罩出很严重的锯齿

于是取个巧,使用实体圆蒙层后,在上层再盖一个无锯齿的圆环,做出来最终的效果,自我感觉还可以

把工具类取出来保存:


头文件UserIconSprite.h:

#ifndef __Ci__UserIconSprite__
#define __Ci__UserIconSprite__

#include <stdio.h>
#include <cocos2d.h>

USING_NS_CC;

class UserIconSprite:public Sprite
{
public:
CREATE_FUNC(UserIconSprite);
bool init();

void changeIcon(std::string path);

void setSpriteFrameName(std::string path);  //通过图片路径设置头像

void setSprite(Sprite* img); //添加Sprite为头像



private:


Sprite* getImgFromPath(std::string path,std::string defautImg = "pic_default_avtar@2x.png");  //传入图片的绝对路径
Sprite* userImg;
Sprite* mark;
ClippingNode* clip;


};

#endif /* defined(__Ci__UserIconSprite__) */


具体实现UserIconSprite.cpp:


#include "UserIconSprite.h"

#include "SceneManager.h"


bool UserIconSprite::init()

{

    if(!Sprite::init()){

        returnfalse;

    }

    

    clip =ClippingNode::create();

    clip->setAnchorPoint(Vec2::ANCHOR_MIDDLE);

    clip->setInverted(false);

    clip->setAlphaThreshold(0.0f);

    

    mark =Sprite::create("mask@2x.png");   //一个圆形图片当蒙层,也可以使用DrawNode

    mark->setPosition(0,0);

    clip->setStencil(mark);

    this->addChild(clip);

    this->setAnchorPoint(Vec2::ANCHOR_MIDDLE);

    

    auto circle =Sprite::create("mask_circle@2x.png");//一个大小类似的圆环图片

    this->addChild(circle,zOrder_LAYER);

    circle->setPosition(0,0);

    

    returntrue;

}

void UserIconSprite::changeIcon(string path)

{

    clip->removeAllChildrenWithCleanup(true);

    setSpriteFrameName(path);

}


void UserIconSprite::setSpriteFrameName(string path)

{

    userImg =getImgFromPath(path);

    setSprite(userImg);

}

void UserIconSprite::setSprite(Sprite* img)

{

    userImg = img;

    userImg->setPosition(0,0);

    clip->addChild(userImg,zOrder_LAYER);

}

SpriteUserIconSprite::getImgFromPath(std::string path,std::string defautImg)

{

    Sprite* mImg;

    if(FileUtils::getInstance()->isFileExist(path))     //若图片不存在则使用默认头像

    {

        auto mUerImg =new Image();

        mUerImg->initWithImageFile(path);

        auto texture =new Texture2D();

        texture->initWithImage(mUerImg);

        mUerImg->release();

        

        mImg = Sprite::createWithTexture(texture);

    }else{

        mImg = Sprite::create(defautImg);

    }

    return mImg;

}


用法:

  UserIconSprite* userSprite =UserIconSprite::create();

  userSprite->setSprite(Sprite::createWithSpriteFrameName("pic_default_avtar@2x.png"));

  this->addChild(userSprite ,0);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值