答Cocos2d-x问题,赢经典蓝牙手机游戏手柄和Cocos2d-x 3.X系列图书【获奖名单公布】

一.回答如下
1.利用帧缓存创建精灵,加载多个相同的精灵的时候利用此方式相当优化运行内存
2.使用CCSpriteBatchNode优化绘制一批相同的精灵
3.Cocos2d-x缓存池对象重复使用
4.粒子系统能够让你使用同样的精灵创建大量的小对象,并且非常高效
5.使用精灵帧缓存
6.使用纹理图集:TexturePacker

二.Cocos2d-x游戏中常用的动画有两种,一种是骨骼动画,另一种是帧动画

帧动画的创建:
//创建cache
CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();
char strPlist = {0};
char strPng = {0};
sprintf(strPlist,“fei.plist”);
//sprintf(strPng,“fei.pvr.ccz”);
sprintf(strPng,“fei.png”);
cache->addSpriteFramesWithFile(strPlist, strPng);

//创建动画每一帧,从cache里面读取
CCMutableArray<CCSpriteFrame*>* animFrames = new CCMutableArray<CCSpriteFrame*>(6);

char str = {0};
for(int i = 1; i <= 6; i++)
{
sprintf(str, “飞%04d.png”, i);
CCSpriteFrame* frame = cache->spriteFrameByName( str );
animFrames->addObject(frame);
}

CCAnimation* animation = CCAnimation::animationWithFrames(animFrames,0.04f);

CCRepeatForever* mFly=CCRepeatForever::actionWithAction( CCAnimate::actionWithAnimation(animation, false));
animFrames->release();
cache->removeSpriteFramesFromFile(strPlist);

骨骼动画创建:
1.用CocosBuilder创建人物动画,全场景动画或者你所想的任何动画。该动画编辑器已完全支持多分辨率、关键帧间的缓冲动画、骨骼动画和多时间轴等特性。
2.然后使用CCArmature包实现骨骼动画

2.x的时候用通过CCBatchnode添加子弹节约帧数
3.x的时候2dx自己已经优化了 如果一次性加入图片是同一张,添加的效果比batchnode还要好
用C++也可以写出来,自己写个池,不销毁子弹就行了

动画可以使用帧动画,使用CCAnimate播放,也可以用骨骼动画,或者是用cocostudio制作的CCArmature动画
帧动画需要先把图片添加到数组中(CCSpriteFrame的数组),然后创建CCAnimation,再通过创建的animation创建animate
骨骼动画和制作的动画就比较简单了,提前把动画添加进缓存(CCArmatureDataManager),使用的时候直接创建CCArmature

使用CCSpriteBatchNode批量渲染
3.x实现了自动剔除功能,超出屏幕外不渲染

CCAnimation类或CCArmature类或CCSkeletonAnimation类
CCAnimation:通过一系列SpriteFrame创建序列帧动画
CCArmature:通过cocos studio编辑的动画或flash通过Dragon Bones导出的动画来创建动画
CCSkeletonAnimation:通过spine编辑的动画来创建动画

1
批次渲染:(SpriteBatchNode和ParticleBatchNode精灵批节点类和粒子批节点类。)
缓存:(TextureCache、 SpriteFrameCache、AnimationCache)
2
序列帧动画:从代码或文件读取设置序列帧

骨骼动画:使用Cocostudio的Animation编辑器、Spine编辑器进行编辑,再在程序中进行读取解析


2.x batchnode
3.x batchrender


序列帧,骨骼动画

1.Cocos2d-x中绘制大量精灵时,有哪些优化方法?
在游戏开发中,总会有需要大量绘制精灵的情况,比如大量的子弹、大量的敌人、庞大的Tiled地图。
对于大量绘制精灵的优化是必不可少的,那么,大家以各自的经验,讨论大量绘制的优化方案。
可以基于Cocos2d-x2.x版本,也可以基于Cocos2d-x3.x版本,可以是Cocos2d-x自带的优化方案,也可以是你“自创”的优化方案。

在cocos2d-x 2.x版本中,用CCSpriteBatchNode进行批量绘制精灵提高精灵的绘制效率。
在cocos2d-x 3.x版本中,引入了一个大招技术,叫做auto batching
两者孰优孰劣,在官网的教程里有比较。

