• cocos2dx Tests讲解三:Particle System(粒子系统)


    一、粒子系统简介:

    粒子系统最早出现在80年代,主要用于解决由大量按一定规则运动(变化)的微小物质在计算机上的生成和显示问题。Particle System的应用非常广泛,大的可以模拟原子弹爆炸,星云变化,小的可以模拟水波、火焰、烟火、云雾等,而这些自然现象用常规的图形算法是很难逼真再现的。
    Particle System可以说是一种基于物理模型来解决问题的方法,它的核心不在于如何显示,而在用于对微小物质模型的规则提取。
    粒子运动(变化)的规则可以很简单也可以很复杂,这取决你所模拟的对象。举例来说,在对FireWorks(烟火)的模拟中,我们可以让烟火由上百个小的粒子组成,每个粒子都具有以下一些属性及其规则(对各个属性施加不同的规则,就可以获得不同形态的烟火):
     
    Coordinate(坐标)
    在烟火爆炸的时刻,每个粒子都有一个相同的初始坐标,随着时间的推移,粒子的新坐标将由它的旧坐标和加速度来求得
    Velocity(速度)
    每个粒子都有一个随机产生的初始速度,粒子的新速度由加速度和空气阻尼来求得
    Acceleration(加速度)
    在烟火中,每个粒子的加速度都等于重力加速度
    Color(颜色)
    粒子颜色取决于粒子的速度或生命值的大小
    Life(生命值)
    每个粒子都有一个初始的随机生命值,这个值将随着时间的推移而逐渐减小,直到等于0
     
    你会发现,Particle System中的粒子与C++中类的概念有些类似,实际上你完全可以将它当成类来处理,一个粒子就是一个类的实例对象,只不过有时在涉及程序优化的具体细节上,你需要放弃使用类,而使用简单而快速的紧凑代码。
     
    Particle System虽然在处理大量单独粒子的运动(变化)上很有用处,但是一涉及到需要考虑粒子间相互作用的场合,因为这时的计算量呈粒子数量的指数级增长,它就显得有些力不从心了。比如在模拟有相互引力作用下的大量星体的运动,大量粒子的相互碰撞等。
     
    二、粒子系统的生命周期

     

    首先,从粒子池中获取一个粒子,
    然后计算赋予初始属性后,发射他。
    在粒子飞行过程中,不断的刷新来修正他的属性。
    粒子死亡后,回归粒子池。
     
     三、例子相关属性
    Variance 浮动值:表示随机上下浮动的修正值,实际值由原始值+浮动值组成,例如Lifespan=5,Lifespan Variance=1 那么随机出来的结果就是4~6
     
     

     

    四、发射器相关属性
    发射器有两种,一种是重力发射器(用于实现在重力条件下的粒子运动),另一种是放射发射器(用于实现在无重力下的粒子运动)。
     
     
     
     
     
    五、纹理Texture
    如果没有贴图的话,所有粒子将会是单调的色块。粒子的贴图没有具体限制,可以是灰度图,也可以是一张具体的图片。但要小于64x64pixel
    六、cocos2d-x实现Particle System
    第一种方法:
     
     CCParticleSystem* m_emitter;
     m_emitter = CCParticleFireworks::node();
     m_emitter->retain();
     this->addChild(m_emitter, 10);
     m_emitter->setTexture( CCTextureCache::sharedTextureCache()->addImage(“image.png”) );
     m_emitter->setPosition(ccp(489,320));
     
    第二种方法:
    CCParticleSystem* m_emitter;
    m_emitter = new CCParticleSystemQuad();
     m_emitter->initWithTotalParticles(50);
     this->addChild(m_emitter, 10);
     m_emitter->setTexture( CCTextureCache::sharedTextureCache()->addImage(s_stars1) );
     m_emitter->setDuration(-1);
       
       // gravity
     m_emitter->setGravity(CCPointZero);
       
       // angle
     m_emitter->setAngle(90);
     m_emitter->setAngleVar(360);
       
       // speed of particles
     m_emitter->setSpeed(160);
     m_emitter->setSpeedVar(20);
       
       // radial
     m_emitter->setRadialAccel(-120);
     m_emitter->setRadialAccelVar(0);
       
       // tagential
     m_emitter->setTangentialAccel(30);
     m_emitter->setTangentialAccelVar(0);
       
       // emitter position
     m_emitter->setPosition( CCPointMake(160,240) );
     m_emitter->setPosVar(CCPointZero);
       
       // life of particles
     m_emitter->setLife(4);
     m_emitter->setLifeVar(1);
       
       // spin of particles
     m_emitter->setStartSpin(0);
     m_emitter->setStartSizeVar(0);
     m_emitter->setEndSpin(0);
     m_emitter->setEndSpinVar(0);
       
       // color of particles
     ccColor4F startColor = {0.5f0.5f0.5f1.0f};
     m_emitter->setStartColor(startColor);
       
     ccColor4F startColorVar = {0.5f0.5f0.5f1.0f};
     m_emitter->setStartColorVar(startColorVar);
       
     ccColor4F endColor = {0.1f0.1f0.1f0.2f};
     m_emitter->setEndColor(endColor);
       
     ccColor4F endColorVar = {0.1f0.1f0.1f0.2f}; 
     m_emitter->setEndColorVar(endColorVar);
       
       // size, in pixels
     m_emitter->setStartSize(80.0f);
     m_emitter->setStartSizeVar(40.0f);
     m_emitter->setEndSize(kParticleStartSizeEqualToEndSize);
       
       // emits per second
     m_emitter->setEmissionRate(m_emitter->getTotalParticles()/m_emitter->getLife());
       
       // additive
     m_emitter->setIsBlendAdditive(true);
     
    第三种方法:
      CCParticleSystemQuad *system = new CCParticleSystemQuad();
      system->initWithFile("Images/SpinningPeas.plist");//plist文件可以通过例子编辑器获得
      system->setTextureWithRect(CCTextureCache::sharedTextureCache()->addImage("Images/particles.png")
           ,      CCRectMake(0,0,32,32));
      addChild(system, 10);
    system->setPosition 
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    如何处理iOS中照片的方向
    Builder Pattern 在 Objective-C 中的使用
    多线程(三)-- 线程安全问题
    多线程(二)--NSThread基本使用
    多线程 (一)
    报错:Request failed: unacceptable content-type: text/html
    Cocoapods简单安装和使用
    Objective
    Objective
    Python学习笔记(一)--注释
  • 原文地址:https://www.cnblogs.com/shangdahao/p/2447571.html
Copyright © 2020-2023  润新知