Cocos2d粒子系统二

粒子系统的属性:

  • 粒子的发射速度
  • 重力模式(模式A):
    • 重力
    • 方向
    • 速度 +- 变动
    • 切向加速度 +- 变动
    • 径向加速度 +- 变动
  • 半径模式(模式B):
    • 开始半径 +- 变动
    • 结束半径 +- 变动
    • 旋转 +- 变动
  • 所有模式的公用属性:
    • 生命
    • 开始旋转
    • 结束旋转
    • 开始尺寸
    • 结束尺寸
    • 开始颜色
    • 结束颜色
    • 生命
    • 合成函数
    • 质感

Cocos2d支持由Particle Designer生成的粒子(http://71squared.com/particledesigner(尼玛要$50啊))

“半径模式”在Particle Designer中使用的是固定30hz的频率,但是在cocos2d中频率是可变的,不过结果还是能保持一致的。

cocos2d支持Particle Designer中的所有变量,还多了一点点:

  • 粒子旋转(适用于ParticleSystemQuad)
  • 正切加速度(重力模式)
  • 径向加速度(重力模式)
  • 半径方向(半径模式)(Particle Designer只支持向外和向内的方向)

以上的所有属性在运行时都是可变的,如:

[cpp] view plaincopy

  1. emitter.radialAccel = 15;
  2. emitter.startSpin = 0;

不同的地方:

Cocos2d-x-2.x Cocos2d-x-3.x
kCCParticleDefaultCapacity kParticleDefaultCapacity
ParticleSystem::Mode kCCParticleModeGravity ParticleSystem::Mode::GRAVITY
ParticleSystem::Mode kCCParticleModeRadius ParticleSystem::Mode::RADIUS
N/A typedef ParticleSystem::PositionType tPositionType
kCCPositionTypeFree /
kPositionTypeFree
ParticleSystem::PositionType::FREE
kCCPositionTypeRelative /
kPositionTypeRelative
ParticleSystem::PositionType::RELATIVE
kCCPositionTypegRrouped /
kPositionTypegRrouped
ParticleSystem::PositionType::GROUPED
kCCParticleDurationInfinity /
kParticleDurationInfinity
ParticleSystem::DURATION_INFINITY
kCCParticleStartSizeEqualToEndSize /
kParticleStartSizeEqualToEndSize
ParticleSystem::START_SIZE_EQUAL_TO_END_SIZE
kCCParticleStartRadiusEqualToEndRadius /
kParticleStartRadiusEqualToEndRadius
ParticleSystem::START_RADIUS_EQUAL_TO_END_RADIUS
  • 20多个内联函数定义在头文件中用来取代像CC_PROPERTY(varType, varName, funName)和CC_PROPERTY_READONLY(varType, varName, funName)这样的宏
Cocos2d-x-2.x Cocos2d-x-3.x
CC_PROPERTY(int, m_nEmitterMode, EmitterMode) Mode _emitterMode; inline Mode getEmitterMode() const { return _emitterMode; };inline void setEmitterMode(Mode mode) { _emitterMode = mode; };
CC_PROPERTY(CCParticleBatchNode*, m_pBatchNode, BatchNode) ParticleBatchNode* _batchNode; virtual ParticleBatchNode* getBatchNode() const;virtual void setBatchNode(ParticleBatchNode* batchNode);
CC_PROPERTY_READONLY(unsigned int, m_uParticleCount, ParticleCount) int _particleCount; inline unsigned int getParticleCount() const { return _particleCount; };
CC_PROPERTY(float, m_fDuration, Duration) float _duration; inline float getDuration() const { return _duration; };inline void setDuration(float duration) { _duration = duration; };
CC_PROPERTY_PASS_BY_REF(CCPoint, m_tSourcePosition, SourcePosition) Point _sourcePosition;inline const Point& getSourcePosition() const { return _sourcePosition; };inline void setSourcePosition(const Point& pos) { _sourcePosition = pos; };
CC_PROPERTY_PASS_BY_REF(CCPoint, m_tPosVar, PosVar) Point _posVar; inline const Point& getPosVar() const { return _posVar; };inline void setPosVar(const Point& pos) { _posVar = pos; };
CC_PROPERTY(float, m_fLife, Life) float _life; inline float getLife() const { return _life; };inline void setLife(float life) { _life = life; };
CC_PROPERTY(float, m_fLifeVar, LifeVar) float _lifeVar; inline float getLifeVar() const { return _lifeVar; };inline void setLifeVar(float lifeVar) { _lifeVar = lifeVar; };
CC_PROPERTY(float, m_fAngle, Angle) float _angle; inline float getAngle() const { return _angle; };inline void setAngle(float angle) { _angle = angle; };
CC_PROPERTY(float, m_fAngleVar, AngleVar) float _angleVar; inline float getAngleVar() const { return _angleVar; };inline void setAngleVar(float angleVar) { _angleVar = angleVar; };
CC_PROPERTY(float, m_fStartSize, StartSize) float _startSize; inline float getStartSize() const { return _startSize; };inline void setStartSize(float startSize) { _startSize = startSize; };
CC_PROPERTY(float, m_fStartSizeVar, StartSizeVar) float _startSizeVar; inline float getStartSizeVar() const { return _startSizeVar; };inline void setStartSizeVar(float sizeVar) { _startSizeVar = sizeVar; };
CC_PROPERTY(float, m_fEndSize, EndSize) float _endSize; inline float getEndSize() const { return _endSize; };inline void setEndSize(float endSize) { _endSize = endSize; };
CC_PROPERTY(float, m_fEndSizeVar, EndSizeVar) float _endSizeVar; inline float getEndSizeVar() const { return _endSizeVar; };inline void setEndSizeVar(float sizeVar) { _endSizeVar = sizeVar; };
CC_PROPERTY_PASS_BY_REF(ccColor4F, m_tStartColor, StartColor) Color4F _startColor; inline const Color4F& getStartColor() const { return _startColor; };inline void setStartColor(const Color4F& color) { _startColor = color; };
CC_PROPERTY_PASS_BY_REF(ccColor4F, m_tStartColorVar, StartColorVar) Color4F _startColorVar;inline const Color4F& getStartColorVar() const { return _startColorVar; };inline void setStartColorVar(const Color4F& color) { _startColorVar = color; };
CC_PROPERTY_PASS_BY_REF(ccColor4F, m_tEndColorVar, EndColorVar) Color4F _endColorVar; inline const Color4F& getEndColor() const { return _endColor; };inline void setEndColor(const Color4F& color) { _endColor = color; };
CC_PROPERTY(float, m_fStartSpin, StartSpin) float _startSpin; inline float getStartSpin() const { return _startSpin; };inline void setStartSpin(float spin) { _startSpin = spin; };
CC_PROPERTY(float, m_fStartSpinVar, StartSpinVar) float _startSpinVar; inline float getStartSpinVar() const { return _startSpinVar; };inline void setStartSpinVar(float pinVar) { _startSpinVar = pinVar; };
CC_PROPERTY(float, m_fEndSpin, EndSpin) float _endSpinVar; inline float getEndSpin() const { return _endSpin; };inline void setEndSpin(float endSpin) { _endSpin = endSpin; };
CC_PROPERTY(float, m_fEndSpinVar, EndSpinVar) float _endSpinVar; inline float getEndSpinVar() const { return _endSpinVar; };inline void setEndSpinVar(float endSpinVar) { _endSpinVar = endSpinVar; };
CC_PROPERTY(float, m_fEmissionRate, EmissionRate) float _emissionRate; inline float getEmissionRate() const { return _emissionRate; };inline void setEmissionRate(float rate) { _emissionRate = rate; };
CC_PROPERTY(unsigned int, m_uTotalParticles, TotalParticles) int _totalParticles; virtual int getTotalParticles() const;virtual void setTotalParticles(int totalParticles);
CC_PROPERTY(CCTexture2D*, m_pTexture, Texture) Texture2D* _texture; virtual Texture2D* getTexture() const override;virtual void setTexture(Texture2D *texture) override;
CC_PROPERTY(ccBlendFunc, m_tBlendFunc, BlendFunc) BlendFunc _blendFunc; virtual void setBlendFunc(const BlendFunc &blendFunc) override;virtual const BlendFunc &getBlendFunc() const override;
CC_PROPERTY(bool, m_bOpacityModifyRGB, OpacityModifyRGB) bool _opacityModifyRGB;inline void setOpacityModifyRGB(bool opacityModifyRGB) { _opacityModifyRGB = opacityModifyRGB; };inline bool isOpacityModifyRGB() const { return _opacityModifyRGB; };CC_DEPRECATED_ATTRIBUTE inline bool getOpacityModifyRGB() const { return isOpacityModifyRGB(); }
CC_PROPERTY(tCCPositionType, m_ePositionType, PositionType) PositionType _positionType;inline PositionType getPositionType() const { return _positionType; };inline void setPositionType(PositionType type) { _positionType = type; };
CC_SYNTHESIZE(unsigned int, m_uAtlasIndex, AtlasIndex) int _atlasIndex; inline int getAtlasIndex() const { return _atlasIndex; };inline void setAtlasIndex(int index) { _atlasIndex = index; };
  • 在3.x中新增了两个属性std::string _configName;和int _yCoordFlipped;

CCParticleSystemQuad和ParticleSystemQuad

相似的地方:

继承图

ParticleSystemQuad是ParticleSystem的子类。

它包含了ParticleSystem中所有的特性。

下面是它独有的一些特性和限制:

  • 粒子尺寸可为任意float值;
  • 系统可以缩放;
  • 粒子可以旋转;
  • 支持subrects(不知道怎么译,“子矩”自己看了都不懂)
  • 从1.1版本开始支持批量渲染

不同的地方:

3.x中没啥改变,像在2.x中使用3.x的类就可以了,更多的细节请点击这里

例子:

  • 下面是ParticleSystem的例子:

/*
    // Cocos2d-x-2.x
    CCSize size = CCDirector::sharedDirector()->getWinSize();
    ParticleSystemQuad* m_emitter = ParticleSystemQuad::createWithTotalParticles(900);
    m_emitter->setTexture(CCTextureCache::sharedTextureCache()->addImage("fire.png"));
*/
    // Cocos2d-x-3.x
    auto size = Director::getInstance()->getWinSize();
    auto m_emitter = ParticleSystemQuad::createWithTotalParticles(900);
    m_emitter->setTexture(Director::getInstance()->getTextureCache()->addImage("fire.png"));

    //The code below we can use both in 2.x and 3.x
    m_emitter->setDuration(-1);
    m_emitter->setGravity(Point(0, -240));  // in Cocos2d-x-2.x CCPoint(0, -240) is used
    m_emitter->setAngle(90);
    m_emitter->setAngleVar(360);
    m_emitter->setRadialAccel(50);
    m_emitter->setRadialAccelVar(0);
    m_emitter->setTangentialAccel(30);
    m_emitter->setTangentialAccelVar(0);
    m_emitter->setPosition(Point(size.width / 2, size.height));
    m_emitter->setPosVar(Point(400, 0));
    m_emitter->setLife(4);
    m_emitter->setLifeVar(2);
    m_emitter->setStartSpin(30);
    m_emitter->setStartSpinVar(60);
    m_emitter->setEndSpin(60);
    m_emitter->setEndSpinVar(60);
    m_emitter->setStartColor(Color4F(255,255,255,1));
    m_emitter->setStartColorVar(Color4F(0,0,0,0));
    m_emitter->setEndColor(Color4F(255, 255, 255, 1));
    m_emitter->setEndColorVar(Color4F(0, 0, 0, 0));
    m_emitter->setStartSize(30);
    m_emitter->setStartSizeVar(0);
    m_emitter->setEndSize(20.0f);
    m_emitter->setEndSizeVar(0);
    m_emitter->setEmissionRate(100);
    addChild(m_emitter,10);
  • 你也可以使用下面这些牛B的子类来轻易创建一些常用的粒子效果

    • ParticleExplosion, ParticleFire, ParticleFireworks, ParticleFlower, ParticleGalaxy, ParticleMeteor, ParticleRain, ParticleSmoke, ParticleSnow, ParticleSpiral, ParticleSun
时间: 2024-10-13 03:16:09

Cocos2d粒子系统二的相关文章

【Cocos2D研究院之游戏开发】

http://www.xuanyusong.com/archives/category/ios/cocos2d_game 分类目录归档:[Cocos2D研究院之游戏开发] 201211-19 Cocos2D研究院之打开全新ViewController与返回(八) 雨松MOMO [Cocos2D研究院之游戏开发] 围观5745次 17条评论          之前cocos2d的文章都是由魏凯同学维护,从今天开始我也会抽时间写点cocos2d的文章.最近在研究如何将IOS游戏与软件结合起来.通常游

初学Cocos2dx

初学cocos2dx Cocos2dx 中的主要概念包括:应用.导演.场景.层.精灵.动画.动作. Cocos2dx里面的主要类 1.CCObject Object Object Object 是cocos2dx的主要基类.主要提供了引用计数的功能. 2.CCPoolManager CCPoolManager CCPoolManager CCPoolManager 是个单体类,负责管理多个垃圾回收器 CCAutoreleasePool 在CCObject::Autorelease方法中单体CCP

Cocos2d之Node类详解之节点树(二)

一.声明 本文属于笔者原创,允许读者转载和分享,只要注明文章来源即可. 笔者使用cocos2d框架的cocos2d-x-3.3rc0版本的源代码做分析.这篇文章承接上篇<Cocos2d之Node类详解之节点树(一)>. 二.简介 节点 一个Node对象. 节点树 上篇文章介绍到,Node类有一个成员变量 Vector<Node*> _children,这是一个保存所有子节点的数组,因为Node类采用遍历树的方式获取子节点进行渲染,所以我管这两个东西的结合叫节点树. 三.源码详解 &

[OpenGL] 简单二维粒子系统——烟花,喷水,落叶

参考代码:http://download.csdn.net/detail/blue6333589/6785389 在这个代码的基础上扩展了二维粒子系统的框架,该系统由一个发射器类和一个粒子类组成,作为编程练习而言,我们只实现了最基本的粒子系统功能,但是已经可以做出一些效果了. 在这里,通过调节参数给出了在这个框架下烟花.喷水.落叶的代码,参考代码实现的是飘雪:只要在物理参数模拟和贴图选择上做得足够好,也可以实现火焰.爆炸等效果. 发射器 其中发射器类支持从点发射和从直线发射,暂时不支持曲线(编程

Cocos2d-x3.0模版容器具体解释之二:cocos2d::Map&amp;lt;K,V&amp;gt;

1.概述: 版本号: v3.0 beta 语言: C++ 定义在 "COCOS2DX_ROOT/cocos/base" 路径下的 "CCMap.h" 的头文件里. template <class K, class V> class CC_DLL Map; cocos2d::Map<K,V> 是一个内部使用了 std::unordered_map的关联容器模版. std::unordered_map 是一个存储了由key-value键值对组合成

Cocos2D iOS之旅:如何写一个敲地鼠游戏(二):Cocos2D中的高清支持

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 高清显示和Cocos2D 好吧,有一个好消息 - 在最新版本的Cocos2D中包括了高清屏的完整支持,你可以用下面1-2-3步就可简单搞定! 在调用CCDirector的en

Touch Handling in Cocos2D 3.x(二)

接受触摸 在Cocos2d 3.0中每一个CCNode和每一个CCNode的子类都可以接收触摸.你只需要开启一个选项.让我们在定制的初始化器里完成它.替换MainScene.m中init方法的代码: - (id)init { if (self = [super init]) { // activate touches on this scene self.userInteractionEnabled = TRUE; } return self; } 现在Cocos2d 将会知道我们想要在这个场景

【Cocos2d入门教程二】Cocos2d-x基础篇

上一章已经学习了环境的搭建.这一章对基础概念进行掌握.内容大概有: 1.导演 2.场景 3.节点 4.层 4.精灵 1.导演(Director) 导演存在的主要作用: 环境设定(帧率 初始化openGl和渲染器) 场景管理 执行主循环 游戏就是个死循环 不断不断的渲染  就跟视频没两样 一帧一帧的绘制出来  话说提一下一帧为1/60秒  也就是说cocos2d里一秒渲染60次 导演的管理:   计时器  事件管理器  动作管理器 导演继承于REF  一个单例类 获得导演类Director实例语句

Cocos2d JS 之消灭星星(十二) 游戏帮助

前面游戏的各个部分都完善了,游戏共一百关,后面还有使用粒子系统的部分,给游戏添加特效:写得有点粗糙 1 /* 2 * @游戏帮助说明 3 */ 4 var GameHelpLayout = ccui.Layout.extend( 5 { 6 ctor:function() 7 { 8 this._super(); 9 this.zinit(); 10 this.setBackButton(); 11 }, 12 //还回按钮 13 setBackButton:function() 14 { 15