现在的位置: 首页 > 综合 > 正文

cocos2d-x节点(CCParticleSystem.h)API

2014年01月09日 ⁄ 综合 ⁄ 共 11942字 ⁄ 字号 评论关闭

本文来自http://blog.csdn.net/runaying ,引用必须注明出处!

cocos2d-x节点(CCParticleSystem.h)API

温馨提醒:为了大家能更好学习,强烈推荐大家看看本人的这篇博客 Cocos2d-X权威指南笔记

粒子系统的基类,重力模式、半径模式     备注:变动 是,每一次 增减/减少 的固定值

///cocos2d-x-3.0alpha0/cocos2dx/particle_nodes
//粒子系统的基类,重力模式、半径模式     备注:变动 是,每一次 增减/减少 的固定值

#ifndef __CCPARTICLE_SYSTEM_H__
#define __CCPARTICLE_SYSTEM_H__

#include "CCProtocols.h"
#include "base_nodes/CCNode.h"
#include "cocoa/CCDictionary.h"
#include "cocoa/CCString.h"

NS_CC_BEGIN

/**
 * @addtogroup particle_nodes
 * @{
 */

class ParticleBatchNode;

/**
包含每个粒子的值的结构
*/
typedef struct sParticle {
    Point     pos;
    Point     startPos;

    Color4F    color;
    Color4F    deltaColor;

    float        size;
    float        deltaSize;

    float        rotation;
    float        deltaRotation;

    float        timeToLive;

    unsigned int    atlasIndex;

    //! Mode A: gravity, direction, radial accel, tangential accel      //重力,方向,径向加速度,切向加速度
    struct {
        Point        dir;
        float        radialAccel;
        float        tangentialAccel;
    } modeA;

    //! Mode B: radius mode
    struct {
        float        angle;
        float        degreesPerSecond;
        float        radius;
        float        deltaRadius;
    } modeB;

}tParticle;

//typedef void (*CC_UPDATE_PARTICLE_IMP)(id, SEL, tParticle*, Point);

class Texture2D;

/** @brief 粒子系统的基类。
一个粒子系统的属性:
- 颗粒的发射率
- 重力模式 (Mode A):
- gravity               //重力
- direction             //方向
- speed +-  variance        //速度 + -变动
- tangential acceleration +- variance       //切向加速度+ - 变动
- radial acceleration +- variance           //径向加速度+ - 变动
- Radius Mode (Mode B):         //半径模式
- startRadius +- variance           //开始半径+- 变动
- endRadius +- variance           //结束半径+- 变动
- rotate +- variance                //环绕 +- 变动
- Properties common to all modes:       //所有模式共同的属性
- life +- life variance         //life 变动
- start spin +- variance        //开始旋转+ - 变动
- end spin +- variance          //结束旋转+ - 变动
- start size +- variance        //初始尺寸+- 变动
- end size +- variance        //结束尺寸+- 变动
- start color +- variance        //初始+- 变动
- end color +- variance        //结束尺寸+- 变动
- life +- variance              //生命值 +- 变动
- blending function             //混合功能
- texture

cocos2d 也支持 Particle Designer 生成 particles (http://particledesigner.71squared.com/).
 Particle Designer 的 'Radius Mode'使用 30 hz 的固定发射率. 在 cocos2d 里面不能保证
cocos2d 中采用了另一种方法,但结果几乎是相同的

 Particle Designer 支持所有 cocos2d 变量,在加上下面一些:
- spinning particles (supported when using ParticleSystemQuad)      //自旋粒子(使用ParticleSystemQuad时支持)
- tangential acceleration (Gravity mode)        //切向加速度(重力模式)
- radial acceleration (Gravity mode)
- radius direction (Radius mode) (Particle Designer supports outwards to inwards direction only)    //半径方向(半径模式)((Particle Designer 只支持从外向内的方向)

在运行时可以自定义任何上述物品,例如:

@code
emitter.radialAccel = 15;   //发射器的径向加速
emitter.startSpin = 0;      //发射器的开始旋转
@endcode

*/
class CC_DLL ParticleSystem : public Node, public TextureProtocol
{
public:
    enum class Mode
    {
        GRAVITY,
        RADIUS,
    };
    
