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

前端之家收集整理的这篇文章主要介绍了cocos2d-x 3.3 Sprite3D人物换装代码解析前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

auto sprite = Sprite3D::create(fileName);
sprite->setScale(4);
sprite->setRotation3D(Vec3(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));
    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,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函数来实现换装



原文链接:/cocos2dx/345842.html

猜你在找的Cocos2d-x相关文章