cocos2d-x 3.3 Sprite3D人物换装代码解析

Sprite3D与Sprite相似,只不过它是3D的。你可以使用内置的create函数初始化一个Sprite3D对象。

auto sprite = Sprite3D::create(fileName);
sprite->setScale(4);
sprite->setRotation3D(Vec3(0,0,0));

目前 Sprite3D 支持以下三种格式

  • obj:obj是通过3ds Max或Maya导出的一种格式。Sprite3D可以通过该格式的资源立即被创建出来。不过obj格式不支持动画。
  • c3t(Cocos 3D文本):c3t是通过fbv-conv工具从FBX格式转换而来的一种Json格式。c3t格式可以很容易地读取,这也意味着它能够通过发展中的c3t格式文件检测你的数据模型。但是,c3t是一个大文件格式,所以我们不建议在最终版本的游戏中使用它。因为,我们还有另一种可用格式——c3b。
  • c3b(Cocos 3D二进制):c3b是一个二进制文件。它也是通过fbx-conv工具转换而来的一种格式,同样使用FBX格式文件转换得来。它不能被读取,但它比c3t体积小、运行速度快。大多数时候我们都会选择c3t格式开发或调试,然而在游戏中则使用c3b格式。

Animation 3D

运行Sprite3D的动画我们可以使用 Animation3D 和 Animate3D类。Animation3D可以用“c3b”或“c3t”格式的文件创建,Animate3D则通过Animation3D对象创建。Animate3D是ActionInterval的子类,所以你可以使用runAction()运行它。这就像是Animation与Animate之间的关系一样

    std::string fileName = "Sprite3DTest/ReskinGirl.c3b";
    auto sprite = Sprite3D::create(fileName);
    sprite->setScale(4);
    sprite->setRotation3D(Vec3(0,0,0));
    addChild(sprite);
    sprite->setPosition( Vec2( p.x, p.y-60) );
    auto animation = Animation3D::create(fileName);
    if (animation)
    {
        auto animate = Animate3D::create(animation);
        
        sprite->runAction(RepeatForever::create(animate));
    }
下面着重看一下3.3中所带例子的换装效果实现

首先是界面的初始化,构造函数里的字体按钮就跳过不说了,相信大家看懂都无压力

void Sprite3DReskinTest::addNewSpriteWithCoords(Vec2 p)
{
    //ReskinGirl.c3b里保存了女郎所执行动画的所有零件(姑且这么叫吧)包括衣服,鞋子等等
    std::string fileName = "Sprite3DTest/ReskinGirl.c3b";
    auto sprite = Sprite3D::create(fileName);
    sprite->setScale(4);
    sprite->setRotation3D(Vec3(0,0,0));
    addChild(sprite);
    sprite->setPosition( Vec2( p.x, p.y-60) );
    auto animation = Animation3D::create(fileName);
    if (animation)
    {
        auto animate = Animate3D::create(animation);
        
        sprite->runAction(RepeatForever::create(animate));
    }
    _sprite = sprite;
    
    _curSkin[SkinType::UPPER_BODY] = "Girl_UpperBody01";
    _curSkin[SkinType::PANTS] = "Girl_LowerBody01";
    _curSkin[SkinType::SHOES] = "Girl_Shoes01";
    _curSkin[SkinType::HAIR] = "Girl_Hair01";
    _curSkin[SkinType::FACE] = "Girl_Face01";
    _curSkin[SkinType::HAND] = "Girl_Hand01";
    _curSkin[SkinType::GLASSES] = "";
    //利用curSkin经过遍历来设置女郎的默认服装
    applyCurSkin();
}
 
void Sprite3DReskinTest::applyCurSkin()
{
    //函数getMeshCount获取动画所有零件数目
    for (ssize_t i = 0; i < _sprite->getMeshCount(); i++) {
        auto mesh = _sprite->getMeshByIndex(static_cast<int>(i));
        bool isVisible = false;
        for (auto& it : _curSkin) {
            if (mesh->getName() == it.second)
            {
                isVisible = true;
                break;
            }
        }
        //通过索引来获取零件并设置可见性
        _sprite->getMeshByIndex(static_cast<int>(i))->setVisible(isVisible);
    }
}

void Sprite3DReskinTest::menuCallback_switchHair(Ref* sender)
{
    std::string str = _curSkin[SkinType::HAIR];
    if (str == "Girl_Hair01")
        _curSkin[SkinType::HAIR] = "Girl_Hair02";
    else
        _curSkin[SkinType::HAIR] = "Girl_Hair01";
    applyCurSkin();
}
最后通过点击回调换掉头发图片并调用applyCurSkin函数来实现换装






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值