cocos2dx ver3.3 的Sprite3DTest 例子中可以学到什么

1. Sprite3DBasicTest  Sprite3D 两种基本创建方式

(1). 直接使用一个带有素材的obj (3dmax对象)

Sprite3D::create("sprite3dTest/scene01.obj");

(2). 使用不带素材的对象,自己设置素材

auto sprite = Sprite3D::create("Sprite3DTest/boss1.obj");

sprite->setScale(3.f);

sprite->setTexture("Sprite3DTest/boss.png");

(3)

auto sprite = EffectSprite3D::createFromObjFileAndTexture("Sprite3DTest/boss1.obj", "Sprite3DTest/boss.png");

2. Sprite3DHitTest 拖拽

(1) 点击 在onTouchBegan 中设置透明度  target->setOpacity(100);

放手在 onTouchEnded中还原透明度 target->setOpacity(255);

(2)  移动 onTouchMoved

target->setPosition(target->getPosition() + touch->getDelta());

(3) addEventListenerWithSceneGraphPriority  更具sprite的z order决定丢用先后

3. Sprite3DEffectTest 一些shader 的运用例子

将具体实现封装到了Effect3DOutline中

4.加载3dmax导出的文件,使用fbx-conv.exe转化

std::string fileName = "Sprite3DTest/orc.c3b";

auto sprite = EffectSprite3D::create(fileName);

5. Sprite3DWithSkinOutlineTest  shader特效在c3b的运用

6. Animate3DTest 动画的播放和切换   小乌龟的demo

(1) 同一个c3b既可以创建sprite也可以创建action

std::string fileName ="Sprite3DTest/tortoise.c3b";

auto sprite = Sprite3D::create(fileName);

sprite->setScale(0.1f);

auto s =Director::getInstance()->getWinSize();

sprite->setPosition(Vec2(s.width *4.f / 5.f, s.height /2.f));

addChild(sprite);

_sprite = sprite;

auto animation = Animation3D::create(fileName);

(2) animation 可以通过 时间来分拆,这个时间是在3Dmax中定义的

if (animation)

{   //2个动画的时间不同,这些在3Dmax中定义

auto animate = Animate3D::create(animation, 0.f,1.933f);

_swim = RepeatForever::create(animate);

sprite->runAction(_swim);

_swim->retain();

_hurt = Animate3D::create(animation,1.933f, 2.8f);

_hurt->retain();

_state = State::SWIMMING;

}

(3)乌龟游到尽头 调用 reachEndCallBack

通过reverse获得相反的action

auto inverse = (MoveTo*)_moveAction->reverse();

沿y轴180度转向

auto rot = RotateBy::create(1.f, Vec3(0.f, 180.f, 0.f));

(4)在onTouchesEnded中实现播放乌龟的 hurt动作   ,但是这里没法实现hurt动作的结束回调,所以采用_hurt->getDuration()

来获得其结束时间,并且做一个renewCallBack来回到_swim 动作

auto delay = DelayTime::create(_hurt->getDuration() - Animate3D::getTransitionTime());

auto seq = Sequence::create(delay, CallFunc::create(CC_CALLBACK_0(Animate3DTest::renewCallBack, this)), nullptr);

疑问?  Animate3D::getTransitionTime() 用来干嘛

为啥会用void Animate3DTest::update(float dt) 来维护一个中间状态 HURT_TO_SWIMMING 和SWIMMING_TO_HURT

7. AttachmentTest  装武器

获取某个骨骼,Bip001 R Hand是在3Dmax定义的

auto sp = Sprite3D::create("Sprite3DTest/axe.c3b");

sprite->getAttachNode("Bip001 R Hand")->addChild(sp);

点击后去掉附加节点

_sprite->removeAllAttachNode();

8. Sprite3DReskinTest  皮肤换装, 动态更换材质(mesh)

(1)字号字体

TTFConfig ttfConfig("fonts/arial.ttf", 20);

auto label1 = Label::createWithTTF(ttfConfig,"Hair");

应该是在3dm中定义好了mesh的名称?

_girlPants[0]= "Girl_LowerBody01";

_girlPants[1]= "Girl_LowerBody02";

_girlUpperBody[0] = "Girl_UpperBody01";

_girlUpperBody[1] = "Girl_UpperBody02";

_girlShoes[0]  = "Girl_Shoes01";

_girlShoes[1]  = "Girl_Shoes02";

_girlHair[0]= "Girl_Hair01";

_girlHair[1]= "Girl_Hair02";

(2) 初始化的时候隐藏备选的部分,点击切换的时候再 交换显示

auto girlPants = sprite->getMeshByName(_girlPants[1]);

if(girlPants)

{

girlPants->setVisible(false);

}

9.Sprite3DWithOBBPerfromanceTest 包围盒与3D模型碰撞的实现

?

10.Sprite3DMirrorTest 3D模型的镜像

?

常用总结:

1. 3d 纬度的朝向设置

sprite->setRotation3D(Vec3(0,180,0));

2. sprite->setEffect() 添加特效

3.sprite->getAttachNode("Bip001 R Hand") 获取某个骨骼

4. sprite->getMeshByName(_girlPants[1]); 获取材质

参考 Cocos2d-x 3.3 的3D开发功能介绍  http://cn.cocos2d-x.org/tutorial/show?id=1582

时间: 2024-08-05 07:12:28