    /** @typedef PositionType
     粒子位置的可能类型
     */
    enum class PositionType
    {
        /** 附着于世界的 Living particles 受发射器重新定位影响. */
        FREE,
        
        /** 附着于世界的 Living particles  遵循发射器的重新定位。
         使用情况: 在 sprite 上附加发射器,你希望发射器跟随 sprite.
         */
        RELATIVE,
        
        /** Living particles 附着于发射器,和跟随它一起转换. */
        GROUPED,
    };
    
    //* @enum
    enum {
        /** 粒子发射器永远 lives */
        DURATION_INFINITY = -1,
        
        /** 粒子的初始尺寸,等于结束尺寸 */
        START_SIZE_EQUAL_TO_END_SIZE = -1,
        
        /** 粒子的起始半径等于结束半径 */
        START_RADIUS_EQUAL_TO_END_RADIUS = -1,
    };
    
    /** 从一个plist文件创建并初始化一个粒子系统,这个plist文件可以手动创建或者使用  Particle Designer 创建:

http://particledesigner.71squared.com/

    @since v2.0
    */
    static ParticleSystem * create(const char *plistFile);

    //! 使用 固定数量的颗粒 建立一个系统
    static ParticleSystem* createWithTotalParticles(unsigned int numberOfParticles);
    /**
     * @js ctor
     */
    ParticleSystem();
    /**
     * @js NA
     * @lua NA
     */
    virtual ~ParticleSystem();

    /** 初始化一个 ParticleSystem*/
    bool init();
    /** 从一个plist文件创建并初始化一个粒子系统,这个plist文件可以手动创建或者使用  Particle Designer 创建:

http://particledesigner.71squared.com/

    @since v0.99.3
    */
    bool initWithFile(const char *plistFile);

    /** 使用 Dictionary 初始化一个 QuadParticleSystem .
    @since v0.99.3
    */
    bool initWithDictionary(Dictionary *dictionary);
    
    /** 使用 NSDictionary,需要加载的 png 文件路径 初始化一个 particle system
     @since v2.1
     */
    bool initWithDictionary(Dictionary *dictionary, const char *dirname);

    //! 使用 固定数量的颗粒 初始化一个系统
    virtual bool initWithTotalParticles(unsigned int numberOfParticles);

    //! 添加粒子到发射器
    bool addParticle();
    //! 初始化粒子
    void initParticle(tParticle* particle);
    //! 停止发射粒子。运行的粒子将继续运行,直到他们死了
    void stopSystem();
    //! 杀死所有 living 粒子。
    void resetSystem();
    //! whether or not the system is full       //系统是否充满
    bool isFull();

    //! 应该由子类重写
    virtual void updateQuadWithParticle(tParticle* particle, const Point& newPosition);
    //! 应该由子类重写
    virtual void postStep();

    virtual void updateWithNoTime(void);

    virtual bool isAutoRemoveOnFinish() const;
    virtual void setAutoRemoveOnFinish(bool var);

    // mode A
    virtual const Point& getGravity();
    virtual void setGravity(const Point& g);
    virtual float getSpeed() const;
    virtual void setSpeed(float speed);
    virtual float getSpeedVar() const;
    virtual void setSpeedVar(float speed);
    virtual float getTangentialAccel() const;
    virtual void setTangentialAccel(float t);
    virtual float getTangentialAccelVar() const;
    virtual void setTangentialAccelVar(float t);
    virtual float getRadialAccel() const;
    virtual void setRadialAccel(float t);
    virtual float getRadialAccelVar() const;
    virtual void setRadialAccelVar(float t);
    virtual bool getRotationIsDir() const;
    virtual void setRotationIsDir(bool t);
    // mode B
    virtual float getStartRadius() const;
    virtual void setStartRadius(float startRadius);
    virtual float getStartRadiusVar() const;
    virtual void setStartRadiusVar(float startRadiusVar);
    virtual float getEndRadius() const;
    virtual void setEndRadius(float endRadius);
    virtual float getEndRadiusVar() const;
    virtual void setEndRadiusVar(float endRadiusVar);
    virtual float getRotatePerSecond() const;
    virtual void setRotatePerSecond(float degrees);
    virtual float getRotatePerSecondVar() const;
    virtual void setRotatePerSecondVar(float degrees);

