• Cocos2d-x内置粒子系统


    从类图中我们可以看到,Cocos2d-x中有内置的11粒子,这些粒子的属性都是预先定义好的,我们也可以在程序代码中单独修改某些属性,我们在上一节的实例中都已经实现了这些属性的设置。

    内置粒子系统

    内置的11粒子系统说明如下: 

    ParticleExplosion。爆炸粒子效果,属于半径模式。

    ParticleFire。火焰粒子效果,属于重力径模式。

    ParticleFireworks。烟花粒子效果,属于重力模式。

    ParticleFlower。花粒子效果,属于重力模式。

    ParticleGalaxy。星系粒子效果,属于半径模式。

    ParticleMeteor。流星粒子效果,属于重力模式。

    ParticleSpiral。漩涡粒子效果,属于半径模式。

    ParticleSnow。雪粒子效果,属于重力模式。

    ParticleSmoke。烟粒子效果,属于重力模式。

    ParticleSun。太阳粒子效果,属于重力模式。

    ParticleRain。雨粒子效果,属于重力模式。

    这11种粒子系统每一个都有如下两个create函数,通过create函数可以创建粒子对象。

    static ParticleExplosion * create () 

    static ParticleExplosion * createWithTotalParticles (int numberOfParticles)

    其中createWithTotalParticles 函数中的numberOfParticles是粒子的初始化个数。

    还有这11种粒子的属性,根据它的发射模式不同也会有所不同。

    实例:内置粒子系统

    下面我们通过一个实例演示一下这11种内置粒子系统。这个实例如图所示,左图是一个操作菜单场景,选择菜单可以进入到上图动作场景,在下图动作场景中演示选择的粒子系统效果,点击右下角返回按钮可以返回到菜单场景。

     

    下面我们再看看具体的程序代码,首先看一下看HelloWorldScene.h文件,它的代码如下:

    [html] view plaincopy
     
    1. #ifndef __HELLOWORLD_SCENE_H__  
    2. #define __HELLOWORLD_SCENE_H__  
    3.    
    4. #include "cocos2d.h"  
    5. #include "MyActionScene.h"  
    6.    
    7. typedef enum    ①  
    8. {  
    9.      kExplosion = 1  
    10.     ,kFire  
    11.     ,kFireworks  
    12.     ,kFlower  
    13.     ,kGalaxy  
    14.     ,kMeteor  
    15.     ,kRain  
    16.     ,kSmoke  
    17.     ,kSnow  
    18.     ,kSpiral  
    19.     ,kSun      
    20. } ActionTypes;  ②  
    21.    
    22.    
    23. class HelloWorld : public cocos2d::Layer  
    24. {  
    25. public:  
    26.     static cocos2d::Scene* createScene();  
    27.     virtual bool init();    
    28.     void OnClickMenu(cocos2d::Ref* pSender);  
    29.       
    30.     CREATE_FUNC(HelloWorld);  
    31. };  
    32.    
    33. #endif // __HELLOWORLD_SCENE_H__  

    上述代码第①~②是定义个枚举类型ActionTypes,枚举类型ActionTypes中定义了11个常量,这11个常量对应11个菜单项。

    下面我们再看看下一个场景MyActionScene,它的MyActionScene.h代码如下:

    [html] view plaincopy
     
    1. #ifndef __MYACTION_SCENE_H__  
    2. #define __MYACTION_SCENE_H__  
    3.    
    4. #include "cocos2d.h"  
    5. #include "HelloWorldScene.h"  
    6.    
    7. class MyAction : public cocos2d::Layer  
    8. {  
    9. cocos2d::LabelBMFont* pLabel;   ①  
    10.    
    11. public:  
    12. static cocos2d::Scene* createScene();  
    13.     virtual bool init();  
    14. virtual void onEnterTransitionDidFinish();  ②  
    15.       
    16.     CREATE_FUNC(MyAction);   
    17.     void backMenu (cocos2d::Ref* pSender);  ③  
    18. };  
    19.    
    20. #endif // __MYACTION_SCENE_H__  

    在头文件中第①行代码定义了LabelBMFont成员变量,用来在场景中显示粒子系统的名称。第②行代码声明了onEnterTransitionDidFinish回调函数,该函数是重写父类函数,它将在场景出现后回掉。第③行代码是声明了一个返回菜单点击的回调函数。

    MyActionScene的实现代码MyActionScene.ccp文件,它的主要代码如下:

    [html] view plaincopy
     
    1. bool MyAction::init()  
    2. {  
    3.     if ( !Layer::init() )  
    4.     {  
    5.         return false;  
    6.     }  
    7.       
    8.     Size visibleSize = Director::getInstance()->getVisibleSize();  
    9.    
    10. auto pItmLabel = Label::createWithBMFont("fonts/fnt8.fnt", "<Back");  
    11.     auto backMenuItem = MenuItemLabel::create(pItmLabel,    
    12. CC_CALLBACK_1(MyAction::backMenu, this));  
    13. backMenuItem->setPosition(Point(visibleSize.width - 100, 100));  
    14.    
    15. Menu* mn = Menu::create(backMenuItem,  NULL);  
    16. mn->setPosition(Point::ZERO);  
    17. this->addChild(mn);  
    18.    
    19. pLabel =  Label::createWithBMFont("fonts/fnt8.fnt", "");  
    20. pLabel->setPosition(Point(visibleSize.width / 2, visibleSize.height - 50));  
    21. this->addChild(pLabel, 3);  
    22.    
    23.     return true;  
    24. }  
    25.    
    26. void MyAction::onEnterTransitionDidFinish()  
    27. {     
    28. Layer::onEnterTransitionDidFinish();  
    29.    
    30. ParticleSystem* system;  
    31.       
    32.     switch (this->getTag()) {    ①  
    33. case kExplosion:  
    34.             system = ParticleExplosion::create();  
    35.             pLabel->setString("Explosion ");  
    36. break;  
    37. case kFire:  
    38.             system = ParticleFire::create();  
    39.             pLabel->setString("Fire");  
    40. break;  
    41. case kFireworks:  
    42.             system = ParticleFireworks::create();  
    43.             pLabel->setString("Fireworks");  
    44. break;  
    45. case kFlower:  
    46.             system = ParticleFlower::create();  
    47.             pLabel->setString("Flower");  
    48. break;  
    49. case kGalaxy:  
    50.             system = ParticleGalaxy::create();  
    51.             pLabel->setString("Galaxy");  
    52.             break;  
    53. case kMeteor:  
    54.             system = ParticleMeteor::create();  
    55.             pLabel->setString("Meteor");  
    56. break;  
    57. case kRain:  
    58.             system = ParticleRain::create();  
    59.             pLabel->setString("Rain");  
    60. break;  
    61. case kSmoke:  
    62.             system = ParticleSmoke::create();  
    63.             pLabel->setString("Smoke");  
    64. break;  
    65.         case kSnow:  
    66.             system = ParticleSnow::create();  
    67.             pLabel->setString("Snow");  
    68. break;  
    69. case kSpiral:  
    70.             system = ParticleSpiral::create();  
    71.             pLabel->setString("Spiral");  
    72. break;  
    73. case kSun:  
    74.             system = ParticleSun::create(); ②  
    75.             pLabel->setString("Sun");  
    76. break;  
    77.     }  
    78.    
    79.         Size visibleSize = Director::getInstance()->getVisibleSize();  
    80. system->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2));  
    81.    
    82.     this->addChild(system);  
    83. }  

    我们在MyAction::init()函数中初始化场景,在MyAction::onEnterTransitionDidFinish ()函数中创建粒子系统对象,而不是在MyAction::onEnter()函数创建,这是因为MyAction::onEnter()函数调用时候,场景还没有显示,如果在该函数中创建爆炸等显示一次的粒子系统,等到场景显示的时候,爆炸已经结束了,我们会看不到效果。

    代码第①~②行创建了11种粒子系统,这里创建粒子系统时候都采用了它们的默认属性值。其中他pLabel->setString("xxx")函数是为场景中标签设置内容,这样在进入场景后可以看到粒子系统的名称。

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

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

  • 相关阅读:
    gorm 创建数据时字段跟结构体不一致
    查看端口信息
    Mysql 新建用户 并指定能访问的数据库权限
    网页端实现快速播放(有些网页不让快进.....的解决办法)
    Mybatis Map保存到数据库,Mybatis Map动态同步表,Mybatis Map Foreach插入数据库
    Java 获取Exception详细信息,Java获取异常详细内容
    weblogic禁用IIOP协议,weblogic CVE-2020-2551漏洞修复
    IntelliJ IDEA安装配置,IntelliJ IDEA配置Maven,IntelliJ IDEA设置热部署
    Java URL链接动态添加参数,Java URL链接删除参数,UrlUtils链接参数工具类
    Oracle weblogic隐藏console,weblogic修改控制台console入口
  • 原文地址:https://www.cnblogs.com/iOS-Blog/p/3970668.html
Copyright © 2020-2023  润新知