除了使用Cocos2d-x的11种内置粒子系统外,我们还可以通过创建ParticleSystemQuad对象,并设置属性实现自定义粒子系统,通过这种方式完全可以实现我们说需要的各种效果的粒子系统。使用ParticleSystemQuad自定义粒子系统至少有两种方式可以实现:代码创建和plist文件创建。

代码创建

所谓代码创建就是完全通过代码方式实现,其中所有的属性全部是通过程序代码设置。这要求开发人员对于这些属性值非常熟悉,而且这种方式无法预览,只能通过程序运行看效果,调整,再运行看效果,再调整,因此比较麻烦。

要想实现如下图所示的下雪粒子系统,我们当然可以通过前面介绍的方式实现,但本节我们先介绍通过自定义粒子系统实现。

代码创建的下雪粒子系统,主要代码如下:

  1. bool HelloWorld::init()
  2. {
  3. if ( !Layer::init() )
  4. {
  5. return false;
  6. }
  7. Size visibleSize = Director::getInstance()->getVisibleSize();
  8. auto bg = Sprite::create("background-1.png");
  9. bg->setPosition(Point(visibleSize.width/2, visibleSize.height /2));
  10. this->addChild(bg);
  11. auto particleSystem = ParticleSystemQuad::createWithTotalParticles(200);    ①
  12. //设置雪花粒子纹理图片
  13. particleSystem->setTexture(TextureCache::getInstance()->addImage("snow.png"));    ②
  14. //设置发射粒子的持续时间-1表示永远持续
  15. particleSystem->setDuration(-1);
  16. //设置粒子的重力方向
  17. particleSystem->setGravity(Point(0,-240));
  18. //设置角度以及偏差
  19. particleSystem->setAngle(90);
  20. particleSystem->setAngleVar(360);
  21. //设置径向加速度以及偏差
  22. particleSystem->setRadialAccel(50);
  23. particleSystem->setRadialAccelVar(0);
  24. //设置粒子的切向加速度以及偏差
  25. particleSystem->setTangentialAccel(30);
  26. particleSystem->setTangentialAccelVar(0);
  27. // 设置粒子初始化位置偏差
  28. particleSystem->setPosVar(Point(400,0));
  29. //设置粒子生命期以及偏差
  30. particleSystem->setLife(4);
  31. particleSystem->setLifeVar(2);
  32. //设置粒子开始时候旋转角度以及偏差
  33. particleSystem->setStartSpin(30);
  34. particleSystem->setStartSpinVar(60);
  35. //设置结束时候的旋转角度以及偏差
  36. particleSystem->setEndSpin(60);
  37. particleSystem->setEndSpinVar(60);
  38. //设置开始时候的颜色以及偏差
  39. particleSystem->setStartColor(Color4F(1,1,1,1));
  40. //设置结束时候的颜色以及偏差
  41. particleSystem->setEndColor(Color4F(1,1,1,1));
  42. //设置开始时候粒子大小以及偏差
  43. particleSystem->setStartSize(30);
  44. particleSystem->setStartSizeVar(0);
  45. //设置粒子结束时候大小以及偏差
  46. particleSystem->setEndSize(20.0f);
  47. particleSystem->setEndSizeVar(0);
  48. //设置每秒钟产生粒子的数量
  49. particleSystem->setEmissionRate(100);
  50. particleSystem->setPosition(Point(visibleSize.width/2, visibleSize.height + 50));
  51. this->addChild(particleSystem);
  52. return true;
  53. }

上述第①行代码ParticleSystemQuad::createWithTotalParticles(200)是创建ParticleSystemQuad对象,静态createWithTotalParticles函数是通过指定初始粒子数来创建粒子对象。

第②行代码是指定粒子的纹理,TextureCache::getInstance()->addImage("snow.png")语句可以通过指定的纹理图片创建纹理对象Texture2D,贴图的纹理图片宽高必须是2的n次幂,大小不要超过64x64像素,在美工设计纹理图片时候,不用关注太多细节,例如:设计雪花纹理图片时候,按照雪花是有6个角的,很多人会设计为图10-7所示的样式,而事实上我们需要的图10-8所示的渐变效果的圆点。

雪花图片

雪花粒子纹理图片

plist文件创建

代码创建方式要维护很多属性,要想手工调整这些属性那是非常困难的事情,我们推荐使用Particle Designer等粒子设计工具进行所见即所得的设计,这些工具一般会生成一个描述粒子的属性类表文件plist,然后通过类似下面的语句加载:

auto particleSystem =ParticleSystemQuad::create("snow.plist");

