Cocos2d-x中自定義粒子系統

除了使用Cocos2d-x11種內置粒子系統外,咱們還能夠經過建立ParticleSystemQuad對象,並設置屬性實現自定義粒子系統,經過這種方式徹底能夠實現咱們說須要的各類效果的粒子系統。使用ParticleSystemQuad自定義粒子系統至少有兩種方式能夠實現:代碼建立和plist文件建立。

代碼建立

所謂代碼建立就是徹底經過代碼方式實現,其中全部的屬性所有是經過程序代碼設置。這要求開發人員對於這些屬性值很是熟悉,並且這種方式沒法預覽,只能經過程序運行看效果,調整,再運行看效果,再調整,所以比較麻煩。php

要想實現以下圖所示的下雪粒子系統,咱們固然能夠經過前面介紹的方式實現,但本節咱們先介紹經過自定義粒子系統實現。html

 

代碼建立的下雪粒子系統,主要代碼以下:swift

 

[html] view plaincopy微信

 

  1. bool HelloWorld::init()  app

  2. {  函數

  3. if ( !Layer::init() )  工具

  4. {  網站

  5. return false;  this

  6. }  spa

  7.    

  8. Size visibleSize = Director::getInstance()->getVisibleSize();  

  9.    

  10. auto bg = Sprite::create("background-1.png");  

  11.    

  12. bg->setPosition(Point(visibleSize.width/2, visibleSize.height /2));  

  13. this->addChild(bg);  

  14.    

  15. auto particleSystem = ParticleSystemQuad::createWithTotalParticles(200);    ①  

  16.    

  17. //設置雪花粒子紋理圖片  

  18. particleSystem->setTexture(TextureCache::getInstance()->addImage("snow.png"));    ②  

  19. //設置發射粒子的持續時間-1表示永遠持續  

  20. particleSystem->setDuration(-1);  

  21. //設置粒子的重力方向   

  22. particleSystem->setGravity(Point(0,-240));  

  23.    

  24. //設置角度以及誤差  

  25. particleSystem->setAngle(90);   

  26. particleSystem->setAngleVar(360);  

  27.    

  28. //設置徑向加速度以及誤差  

  29. particleSystem->setRadialAccel(50);  

  30. particleSystem->setRadialAccelVar(0);  

  31.    

  32. //設置粒子的切向加速度以及誤差  

  33. particleSystem->setTangentialAccel(30);  

  34. particleSystem->setTangentialAccelVar(0);  

  35.    

  36. // 設置粒子初始化位置誤差  

  37. particleSystem->setPosVar(Point(400,0));  

  38.    

  39. //設置粒子生命期以及誤差  

  40. particleSystem->setLife(4);  

  41. particleSystem->setLifeVar(2);  

  42.    

  43. //設置粒子開始時候旋轉角度以及誤差  

  44. particleSystem->setStartSpin(30);  

  45. particleSystem->setStartSpinVar(60);  

  46.    

  47. //設置結束時候的旋轉角度以及誤差  

  48. particleSystem->setEndSpin(60);  

  49. particleSystem->setEndSpinVar(60);  

  50.    

  51. //設置開始時候的顏色以及誤差  

  52. particleSystem->setStartColor(Color4F(1,1,1,1));  

  53. //設置結束時候的顏色以及誤差  

  54. particleSystem->setEndColor(Color4F(1,1,1,1));  

  55.    

  56. //設置開始時候粒子大小以及誤差  

  57. particleSystem->setStartSize(30);  

  58. particleSystem->setStartSizeVar(0);  

  59.    

  60. //設置粒子結束時候大小以及誤差  

  61. particleSystem->setEndSize(20.0f);  

  62. particleSystem->setEndSizeVar(0);  

  63.    

  64. //設置每秒鐘產生粒子的數量  

  65. particleSystem->setEmissionRate(100);  

  66.    

  67. particleSystem->setPosition(Point(visibleSize.width/2, visibleSize.height + 50));  

  68.    

  69. this->addChild(particleSystem);  

  70.    

  71.     return true;  

  72. }  

 

 

上述第①行代碼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文件,參考代碼以下:

 

[html] view plaincopy

 

  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文件建立,主要代碼以下:

 

[html] view plaincopy

 

  1. bool HelloWorld::init()  

  2. {  

  3. if ( !Layer::init() )  

  4. {  

  5. return false;  

  6. }  

  7.    

  8. Size visibleSize = Director::getInstance()->getVisibleSize();  

  9.    

  10. auto bg = Sprite::create("background-1.png");  

  11. bg->setPosition(Point(visibleSize.width/2, visibleSize.height /2));  

  12. this->addChild(bg);  

  13.    

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

  15.     particleSystem->setPosition(Point(visibleSize.width/2, visibleSize.height - 50));  

  16. this->addChild(particleSystem);  

  17. return true;  

  18. }  

 

 

從代碼可見plist文件建立粒子系統要比代碼建立簡單不少,這主要是由於採用了plist描述粒子屬性。

 

 

 

 

更多內容請關注國內第一本Swift圖書《Swift開發指南》

本書交流討論網站:http://www.51work6.com/swift.php

歡迎加入Swift技術討論羣:362298485

 

 

 

 

 

 

歡迎關注智捷iOS課堂微信公共平臺

相關文章
相關標籤/搜索