近期在寫一個用起來爽一點的特效編輯器,初步計划:
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()));
