特效編輯器開發手記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()));

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM