zoukankan      html  css  js  c++  java
  • 特效编辑器开发手记1——令人蛋疼菊紧的Cocos2dx动态改变粒子数 深圳

    近期在写一个用起来爽一点的特效编辑器,初步计划:

    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()));
  • 相关阅读:
    oracle 查看表空间使用率
    解决linux下vim中文乱码问题
    linux 时间同步
    oracle ho与mysql system命令
    mysql 重置root密码
    2020 10 26
    2020 10 24
    2020 10 23
    2020 10 22
    2020 10 21
  • 原文地址:https://www.cnblogs.com/ybgame/p/2588954.html
Copyright © 2011-2022 走看看