    virtual void setScale(float s);
    virtual void setRotation(float newRotation);
    virtual void setScaleX(float newScaleX);
    virtual void setScaleY(float newScaleY);

    virtual bool isActive() const;
    virtual bool isBlendAdditive() const;
    virtual void setBlendAdditive(bool value);

    virtual ParticleBatchNode* getBatchNode() const;
    virtual void setBatchNode(ParticleBatchNode* batchNode);
    
    // 批处理 array 系统的索引
    inline int getAtlasIndex() const { return _atlasIndex; };
    inline void setAtlasIndex(int index) { _atlasIndex = index; };

    /** 当前时刻被模拟的粒子数量 */
    inline unsigned int getParticleCount() const { return _particleCount; };
    
    /** 发射器将运行多少秒. -1 意味着 'forever' */
    inline float getDuration() const { return _duration; };
    inline void setDuration(float duration) { _duration = duration; };
    
    /** sourcePosition of the emitter(发射源的位置) */
    inline const Point& getSourcePosition() const { return _sourcePosition; };
    inline void setSourcePosition(const Point& pos) { _sourcePosition = pos; };
    
    /** 发射器位置的变动量 */
    inline const Point& getPosVar() const { return _posVar; };
    inline void setPosVar(const Point& pos) { _posVar = pos; };

    /** life, 每个粒子的 life 变动量 */
    inline float getLife() const { return _life; };
    inline void setLife(float life) { _life = life; };

    /** 每个粒子的 life 变动量 */
    inline float getLifeVar() const { return _lifeVar; };
    inline void setLifeVar(float lifeVar) { _lifeVar = lifeVar; };

    /** angle ,每个粒子的角度变化量 */
    inline float getAngle() const { return _angle; };
    inline void setAngle(float angle) { _angle = angle; };

    /** 每个粒子的角度变化量 */
    inline float getAngleVar() const { return _angleVar; };
    inline void setAngleVar(float angleVar) { _angleVar = angleVar; };
    
    /** 不同类型的发射模式之间的切换:
     - kParticleModeGravity: uses gravity, speed, radial and tangential acceleration
     - kParticleModeRadius: uses radius movement + rotation
     */
    inline Mode getEmitterMode() const { return _emitterMode; };
    inline void setEmitterMode(Mode mode) { _emitterMode = mode; };
    
    /** 每个粒子的初始化时的尺寸(以像素为单位) */
    inline float getStartSize() const { return _startSize; };
    inline void setStartSize(float startSize) { _startSize = startSize; };

    /** 每个粒子的尺寸变化量(以像素为单位) */
    inline float getStartSizeVar() const { return _startSizeVar; };
    inline void setStartSizeVar(float sizeVar) { _startSizeVar = sizeVar; };

    /** 每个粒子的结束时的尺寸(以像素为单位) */
    inline float getEndSize() const { return _endSize; };
    inline void setEndSize(float endSize) { _endSize = endSize; };

    /** 结束时每个粒子的尺寸变化量(以像素为单位) */
    inline float getEndSizeVar() const { return _endSizeVar; };
    inline void setEndSizeVar(float sizeVar) { _endSizeVar = sizeVar; };

    /** 每个粒子开始颜色 */
    inline const Color4F& getStartColor() const { return _startColor; };
    inline void setStartColor(const Color4F& color) { _startColor = color; };

    /** 每个粒子开始颜色的变动量 */
    inline const Color4F& getStartColorVar() const { return _startColorVar; };
    inline void setStartColorVar(const Color4F& color) { _startColorVar = color; };

