特效编辑器开发手记1——令人蛋疼菊紧的Cocos2d-x动态改变粒子数
近期在写一个用起来爽一点的特效编辑器,初步计划:
1.仿HGE粒子特效编辑器实现粒子特效编辑功能
2.实现多种粒子效果组合编辑功能
3.实现编辑粒子运动路径功能
4.实现将png纹理保存到plist文件功能
5.实现动作,特效的编辑功能
6.全部实现后开源
开发环境是Windows + VS20XX
一开始用的是1.12的版本,虽然不新,但稳定,想开发编辑器的时候发现,TM控件里面只有一个按钮控件.......
于是自己开始实现各种控件,例如滚动条,进度条,多选,单选按钮等控件....本想把这些控件TMD都实现了,然后开源
实现了一半,突然有天在某博客上看到2.0新出的一系列控件,ca 搞了半天,人家已经实现出来了,赶紧换2.0
2.0以上的版本出来之后,到处都听到抱怨的声音,一是接口改动太大,二是BUG多多,自己亲试了一下,连自带的demo运行都会崩溃....
果然是蛋疼菊紧啊,看了一下,哥自己写的滚动条还比官方的要好用(实现了自渲染,水平,垂直,指定纹理渲染等功能)
但还是决定用官方的控件,扯远了,下面进入正题吧....
哥就这样,开始写粒子编辑的那部分了,这部分本来应该是最简单的,但第一个看似简单的功能就让我卡住了....
有一个滚动条,拉动滚动条,动态改变粒子总数,下面是初始化粒子系统的测试代码
m_pParticleSystem = new CCParticleSystemQuad(); m_pParticleSystem->initWithFile("Particles/LavaFlow.plist"); m_pParticleSystem->setPosition(500, 300); addChild(m_pParticleSystem);
然后是滚动条的回调
m_pParticleSystem->setTotalParticles(static_cast<unsigned int>(slider->getValue()));
编译运行,一开始,运作良好,然后,调整粒子数量,减少,运行同样良好,增加——当增加数超过默认粒子数时,粒子系统不见了....
查看代码的注释,关于setTotalParticles,只有CCParticleSystemQuad能够动态增长,于是把pParticleSystem用CCParticleSystemQuad new出来
各种跟踪调试,CCParticleSystemQuad里面的代码让人一看就头大....
m_pParticleSystem->unscheduleUpdate(); m_pParticleSystem->resetSystem(); m_pParticleSystem->stopSystem(); m_pParticleSystem->initWithTotalParticles(static_cast<unsigned int>(slider->getValue()));
把回调修改为上面那几行代码,注释来注释去,各种崩溃~~跟CCParticleSystemQuad和CCParticleSystem相关的,跟schedule相关的,跟batchNode相关的
最后,仔细查看test里面的例子
void AddAndDeleteParticleSystems::onEnter() { ParticleDemo::onEnter(); setColor(ccBLACK); removeChild(m_background, true); m_background = NULL; //adds the texture inside the plist to the texture cache m_pBatchNode = CCParticleBatchNode::create((CCTexture2D*)NULL, 16000); addChild(m_pBatchNode, 1, 2); for (int i = 0; i<6; i++) { CCParticleSystemQuad *particleSystem = CCParticleSystemQuad::create("Particles/Spiral.plist"); m_pBatchNode->setTexture(particleSystem->getTexture()); particleSystem->setPositionType(kCCPositionTypeGrouped); particleSystem->setTotalParticles(200); particleSystem->setPosition(ccp(i*15 +100,i*15+100)); unsigned int randZ = rand() % 100; m_pBatchNode->addChild(particleSystem, randZ, -1); } schedule(schedule_selector(AddAndDeleteParticleSystems::removeSystem), 0.5f); m_emitter = NULL; }
终于找到解决方法
将初始化粒子系统的代码改为
m_pParticleSystem = new CCParticleSystemQuad(); CCParticleBatchNode* pBatchNode = CCParticleBatchNode::create((CCTexture2D*)NULL, 16000); addChild(m_pBatchNode); m_pParticleSystem->initWithFile("Particles/LavaFlow.plist"); m_pBatchNode->setTexture(m_pParticleSystem->getTexture()); m_pBatchNode->addChild(m_pParticleSystem); m_pParticleSystem->setPosition(500, 300);
然后,运行,动态调整大小~通过
m_pParticleSystem->setTotalParticles(static_cast<unsigned int>(slider->getValue()));