snow.plist是描述运动的属性文件,plist文件是一种XML文件,参考代码如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3. <plist version="1.0">
  4. <dict>
  5. <key>angle</key>
  6. <real>270</real>
  7. <key>angleVariance</key>
  8. <real>5</real>
  9. <key>blendFuncDestination</key>
  10. <integer>771</integer>
  11. <key>blendFuncSource</key>
  12. <integer>1</integer>
  13. <key>duration</key>
  14. <real>-1</real>
  15. <key>emitterType</key>
  16. <real>0.0</real>
  17. <key>finishColorAlpha</key>
  18. <real>1</real>
  19. <key>finishColorBlue</key>
  20. <real>1</real>
  21. <key>finishColorGreen</key>
  22. <real>1</real>
  23. <key>finishColorRed</key>
  24. <real>1</real>
  25. <key>finishColorVarianceAlpha</key>
  26. <real>0.0</real>
  27. <key>finishColorVarianceBlue</key>
  28. <real>0.0</real>
  29. <key>finishColorVarianceGreen</key>
  30. <real>0.0</real>
  31. <key>finishColorVarianceRed</key>
  32. <real>0.0</real>
  33. <key>finishParticleSize</key>
  34. <real>-1</real>
  35. <key>finishParticleSizeVariance</key>
  36. <real>0.0</real>
  37. <key>gravityx</key>
  38. <real>0.0</real>
  39. <key>gravityy</key>
  40. <real>-10</real>
  41. <key>maxParticles</key>
  42. <real>700</real>
  43. <key>maxRadius</key>
  44. <real>0.0</real>
  45. <key>maxRadiusVariance</key>
  46. <real>0.0</real>
  47. <key>minRadius</key>
  48. <real>0.0</real>
  49. <key>minRadiusVariance</key>
  50. <real>0.0</real>
  51. <key>particleLifespan</key>
  52. <real>3</real>
  53. <key>particleLifespanVariance</key>
  54. <real>1</real>
  55. <key>radialAccelVariance</key>
  56. <real>0.0</real>
  57. <key>radialAcceleration</key>
  58. <real>1</real>
  59. <key>rotatePerSecond</key>
  60. <real>0.0</real>
  61. <key>rotatePerSecondVariance</key>
  62. <real>0.0</real>
  63. <key>rotationEnd</key>
  64. <real>0.0</real>
  65. <key>rotationEndVariance</key>
  66. <real>0.0</real>
  67. <key>rotationStart</key>
  68. <real>0.0</real>
  69. <key>rotationStartVariance</key>
  70. <real>0.0</real>
  71. <key>sourcePositionVariancex</key>
  72. <real>1200</real>
  73. <key>sourcePositionVariancey</key>
  74. <real>0.0</real>
  75. <key>speed</key>
  76. <real>130</real>
  77. <key>speedVariance</key>
  78. <real>30</real>
  79. <key>startColorAlpha</key>
  80. <real>1</real>
  81. <key>startColorBlue</key>
  82. <real>1</real>
  83. <key>startColorGreen</key>
  84. <real>1</real>
  85. <key>startColorRed</key>
  86. <real>1</real>
  87. <key>startColorVarianceAlpha</key>
  88. <real>0.0</real>
  89. <key>startColorVarianceBlue</key>
  90. <real>0.0</real>
  91. <key>startColorVarianceGreen</key>
  92. <real>0.0</real>
  93. <key>startColorVarianceRed</key>
  94. <real>0.0</real>
  95. <key>startParticleSize</key>
  96. <real>10</real>
  97. <key>startParticleSizeVariance</key>
  98. <real>5</real>
  99. <key>tangentialAccelVariance</key>
  100. <real>0.0</real>
  101. <key>tangentialAcceleration</key>
  102. <real>1</real>
  103. <key>textureFileName</key>
  104. <string>snow.png</string>
  105. </dict>
  106. </plist>

在上述的plist文件描述的属性和属性值都是成对出现,其中<key>标签描述的是属性,<real>描述的属性值。plist文件是描述粒子的属性,使用的时候还需要有粒子纹理图片,plist文件中textureFileName属性指定了纹理图片,我们需要将plist文件和纹理图片放置到Resources目录下面。

提示 描述粒子属性的plist文件,可以通过粒子系统设计工具生成,有关粒子系统工具使用大家可以参考我的TODO。

如图所示的下雪实例,使用plist文件创建,主要代码如下:

  1. bool HelloWorld::init()
  2. {
  3. if ( !Layer::init() )
  4. {
  5. return false;
  6. }
  7. Size visibleSize = Director::getInstance()->getVisibleSize();
  8. auto bg = Sprite::create("background-1.png");
  9. bg->setPosition(Point(visibleSize.width/2, visibleSize.height /2));
  10. this->addChild(bg);
  11. auto particleSystem = ParticleSystemQuad::create("snow.plist");
  12. particleSystem->setPosition(Point(visibleSize.width/2, visibleSize.height - 50));
  13. this->addChild(particleSystem);
  14. return true;
  15. }

从代码可见plist文件创建粒子系统要比代码创建简单很多,这主要是因为采用了plist描述粒子属性。

