• cocos2d-x:Particle System(粒子系统)


    一、粒子系统简介:

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

    首先,从粒子池中获取一个粒子,
    然后计算赋予初始属性后,发射他。
    在粒子飞行过程中,不断的刷新来修正他的属性。
    粒子死亡后,回归粒子池。
     1     function getEmitter(idx)
     2         local emitter = cc.ParticleSnow:create()      --创建一个雪花粒子发射器
     3         emitter:setDuration(-1)                       --设置发射粒子的持续时间-1表示一直发射,0没有意义,其他值表示持续时间 
     4         emitter:setPosition(300, 1300)                --设置粒子发射器的位置  
     5         emitter:setLife(10)                           --设置粒子的生命值
     6         emitter:setLifeVar(1)                         --设置粒子生命值衰减变化率
     7 
     8         emitter:setGravity(cc.p(0, -10))              --设置粒子重力方向,这个点是相对发射点,x正方向为右,y正方向为上 
     9         emitter:setSpeed(130)                         --设置粒子速度
    10         emitter:setSpeedVar(40)                       --设置速度变化率  
    11 
    12         local startColor = emitter:getStartColor()    --设置粒子开始的颜色  
    13         startColor.r = 0.9
    14         startColor.g = 0.9
    15         startColor.b = 0.9
    16         emitter:setStartColor(startColor)
    17 
    18         local startColorVar = emitter:getStartColorVar()
    19         startColorVar.b = 0.1
    20         emitter:setStartColorVar(startColorVar)       --设置粒子颜色变化率  
    21         local size = cc.Sprite:create("commonUI/newres/snow/snow_" .. idx .. ".png"):getContentSize()
    22         emitter:setStartSize(size.width)
    23         emitter:setEndSize(size.width / 3)            --设置粒子开始的大小
    24         emitter:setEndSizeVar(size.width / 3 / emitter:getLife())  ----设置粒子生命结束时的大小
    25         if idx == 3 then
    26             emitter:setEmissionRate(emitter:getTotalParticles() / emitter:getLife() / 2)  --设置发射器每秒钟发射的粒子个数
    27         else
    28             emitter:setEmissionRate(emitter:getTotalParticles() / emitter:getLife() / 20)
    29             emitter:setTotalParticles(8)              --设置总的粒子个数
    30         end
    31 
    32         emitter:setTexture(cc.Director:getInstance():getTextureCache():addImage("commonUI/newres/snow/snow_" .. idx .. ".png")) --设置发射的粒子图片
    33         return emitter
    34     end
  • 相关阅读:
    Java读取Excel文件的几种方法
    PowerDesigner的安装和数据库创建(转载)
    JAVA UUID 生成
    Mysql的“Limit”操作
    实现java 中 list集合中有几十万条数据,每100条为一组取出
    MySQL5中大数据错误:Packet for query is too large (****** > ******). You can change this value on the server by setting the max_allowed_packet' variable.;
    Mybatis 示例之 foreach
    JAVA WEB ------ 文件下载及导出数据到office Execl表格
    8 -- 深入使用Spring -- 4...3 AOP的基本概念
    8 -- 深入使用Spring -- 4...2 使用AspectJ实现AOP
  • 原文地址:https://www.cnblogs.com/kane0526/p/6182200.html
Copyright © 2020-2023  润新知