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