cocos2dx 动画3.0开场动画

cocos2d-x 3.0 版本 骨骼动画设置shader - 初心禅者 - 博客园
因为骨骼动画是由多个sprite组成, 所以需要遍历每个sprite 才能修改整体, 开头这样设置,在游戏中发现走路状态没问题,攻击状态就有部分sprite没效果
for (auto & object : armObj-&getBoneDic())
if (cocostudio::Bone *bone = dynamic_cast&cocostudio::Bone *&(object.second))
Node *node = bone-&getDisplayRenderNode();
if (nullptr == node)
cocostudio::Skin *skin = static_cast&cocostudio::Skin *&(node);
skin-&setGLProgramState(shader);
&查下底层代码,必须从DecorativeDisplayList中取得renderNode
for (auto & object : armObj-&getBoneDic())
if (cocostudio::Bone *bone = dynamic_cast&cocostudio::Bone *&(object.second))
{       
const cocos2d::Vector&cocostudio::DecorativeDisplay*&& list = bone-&getDisplayManager()-&getDecorativeDisplayList();
for (auto & display : list)
Node *node = display-&getDisplay();
node-&setGLProgramState(glProgramState);
&另外设置了新shader后会导致cocos2d-x 渲染时DP不合并,查下了底层代码,发现QuadCommond&generateMaterialID 该函数引起。
当ProgrameState 的uniformCount等于0 时, 会把matrierialID 设置为0。 &(不明白cocos2d-x 底层为啥要这样做)....
用以下方法,即可让DP合并,目前测试游戏跑下来没啥大问题
void QuadCommand::generateMaterialID()
if(_glProgramState-&getUniformCount() & 0)
// _materialID = QuadCommand::MATERIAL_ID_DO_NOT_BATCH;
int glProgram = (int)_glProgramState-&getGLProgram()-&getProgram();
int intArray[4] = { glProgram, (int)_textureID, (int)_blendType.src, (int)_blendType.dst };
_materialID = XXH32((const void*)intArray, sizeof(intArray), 0);
int glProgram = (int)_glProgramState-&getGLProgram()-&getProgram();
int intArray[4] = { glProgram, (int)_textureID, (int)_blendType.src, (int)_blendType.dst};
_materialID = XXH32((const void*)intArray, sizeof(intArray), 0);
阅读(...) 评论()&&&&&&&&&&&
bool HelloWorld::init()
//////////////////////////////
// 1. super init first
if ( !CCLayer::init() )
return false;
添加4个精灵, 每个精灵用来标示一帧
CCSprite * sp1= CCSprite::create("crop1.png");
CCSprite * sp2= CCSprite::create("crop2.png");
CCSprite * sp3= CCSprite::create("crop3.png");
CCSprite * sp4= CCSprite::create("crop4.png");
CCSprite * sp1= CCSprite::create("crop.png", CCRectMake(0, 0, 100, 86));
CCSprite * sp2= CCSprite::create("crop.png", CCRectMake(100, 0, 100, 86));
CCSprite * sp3= CCSprite::create("crop.png", CCRectMake(200, 0, 100, 86));
CCSprite * sp4= CCSprite::create("crop.png", CCRectMake(300, 0, 100, 86));
设置一样的坐标
sp1-&setPosition(ccp(100, 180));
sp2-&setPosition(ccp(100, 180));
sp3-&setPosition(ccp(100, 180));
sp4-&setPosition(ccp(100, 180));
设置2-4帧不可见, 初始化时只显示第一帧
sp2-&setVisible(false);
sp3-&setVisible(false);
sp4-&setVisible(false);
添加到当前层中 tag 按照顺序0~3
addChild(sp1,0,0);
addChild(sp2,0,1);
addChild(sp3,0,2);
addChild(sp4,0,3);
每0.5s调用一次myUpdate(每0.5s切换一帧)
schedule(schedule_selector(HelloWorld::myUpdate),0.5);
return true;
void HelloWorld:: myUpdate(float dt)
currentFrameIndex++;
CCLOG("currentFrameIndex= %i",currentFrameIndex);
获取当前所有精灵
CCArray*array= this-&getChildren();
防止下标超过最大tag的精灵
if (currentFrameIndex&=array-&count()) {
currentFrameIndex=0;
隐藏所有的精灵
for (int i = 0 ; i &array-&count(); i++) {
CCSprite*spt =(CCSprite*)this-&getChildByTag(i);
spt-&setVisible(false);
让下一帧显示出来
CCSprite *sp = (CCSprite*)array-&objectAtIndex(currentFrameIndex);
sp-&setVisible(true);
class HelloWorld : public cocos2d::CCLayer
// Method 'init' in cocos2d-x returns bool, instead of 'id' in cocos2d-iphone (an object pointer)
virtual bool init();
// there's no 'id' in cpp, so we recommend to return the class instance pointer
static cocos2d::CCScene* scene();
// a selector callback
void menuCloseCallback(CCObject* pSender);
// preprocessor macro for "static create()" constructor ( node() deprecated )
CREATE_FUNC(HelloWorld);
定义一个变量用以标识当前显示的帧下标
int currentFrameI
自定义的更新函数
void myUpdate(float dt);
阅读(...) 评论()cocos2dx3.0&骨骼动画的加载
本文为原创,转载请写明出处
骨骼动画的制作,可以使用cocoStudio、cocosbuilder或来制作,制作过程只要是使用过flash的人,很容易上手的,我就不多讲了,唯一要提醒的是在制作完毕后导出文件时设置scale=1,否则在程序中会出现人物被分解的状况。好了,直接上代码:
//移除该骨骼动画
ArmatureDataManager::getInstance()-&removeArmatureFileInfo("paobu.ExportJson");
连接该骨骼动画的资源
ArmatureDataManager::getInstance()-&addArmatureFileInfo("paobu.ExportJson");
//创建动画
armature2=Armature::create("paobu");
//执行该骨骼动画序列中的第一个动画
armature2-&getAnimation()-&playWithIndex(0);
//缩放人物,如果在当初是设置了scale,则可能会出现人物被分解的状况
armature2-&setScale(0.1);
//设置tag,便于以后控制
armature2-&setTag(105);
//设置动画的位置
armature2-&setPosition(Point(visibleSize.width*0.2,
visibleSize.height*0.7));
//像场景添加人物骨骼动画
this-&addChild(armature2,2);
由于骨骼动画的加载是基于flash的,我们也可以尝试制作flash,不过导出的是帧动画,使用上述代码同样能够加载,这也体现了cocostudio得强大。OK,骨骼动画就说到这里!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。【Cocos2d-x&v3.x官方文档】序列帧动画
<img DATA-BD-IMGSHARE-BINDED="1" src="/blog7style/images/common/sg_trans.gif" real_src ="/cms/uploads/allimg/9__1.jpg" ALT="" STYLE="cursor:pointer" WIDTH="550"
TITLE="【Cocos2d-x&v3.x官方文档】序列帧动画" />
Cocos2d-x中,动画的具体内容是依靠精灵显示出来的,为了显示动态图片,我们需要不停切换精灵显示的内容,通过把静态的精灵变为动画播放器从而实现动画效果。动画由帧组成,每一帧都是一个纹理,我们可以使用一个纹理序列来创建动画。
我们使用Animation类描述一个动画,而精灵显示动画的动作则是一个Animate对象。动画动作Animate是精灵显示动画的动作,它由一个动画对象创建,并由精灵执行。
1. &手动添加序列帧到Animation类
2. &使用文件初始化Animation类
手动添加的方法需要将每一帧要显示的精灵有序添加到Animation类中,并设置每帧的播放时间,让动画能够匀速播放。另外,还要通过
`setRestoreOriginalFrame`来设置是否在动画播放结束后恢复到第一帧。创建好Animation实例后,需要创建一个
Animate实例来播放序列帧动画。
auto&animation&=&Animation::create();&
for(&int&i=1;i&15;i++)&
&&&char&szName[100]&=&{0};&
&&&sprintf(szName,&"Images/grossini_dance_d.png",&i);&
&&&animation-&addSpriteFrameWithFile(szName);&
//&should&last&2.8&seconds.&And&there&are&14&frames.&
animation-&setDelayPerUnit(2.8f&/&14.0f);&
animation-&setRestoreOriginalFrame(true);&
auto&action&=&Animate::create(animation);&
_grossini-&runAction(Sequence::create(action,&action-&reverse(),&NULL));&
在创建Animation实例时会用到以下几个接口:
1.“addSpriteFrame”,添加精灵帧到Animation实例
2. “setDelayUnits”,设置每一帧持续时间,以秒为单位
3. “setRestoreOriginalFrame”,设置是否在动画播放结束后恢复到第一帧
4. “clone”,克隆一个该Animation实例
首先我们来了解下需要用到的AnimationCache类。AnimationCache可以加载xml/plist文件,plist文件里保存了组成动画的相关信息,通过该类获取到plist文件里的动画。
在使用AnimationCache类时会用到以下几个接口:
1.“addAnimationsWithFile”,添加动画文件到缓存,plist文件
2.“getAnimation”,从缓存中获取动画对象
3.“getInstance”,获取动画缓存实例对象
使用文件添加的方法只需将创建好的plist文件添加到动画缓存里面,plist文件里包含了序列帧的相关信息。再用动画缓存初始化Animation实例,用Animate实例来播放序列帧动画。
auto&cache&=&AnimationCache::getInstance();&
cache-&addAnimationsWithFile("animations/animations-2.plist");&
auto&animation2&=&cache-&getAnimation("dance_1");&
auto&action2&=&Animate::create(animation2);&
_tamara-&runAction(Sequence::create(action2,&action2-&reverse(),&NULL));&
注意:3.0开始,Cocos2d-x使用getInstance来获取单例实例。
动画缓存(AnimationCache)
通常情况下,对于一个精灵动画,每次创建时都需要加载精灵帧,按顺序添加到数组,再创建对应动作类,这是一个非常烦琐的计算过程。对于使用频率
高的动画,比如走路动画,将其加入缓存可以有效降低每次创建的巨大消耗。由于这个类的目的和缓存内容都非常简单直接,所以其接口也是最简单了的,如下所
1. static AnimationCache* getInstance(),全局共享的单例
2. void addAnimation(Animation *animation, const
std::string& name),添加一个动画到缓存
3. void addAnimationsWithFile(const std::string&
plist),添加动画文件到缓存
4. void removeAnimation(const std::string&
name),移除一个指定的动画
5. Animation* getAnimation(const std::string&
name),获得事先存入的动画
建议:在内存警告时我们应该加入如下的清理缓存操作:
void&releaseCaches()&
AnimationCache::destroyInstance();&
SpriteFrameCache::getInstance()-&removeUnusedSpriteFrames();&
TextureCache::getInstance()-&removeUnuserdTextures();&
值得注意的是清理的顺序,我们推荐先清理动画缓存,然后清理,最后是。按照引用层级由高到低,以保证释放引用有效。
原帖地址:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 cocos2dx 骨骼动画 的文章

 

随机推荐