Cocos2d-x中常用的动画有哪些?如何创建这些动画?
cocos2d-x里可以用的动画基本可以分为序列帧动画和骨骼动画。
序列帧动画从美术角度有两种 1.flash或者原画手绘的2d序列图 2.3dmax等导出的2d序列图
程序创建序列帧动画,大致是
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile(“ani.plist”, “ani.png”);
char buffer = { 0 };
CCArray *pArray = CCArray::create();
for (int i = 1; i <= 8; ++i)
{
sprintf(buffer, “ani%d.png”, i);
//生成精灵帧
CCSpriteFrame *pSpriteFrame = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(buffer);
//生成动画帧
CCAnimationFrame *pAnimationFrame = new CCAnimationFrame();
pAnimationFrame->initWithSpriteFrame(pSpriteFrame, 0.5f, NULL);
pArray->addObject(pAnimationFrame);
}
//生成动画数据对象
CCAnimation *pAnimation = CCAnimation::create(pArray, 0.2f, 1);
//生成动画动作对象
CCAnimate *pAnimate = CCAnimate::create(pAnimation);
CCRepeatForever *pRepeatForever = CCRepeatForever::create(pAnimate);
m_pSprite = CCSprite::create(“CloseNormal.png”);
CCSize size = CCDirector::sharedDirector()->getWinSize();
m_pSprite->setPosition(CCPointMake(size.width / 2, size.height / 2));
addChild(m_pSprite);
m_pSprite->runAction(pRepeatForever);

还有另外的方式就是借助CocosBuilder【免费】等工具的序列帧动画制作功能进行直观的制作。
参见,http://www.tuicool.com/articles/2MNrYj
严格意义上来讲,上面教程里的动画不是骨骼动画,因为并没有骨架的概念,只是序列帧组合而已。

骨骼动画
CocosStudio【免费】
制作:在flash编辑器里制作动过,通过Dragonbones修改版,导出给CocosStudio动画编辑器编辑与使用
使用;cocos2d-x 2.x和3.x版本已经提供ccs关于动画的解析,程序里只需要调用相应的文件即可。
代码类似如下:(抄袭官方test)
ArmatureDataManager::getInstance()->addArmatureFileInfo(“armature/bear.ExportJson”);
Armature *armature = Armature::create(“bear”);
armature->getAnimation()->playWithIndex(0);
armature->setPosition(VisibleRect::center().x, VisibleRect::center().y);
addChild(armature);

Dragonbones官方版【免费】
制作;与cocosstudio的制作过程类似,但是省掉了在ccs里编辑的过程
使用;需要下载Dragonbones官方提供的cocos解析库配合使用
具体可以在https://github.com/DragonBones/DragonBonesCPP进行了解

Spine【收费】
制作:在spine编辑器里编辑骨架和动画,不依赖flash
使用:cocos2d-x已经原生支持spine的解析
代码类似如下:(抄袭官方test)
skeletonNode = SkeletonAnimation::createWithFile(“spine/spineboy.json”, “spine/spineboy.atlas”);
skeletonNode->setMix(“walk”, “jump”, 0.2f);
skeletonNode->setMix(“jump”, “walk”, 0.4f);

skeletonNode->setAnimationListener(this, animationStateEvent_selector(SpineTestLayer::animationStateEvent));
skeletonNode->setAnimation(0, “walk”, false);
skeletonNode->addAnimation(0, “jump”, false);
skeletonNode->addAnimation(0, “walk”, true);
skeletonNode->addAnimation(0, “jump”, true, 4);
// skeletonNode->addAnimation(1, “drawOrder”, true);

skeletonNode->timeScale = 0.3f;
skeletonNode->debugBones = true;
skeletonNode->update(0);

skeletonNode->runAction(CCRepeatForever::create(CCSequence::create(CCFadeOut::create(1),
CCFadeIn::create(1),
CCDelayTime::create(5),
nullptr)));

Size windowSize = Director::getInstance()->getWinSize();
skeletonNode->setPosition(Vec2(windowSize.width / 2, 20));
addChild(skeletonNode);