    /** end color,结束时每个粒子的颜色变化量 */
    inline const Color4F& getEndColor() const { return _endColor; };
    inline void setEndColor(const Color4F& color) { _endColor = color; };

    /** 结束时每个粒子的颜色变化量 */
    inline const Color4F& getEndColorVar() const { return _endColorVar; };
    inline void setEndColorVar(const Color4F& color) { _endColorVar = color; };

    //* 每个粒子的初始角度
    inline float getStartSpin() const { return _startSpin; };
    inline void setStartSpin(float spin) { _startSpin = spin; };

    //* 每个粒子的初始角度
    inline float getStartSpinVar() const { return _startSpinVar; };
    inline void setStartSpinVar(float pinVar) { _startSpinVar = pinVar; };

    //* 每个粒子的初始角度
    inline float getEndSpin() const { return _endSpin; };
    inline void setEndSpin(float endSpin) { _endSpin = endSpin; };

    //* 每个粒子的初始角度
    inline float getEndSpinVar() const { return _endSpinVar; };
    inline void setEndSpinVar(float endSpinVar) { _endSpinVar = endSpinVar; };

    /** 粒子的发射率 */
    inline float getEmissionRate() const { return _emissionRate; };
    inline void setEmissionRate(float rate) { _emissionRate = rate; };

    /** 系统的最大粒子 */
    virtual int getTotalParticles() const;
    virtual void setTotalParticles(int totalParticles);

    /** 使用alpha值修改颜色 */
    inline void setOpacityModifyRGB(bool opacityModifyRGB) { _opacityModifyRGB = opacityModifyRGB; };
    inline bool isOpacityModifyRGB() const { return _opacityModifyRGB; };
    CC_DEPRECATED_ATTRIBUTE inline bool getOpacityModifyRGB() const { return isOpacityModifyRGB(); }
    
    /** 粒子的运动类型:自由或分组
     @since v0.8
     */
    inline PositionType getPositionType() const { return _positionType; };
    inline void setPositionType(PositionType type) { _positionType = type; };
    
    // Overrides
    virtual void update(float dt) override;
    virtual Texture2D* getTexture() const override;
    virtual void setTexture(Texture2D *texture) override;
    /**
    *@code
    *当这个函数绑定到 js or lua,输入参数会改变
    *In js: var setBlendFunc(var src, var dst)
    *In lua: local setBlendFunc(local src, local dst)
    *@endcode
    */
    virtual void setBlendFunc(const BlendFunc &blendFunc) override;
    /**
    * @js NA
    * @lua NA
    */
    virtual const BlendFunc &getBlendFunc() const override;
protected:
    virtual void updateBlendFunc();

protected:
    /** 添加时是否使用混合功能.
     如果启用,下列混合功能将使用
     @code
     source blend function = GL_SRC_ALPHA;
     dest blend function = GL_ONE;
     @endcode
     */
    bool _isBlendAdditive;

    /** 没有 颗粒离开时,节点是否被自动删除
     By default it is false.
     @since v0.8
     */
    bool _isAutoRemoveOnFinish;

    std::string _plistFile;
    //! 从系统开始到现在所经历的时间
    float _elapsed;

    // Different modes
    //! Mode A:Gravity + Tangential Accel + Radial Accel
    struct {
        /** 重力值。仅适用于 'Gravity' 模式. */
        Point gravity;
        /** 每个粒子的速度。仅适用于 'Gravity' 模式.  */
        float speed;
        /** 每个粒子的速度变动. 仅适用于 'Gravity' 模式. */
        float speedVar;
        /** 每个粒子的切向加速度. 仅适用于 'Gravity' 模式. */
        float tangentialAccel;
        /** 每个粒子的切向加速度变动. 仅适用于 'Gravity' 模式. */
        float tangentialAccelVar;
        /** 每个粒子的径向加速度. 仅适用于 'Gravity' 模式. */
        float radialAccel;
        /** 每个粒子的径向加速度变动. 仅适用于 'Gravity' 模式. */
        float radialAccelVar;
        /** 设置每个粒子的旋转方向,仅适用于 'Gravity' 模式. */
        bool rotationIsDir;
    } modeA;