更多内容请关注国内第一本Swift图书《Swift开发指南》
本书交流讨论网站:http://www.51work6.com/swift.php
欢迎加入Swift技术讨论群:362298485

欢迎关注智捷iOS课堂微信公共平台

Cocos2d-x中自定义粒子系统的更多相关文章

  1. Cocos2d-JS自定义粒子系统

    除了使用Cocos2d-JS的11种内置粒子系统外,我们还可以通过创建ParticleSystem对象,并设置属性实现自定义粒子系统,通过这种方式完全可以实现我们说需要的各种效果的粒子系统.使用Par ...

  2. Html中自定义鼠标的形状

    Html中自定义鼠标的形状 <html> <head> <title>自定义的鼠标形状</title> <meta http-equiv=&quo ...

  3. 教你一招:在PowerPoint中自定义可输入文本的占位符

    日常生活中,当我们设计多媒体课件时,默认的版式其实已经够用了.但是,很多时候,我们需要更加个性一点,所以,我们需要自定义很多东西.本文介绍在PowerPoint中自定义可输入文本的占位符. 一.占位符 ...

  4. android代码优化----ListView中自定义adapter的封装(ListView的模板写法)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  5. 在Eclipse中自定义类似syso的快捷代码模板

    sysout/syso syserr/ syse 点击菜单栏的“Window”->“Preferences”,打开“Preferences”对话框.在Preferences”对话框中点击“Jav ...

  6. 在.net桌面程序中自定义鼠标光标

    有的时候,一个自定义的鼠标光标能给你的程序增色不少.本文这里介绍一下如何在.net桌面程序中自定义鼠标光标.由于.net的桌面程序分为WinForm和WPF两种,这里分别介绍一下. WinForm程序 ...

  7. .net中自定义过滤器对Response内容进行处理

    原文:http://www.cnblogs.com/zgqys1980/archive/2008/09/02/1281895.html 代码DEMO:http://files.cnblogs.com/ ...

  8. SharePoint 2013 中自定义WCF服务

    在使用SharePoint2013的时候,如果其他客户端 API 的组合不足,可以通过自定义 Web 服务扩展 SharePoint.默认情况下,SharePoint 2013 不仅支持创建自定义 A ...

  9. 浅析在QtWidget中自定义Model

    Qt 4推出了一组新的item view类,它们使用model/view结构来管理数据与表示层的关系.这种结构带来的功能上的分离给了开发人员更大的弹性来定制数据项的表示,它也提供一个标准的model接 ...

随机推荐

  1. 算法效果AB测试中的PV-UV不对称性

    (转载请注明原创于潘多拉盒子) 算法效果的AB测试,是指在相同的应用场景下,对比不同算法的效果.通常的做法是,按照PV或UV随机分配流量到算法上,计算算法的CTR或转化率进行对比.为了表述简单,我们假 ...

  2. 检查dns服务器是否可用

    #%windir%\system32\WindowsPowerShell\v1.0\powershell.exe D:\PSScript\ERP_Production_Script\ERPRF_Upd ...

  3. Codeforces Beta Round #51 D. Beautiful numbers 数位dp

    D. Beautiful numbers Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/55/p ...

  4. codeforce447 D SGU 548 贪心+优先队列

    codeforce447 D - DZY Loves Modification 题意:有一个n*m的矩阵,每次可以选择一行或者一列,可以得到这行或这列的所有元素sum的积分,然后使这一列/行的每一个元 ...

  5. 有图有真相,分享一款网页版HTML5飞机射击游戏

    本飞机射击游戏是使用HTML5代码写的,尝试通过统一开发环境(UDE)将游戏托管在MM应用引擎,直接生成了网页版游戏,游戏简单易上手,非常适合用来当做小休闲打发时间. 游戏地址:http://flyg ...

  6. GNU C中x++是原子操作吗?

    http://blog.csdn.net/liuaigui/article/details/4141563

  7. 我和ip_conntrack不得不说的一些事

    面对让人无语的ip_conntrack,我有一种说不出的感觉!自从接触它到现在,已经两年多了,其间我受到过它的恩惠,也被它蹂躏过,被它玩过,但是又不忍心舍弃它,因为我找不到更好的替代.工作中,学习中, ...

  8. QNetworkAccessManager的异步与线程

    Qt版本5.1.1 以HTTP操作为例 Qt中的HTTP操作都是异步的. 内部通过线程实现 创建线程的时机在QNetworkReplyHttpImplPrivate::postRequest() vo ...

  9. poj2388解题报告(排序)

    POJ 2388,题目链接http://poj.org/problem?id=2388 题意: 水题一道 给定n个数,输出中间值,可以用sort,干脆快捷. 代码: //396K 32MS #incl ...

  10. ES各种错误解决

    _update API 执行报错 错误信息: { "error": { "root_cause": [ { "type": "re ...