scheduleUpdate();

ps:
1.回答

2.x batchnode
3.x batchrender


序列帧,骨骼动画
的都是jr

2.论坛版主参与回答,看我口型。。。

答案一样能否算抄袭,不会记零分吧我去!!!!!!!!!!求书;;;;;
1
通过批次渲染的方法来优化精灵(方法就是使用CCSpriteBatchNode和CCParticleBatchNode精灵批节点类和粒子批节点类。)
使用缓存提前加载精灵(我们用到的缓存类有CCTextureCache、 CCSpriteFrameCache、CCAnimationCache)
2
序列帧动画
创建方法
手动添加序列帧到Animation类
使用文件初始化Animation类

骨骼动画
使用Spine创建骨骼动画

— Begin quote from ____

引用第25楼ldr123于2014-10-14 16:18发表的 :
1.Cocos2d-x中绘制大量精灵时,有哪些优化方法?
在游戏开发中,总会有需要大量绘制精灵的情况,比如大量的子弹、大量的敌人、庞大的Tiled地图。
对于大量绘制精灵的优化是必不可少的,那么,大家以各自的经验,讨论大量绘制的优化方案。
可以基于Cocos2d-x2.x版本,也可以基于Cocos2d-x3.x版本,可以是Cocos2d-x自带的优化方案,也可以是你“自创”的优化方案。

http://www.cocoachina.com/bbs/job.php?action=topost&tid=234578&pid=1074992

— End quote

补充一下,还有一个最近推广比较厉害的GAF【收费】,在flash里编辑,导出给cocos和其他引擎使用。http://gafmedia.com/,没用过不做评价。看起来不错

Q1:Cocos2d-x中绘制大量精灵时,有哪些优化方法?
在游戏开发中,总会有需要大量绘制精灵的情况,比如大量的子弹、大量的敌人、庞大的Tiled地图。
对于大量绘制精灵的优化是必不可少的,那么,大家以各自的经验,讨论大量绘制的优化方案。
可以基于Cocos2d-x2.x版本,也可以基于Cocos2d-x3.x版本,可以是Cocos2d-x自带的优化方案,也可以是你“自创”的优化方案。
A:
cocos2dx-2.x 通过CCBatchnode添加子弹节约帧数;
ocos2dx-3.x 引擎已经优化,如果一次性加入图片是同一张,添加的效果比batchnode还要好

Q2:Cocos2d-x中常用的动画有哪些?如何创建这些动画?
A:
帧动画、骨骼动画、Armature动画
动画可以1.使用帧动画,使用CCAnimate播放;2.用骨骼动画;3.用cocostudio制作的CCArmature动画;
帧动画需要先把图片添加到数组中(CCSpriteFrame的数组),然后创建CCAnimation,再通过创建的animation创建animate
骨骼动画和制作的动画,提前把动画添加进缓存(CCArmatureDataManager),使用的时候直接创建CCArmature

1
2.x 使用CCSpriteBatchNode和CCParticleBatchNode精灵批节点类和粒子批节点类。 3.x 使用batchrender。
用CCTextureCache、 CCSpriteFrameCache、CCAnimationCache
2
(1)序列帧动画,手动添加序列帧到Animation类
(2)骨骼动画,Spine创建
以上两个都可使用cocostudio创建

复制粘贴铁党,全部出局~~~

1、2.x中:CCSpriteBatchNode(精灵缓冲集合类)与 CCSpriteFrameCache(精灵缓冲帧类) 结合使用
当一张图片重复使用时: 先用此张图片创建一个CCSpriteBatchNode对象并加入到层中
CCSpriteBatchNode *batchNode = CCSpriteBatchNode::create(“bullet1.png”, 100);
batchNode->setPosition(CCPointZero);
this->addChild(batchNode);
从batchNode缓存中取出图片创建精灵并加入到精灵集合类中
CCSprite *shoot = CCSprite::createWithTexture(batchNode->getTexture());
shoot->setPosition(ccp(240,160));
batchNode->addChild(shoot);
也可用CCTexture2D 和 CCTextureCache结合使用(此方法不会减少渲染次数,不过能加快渲染速度,先把图片存在CCTexture2D缓存中,创建精灵时图片是直接从缓存中提取)
当图片不一样时,可以做成plist文件再利用CCSpriteFrameCache创建精灵