cocos2dx ver3.3 的Sprite3DTest 例子中可以学到什么的相关文章

在实际例子中学习正则表达式

最近整体学习了一下正则表达式的知识,发现还是在例子中进行学习效率比较高,接下来分享一下正则表达式的经典例子并进行相关知识点的总结. 例子1:匹配5-12位的数字:^\d{5,12}$ 首先介绍两个特殊符号,^表示字串开头,$表示字串结尾,这两个用来限定匹配的范围.接下来\d用来匹配一个数字,后面可以接一个{},里面输入数字.当输入一个数字时,比如{3},表示对数字进行3次匹配:当输入两个数字如例子中那样,表示匹配5-12次均可. 例子2:匹配以字母a开头的单词:\ba\w*\b 在正则表达式中可

Cocos2dx 学习笔记整理----在项目中使用图片(初)

cocos2dx有多种使用图片的方法,先来个最简单的:用CCSprite直接使用图片. 首先,进入到之前建立的项目,把你将要使用的图片放入到目录下的Resources文件夹里面.项目中以相对路径使用资源皆是以Resources文件夹为根目录参考的. 然后进入到HelloWorldScene.cpp的init方法的最后面加入以下代码: ? 1 2 3 CCSprite * sprite = CCSprite::create("bl_24.png"); sprite->setPosi

jbpm开发指南例子中helloworld的helloWorld.xml抛错问题(连个例子都跑不起

jbpm开发指南例子中helloworld的helloWorld.xml抛错问题(连个例子都跑不起 我按照JBPM开发指南上的例子把 // ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( // "<process-definition>" + // " <start-state>" + // " <transition to='s'

Cocos2dx 学习笔记整理----在项目中使用图片(二)

之前了解了一种比较简单的图片的使用方式, 今次来了解稍微复杂一点的图片使用方式,plist+png. 这里要用到之前提到的Texture Packer. Texture Packer是一款图片打包工具,Texture Packer可以将素材打包成我们项目需要的格式. Cocos2dx支持很多种格式, 我们可以将某一种类的或者有共性的图片打包到一个png,然后用plist管理,以节约加载和内存,且显卡支持的纹理尺寸的长宽为2的n次幂,Texture Packer会把纹理整合到次尺寸. 今次我们利用

Cocos2d-x 精灵图片预加载中不会出现重复加载问题

为了应对大量精灵图片的加载问题,cocos2d-x提供了精灵数据的异步预加载机制,这是要是借助于CCTextureCache::addImageAsync函数来实现的. 那么,当使用上述函数多次加载同一个精灵图片文件时,是否会出现加载多次呢?不会的. 让我们来分析一下上述函数的关键部分代码: void CCTextureCache::addImageAsync(const char *path, CCObject *target, SEL_CallFuncO selector) { #ifdef

[COCOS2DX]官网helloworld在VS2012中的部署

VS2012.JDK.Eclipse(和adt插件)之类的基本安装这里直接略过. 以下为对cocos2dx 3.5版本在VS2012中部署的摸索: 开源项目“愤怒的小鸟”原来设置: .;..\Classes;E:cocos2d-2.0-x-2.0.4\cocos2dx;E:cocos2d-2.0-x-2.0.4\cocos2dx\include;E:cocos2d-2.0-x-2.0.4\cocos2dx\kazmath\include;E:cocos2d-2.0-x-2.0.4\cocos2d

iOS狂暴之路---iOS的第一个应用中能学到哪些知识

一.前文回顾 在之前已经介绍了 iOS的学习路线图,因为中间遇到一些Android开发问题,所以就耽搁了一段时间,那么接下来的这段时间我们将继续开始iOS的狂暴之路学习,按照国际惯例,第一个应用当然是我们的HelloWorld程序了.那么本文将会通过这么一个简单的程序来讲解一下iOS中的程序生命周期,应用中关键的几个对象,项目结构,最后在手把手的创建一个空项目. 二.建立简单程序HelloWorld 下面先用Xcode来新建一个HelloWorld程序: 点击下一步即可: 这里和我们在Andro

从 ReactiveCocoa 中能学到什么?不用此库也能学以致用

从知道ReactiveCocoa开始就发现对这个库有不同的声音,上次参加<T>技术沙龙时唐巧对在项目中已全面使用FRP的代码家提出为什么这种编程模型出现了这么长时间怎么像ReactiveCocoa这种完全按FRP编写的库没能够流行起来这个问题.对这个问题的回答一般都是门槛高,解决方法就是培训和通过熟悉以前的代码来快速入门.其实在我学习的过程中也发现确实会有这个问题,不过就算是有这样那样问题使得ReactiveCocoa这样的库没法大面积使用起来,也不能错失学习这种编程思想的机会. 如果不用这样

提高中职数学活动课教学实践水平的具体措施

一.中职数学活动课的基本特征和主要意义分析 过去应试教育模式下,中职数学教学以考试成绩作为风向标,完全忽视了学生的主观能动性. 而活动课则是让学生通过参加实践活动,了解数学与实际生活之间的密切联系, 加深对所学数学知识的理解和认识,并学会用数学知识解决实际问题,从而全面提高学生的数学素质. 中职数学活动课将"要我学"变为"我要学",让学生在实际生活中自主发现问题,并将实际问题抽象为数学模型,并对其进行分析解释,从而解决实际问题. 在这个发现问题.解决问题的过程中巩固