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.论坛版主参与回答,看我口型。。。