特效编辑器开发手记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()));

 

 

posted @ 2012-07-12 23:59  深圳-宝爷  阅读(4774)  评论(2编辑  收藏  举报