zoukankan      html  css  js  c++  java
  • Cocos2d-html5 笔记4: 粒子

    今天看了cocos2d-html5里面的粒子系统相关的代码,首先看了代码中引用的两篇文章, 这两篇文章google上都可以搜到pdf的.

    The Ocean Spray in Your Face [jeff lander]
    Building an Advanced Particle System [John van der Burg]
    

    基本概念

    jeff lander的文章是一个很好的入门,讲述了基本的概念。

    游戏里面的烟火,大雾,爆炸还有血液四溅的效果:(,都是用粒子系统来模拟的。一个粒子(particle)是3D空间中的一个点。基本属性,如位置,速度,方向,还有生命周期(就是这个粒子该画多少帧)等,发射器(emitter)负责 粒子的创建,还有particle pool这个主要是性能上的优化,降低粒子的alloc和free的开销。生成粒子的时候,直接从pool里面取,然后粒子销毁的时候,把粒子放回pool里面.

    为了使粒子看起来有一定的随机性,有些属性会有方差variance这个值吧。这样emitter发射的时候,可以根据这个方差来生成具有一定随机值的粒子。 比如这样可以生成具有一定随机数个数的粒子:

    particleCount = emitNumber + (emitVariance * RandomNum());
    

    然后添加粒子初始化的时候,可以根据这个方差来设置粒子的属性,比如这个粒子的life.

    particle.timeToLive = emitter._life + emitter._lifeVar * cc.RANDOM_MINUS1_1();
    

    代码结构

    John van der Burg讲的更详细一些, 更多的是代码结构上的,它将粒子系统分为三个层次, 基本上是一层管一层。。

    Particle Manager --> Particle System --> Particle
    

    Particle Manager负责particle system 的管理, 一个particle system由很多有公共属性的粒子组成吧,便于粒子的管理. 这里的ParticleSystem就相当于上面的emitter.

    然后基本框架可以是这样,其中ParticleManager是单例的(个人觉得代码里面称得上是Manager的一般都是单例模式的), ParticleManager和ParticleSystem 还有add和remove这一类的方法.

    class Game:
        def run():
            while(true)
            {
                //other codes
                self.particle_manager.update(time)
                //other codes
            }
    
    class ParticleManager:
        def update(self, time):
            for s in self.active_systems:
                if system.isDie(time):
                    self.active_systems.remove(s)
                else:
                    s.update
    
    class ParticleSystem:
        def update(self, time):
            for p in self.active_particles:
                if p.isDie(time):
                    game.particle_pool.add(p)
                    self.active_particles.remove(p)
                else:
                    p.update(time)
    

    从画图上来说,一个粒子系统有如下的属性

    • Texture, 粒子的贴图,出于性能上的考虑吧, 一个粒子系统里面所有的粒子用相同的贴图.
    • blendMode, 混合模式. 类似于opengl里面的混合模式。

    cocos2d粒子

    cocos2d里面的粒子实现和上面个的基本上一致吧:), 不过cocos2d里木有ParticleManager。因为ParticleSystem也是从Node这个直接派生过来的,ParticleSystem的管理基本上可以交給Node了。

    particle

    Particle的属性

    pos, startpos, color, deltaColor, size, deletaSize, rotation, deltaRotaion, 
    timeToLieve, modeA, modeB, ischangeColor, drawPos
    

    modeA是重力模式,modeB是circular movement(不知道咋翻译哈) deltaColor和deltaSize 这两个属性使得粒子在运动的时候可以改变颜色和大小。

    particle system

    一个particle system包含了particle的一些属性还有它的属性值的方差, 这样就可以用来生成不同的粒子了。particle system里面的继承关系如下:

    CCParticleSystemQuad --> CCParticleSystem
    

    CCParticleSystem是基类它负责粒子的创建,初始化还有update,在update的中去遍历所有的粒子,然后计算更新粒子的属性。

    然后CCParticleSystemQuad这个把粒子画出来(用quad画出来)如果是webgl的画,会采用bacthmode来优化。它实现了draw和visit这俩个函数。

    particle system editor

    在CCParticleExample.js里面有一些比如fire, sun, galaxy, flow等一些粒子效果,这些只是设置下参数而已。话说应该有很多粒子效果编辑器吧。这些编辑器也就是调调这些参数,然后导出.plist文件(cocos2d里面可以直接用.plist来初始化一个particle system)既然都有cocos2d-html5了,可以做一个web版的粒子编辑器。

  • 相关阅读:
    django路由——关于路由最后斜杠的问题
    django-admin 汉化
    动态绑定属性、方法 以及 __slots__
    type()、获取对象信息
    String,StringBuffer,StringBuilder三种的性能差异
    线程创建的三种方式的比较(继承Thread,Runnable接口,Callable接口)
    单例设计模式
    用Dockerfile来build原理和过程
    etcd和redis
    win10部署docker和mongo
  • 原文地址:https://www.cnblogs.com/zhepama/p/3167532.html
Copyright © 2011-2022 走看看