2、序列帧动画
用Zwoptex工具制作plist
//添加精灵缓冲帧
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile(“we.plist”);
//取出plist中第一张图片作为动画开始
sprite = CCSprite::createWithSpriteFrameName(“A4f_1.png”);
sprite->setPosition(ccp(s.width / 2,s.height / 2));
this->addChild(sprite);
//获取plist文件中精灵帧个数
CCDictionary *dic = CCDictionary::createWithContentsOfFile(“we.plist”);
CCDictionary *frameDic = (CCDictionary *)dic->objectForKey(“frames”);
int num = frameDic->allKeys()->count();
//把精灵帧存入数组
CCArray *allFrame = CCArray::createWithCapacity(20);
for (int i=0; i<num; i++) {
char frame;
sprintf(frame, “A4f_%d.png”,i+1);
CCSpriteFrame *spriteFrame = CCSpriteFrameCache::sharedSpriteFrameCache()
->spriteFrameByName(frame);
allFrame->addObject(spriteFrame);
}
//根据精灵帧数组创建动画
CCAnimation *animation = CCAnimation::createWithSpriteFrames(allFrame,0.2);
animation->setLoops(-1);
CCAnimate *animate = CCAnimate::create(animation);
// CCRepeatForever *repeatForever = CCRepeatForever::create(animate);
sprite->runAction(animate);

一:1、通过批次渲染的方法来优化精灵。2、使用缓存提前加载精灵。
二:1、序列动画。2、帧动画。3、骨骼动画

哈哈,此楼会沦为水楼吧,书数量多么?多的话给来一本吧……


2.x batchnode
3.x batchrender


序列帧,骨骼动画

庞大的Tile地图应该用新出的Fast TileMap

BatchNode

然后就是骨骼和序列帧啊,CocoStudio什么的最有爱了

他们上面都回答了一部分,我谈一点我自己的看法。
问题1:
对于大量精灵的优化。子弹什么的,都是可以复用的。我想直接用cocos2dx封装的clone函数是可以的。
另外对象过多建议自己建立相应对象池,尽可能少的创建对象。
瓦片地图使用尽量使用相同纹理叠加。
另外,加载图片的话,cocos2dx自带异步加载,可以使用,当然也可以自己扩展实现。
问题2:
动画归根结底都是帧动画。
不过相对于一般的帧动画,spine动画复用纹理使得内存消耗大大降低。
至于具体怎么实现,官方的testcpp里面已经有大量例子。论坛教程也不少,相信大家都是会玩的。
在此就不赘述了。

1.Cocos2d-x中绘制大量精灵时,有哪些优化方法?
在2.x当中通过批次渲染的方法来优化大量重复精灵
使用方法是CCSpriteBatchNode和CCParticleBatchNode精灵批节点类和粒子批节点类。
还有就是使用图片文理缓存提前加载精灵,这些缓存类有CCTextureCache、 CCSpriteFrameCache、CCAnimationCache
在3.x当中 只要在材质形状大小 并且序列连续 3.x引擎将会 自动Batching
2.Cocos2d-x中常用的动画有哪些?如何创建这些动画?

  1. 序列帧动画 2. 2d骨骼动画
    创建方法
    手动添加序列帧到Animation类
    使用文件初始化Animation类

骨骼动画
使用Spine等2d骨骼动画软件创建骨骼动画
cocos2dX 已经完全支持 Spine这个软件 而且这个软件也相当好用

2.x batchnode
3.x batchrender

序列帧,骨骼动画
1:创建精灵框架缓存,并向其中添加相应的动画文件(plist),最后,通过动画集缓存生产动画,也可以直接传人多个图片文件,生成动画。
2:cocos2dx使用CocosBuilder完成骨骼动画

第一题
SpriteBatchNode
TextureCache

第二题
SpriteFrameCache
Animation
Armature

最好最方便的方式就是使用cocos studio
1、编辑序列帧动画
2、编辑骨骼动画