    //! Mode B: circular movement (gravity, radial accel 、 tangential accel 不要在这个模型里面使用)
    struct {
        /** 粒子的起始半径. 仅适用于 'Radius' 模式. */
        float startRadius;
        /** 粒子的起始半径变动.  仅适用于 'Radius' 模式. */
        float startRadiusVar;
        /** 结束时的粒子半径.  仅适用于 'Radius' 模式. */
        float endRadius;
        /** 结束时粒子半径变动.  仅适用于 'Radius' 模式. */
        float endRadiusVar;
        /** 源位置周围的粒子每秒旋转角度.  仅适用于 'Radius' 模式. */
        float rotatePerSecond;
        /** 每秒的旋转变动. 仅适用于 'Radius' 模式. */
        float rotatePerSecondVar;
    } modeB;

    //! 粒子 Array 
    tParticle *_particles;

    // 色彩调节
    //    BOOL colorModulate;

    //!每秒可发出多少粒子
    float _emitCounter;

    //!  particle idx
    int _particleIdx;

    // Optimization             //优化
    //CC_UPDATE_PARTICLE_IMP    updateParticleImp;
    //SEL                        updateParticleSel;

    /** the SpriteBatchNode 呈现 Sprite 是弱引用 */
    ParticleBatchNode* _batchNode;

    // 在批处理 array 里面的索引
    int _atlasIndex;

    //true 如果 缩放/旋转
    bool _transformSystemDirty;
    // 分配的粒子数
    int _allocatedParticles;

    /** 是否激活了发射器 */
    bool _isActive;
    
    /** 当前时刻被模拟的颗粒数量 */
    int _particleCount;
    /** 发射器将运行多久 -1 意味着 'forever' */
    float _duration;
    /** 发射源的位置*/
    Point _sourcePosition;
    /** 发射器的位置变动量 */
    Point _posVar;
    /** life,每个粒子的 life 变动量 */
    float _life;
    /** 每个粒子的 life 变动量 */
    float _lifeVar;
    /** angle ,每个粒子的角度变化量 */
    float _angle;
    /** 每个粒子的角度变化量 */
    float _angleVar;

    /** 不同类型的发射模式之间切换:
     - kParticleModeGravity: uses gravity, speed, radial and tangential acceleration
     - kParticleModeRadius: uses radius movement + rotation
     */
    Mode _emitterMode;

    /** 每个粒子的初始化尺寸(以像素为单位) */
    float _startSize;
    /** 每个粒子的尺寸变化量 */
    float _startSizeVar;
    /** 每个粒子的结束时的尺寸(以像素为单位) */
    float _endSize;
    /** 每个粒子的尺寸变化量*/
    float _endSizeVar;
    /** 每个粒子开始颜色 */
    Color4F _startColor;
    /** 每个粒子开始颜色的变动量 */
    Color4F _startColorVar;
    /** end color ,结束时每个粒子的颜色变化量 */
    Color4F _endColor;
    /** 结束时每个粒子的颜色变化量 */
    Color4F _endColorVar;
    //* 每个粒子的初始角度
    float _startSpin;
    //* 每个粒子的初始角度
    float _startSpinVar;
    //* 每个粒子的初始角度
    float _endSpin;
    //* 每个粒子的初始角度
    float _endSpinVar;
    /** 粒子的发射率 */
    float _emissionRate;
    /** 系统的最大粒子 */
    int _totalParticles;
    /** 符合 CocosNodeTexture 协议 */
    Texture2D* _texture;
    /** 符合 CocosNodeTexture 协议 */
    BlendFunc _blendFunc;
    /** 使用alpha值修改颜色 */
    bool _opacityModifyRGB;

    /** 粒子的运动类型:自由或分组
     @since v0.8
     */
    PositionType _positionType;
};

// end of particle_nodes group
/// @}

NS_CC_END

#endif //__CCPARTICLE_SYSTEM_H__

【上篇】
【下篇】

抱歉!评论已关闭.