除了使用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. usr/bin/ld: cannot find 错误解决方法

    参考:http://blog.siyebocai.cn/20100324_5p424qs7.html 通常在软件编译时出现的usr/bin/ld: cannot find -lxxx的错误,主要的原因 ...

  2. VC++ 网络编程总结(一)

    1.套接字编程原理         一个完整的网间通信进程需要由两个进程组成,并且只能用同一种高层协议.也就是说,不可能通信的一段用TCP,而另一端用UDP.一个完整的网络信息需要一个五元组来标识:协 ...

  3. jQuery提交Json数据到Webservice,并接收返回的Json数据

    jQuery ajax webservice:get 和 post 一.GET 方式 客户端 复制代码 代码如下: var data = { classCode: "0001"}; ...

  4. RapeLay(电车之狼R)的结局介绍 (隐藏结局攻略)

    RapeLay(电车之狼R)的结局介绍 (隐藏结局) 必备知识要让MM怀孕非常easy.起初刚进入调教模式后.仅仅要H一次 MM就開始有时期状态. 生理(连上有红晕) ->不详状态(闭目第一次) ...

  5. [Javascript] Function scope

    We have code like: var numbers = [1,2,3]; for(var i in numbers){ setTimeout(function(){console.log(n ...

  6. iOS开发——UI篇OC篇&layoutSubviews和drawRect

    layoutSubviews和drawRect     首先两个方法都是异步执行.layoutSubviews方便数据计算,drawRect方便视图重绘.   layoutSubviews在以下情况下 ...

  7. iOS开发——UI篇OC篇&初始化图片方式

    初始化图片方式 一.读取图片 1.从资源(resource)读取 [cpp] view plaincopyprint?   UIImage* image=[UIImage imageNamed:@&q ...

  8. 通过缓存数据库结果提高PHP性能(转)

    众所周知,缓存数据库查询的结果可以显著缩短脚本执行时间,并最大限度地减少数据库服务器上的负载.如果要处理的数据基本上是静态的,则该技术将非常有效.这是因为对远程数据库的许多数据请求最终可以从本地缓存得 ...

  9. Eclipse 环境下安装PhoneGap开发插件

    phoneGap开发跨所有移动平台软件已经成为未来移动终端开发的总趋势,如何在大家所熟悉的Eclipse IDE中快速安装PhoneGap开发插件,介绍如下: 点击help——>install ...

  10. 关于更改apache和mysql的路径的问题..

    1.禁用selinux 系统管理->selinux管理->enforing模式..改为disable..然后重启 2.修改httpd.conf的各个路径 索引后发现指向欢迎页面则注释下面这 ...