1. 程式人生 > >Cocos2d-x內建粒子系統

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檔案,它的程式碼如下:

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__
 
#include "cocos2d.h"
#include "MyActionScene.h"
 
typedef enum	①
{
     kExplosion = 1
    ,kFire
    ,kFireworks
    ,kFlower
    ,kGalaxy
    ,kMeteor
    ,kRain
    ,kSmoke
    ,kSnow
    ,kSpiral
    ,kSun    
} ActionTypes; 	②
 
 
class HelloWorld : public cocos2d::Layer
{
public:
    static cocos2d::Scene* createScene();
    virtual bool init();  
    void OnClickMenu(cocos2d::Ref* pSender);
    
    CREATE_FUNC(HelloWorld);
};
 
#endif // __HELLOWORLD_SCENE_H__

上述程式碼第①~②是定義個列舉型別ActionTypes,列舉型別ActionTypes中定義了11個常量,這11個常量對應11個選單項。

下面我們再看看下一個場景MyActionScene,它的MyActionScene.h程式碼如下:

#ifndef __MYACTION_SCENE_H__
#define __MYACTION_SCENE_H__
 
#include "cocos2d.h"
#include "HelloWorldScene.h"
 
class MyAction : public cocos2d::Layer
{
cocos2d::LabelBMFont* pLabel;	①
 
public:
static cocos2d::Scene* createScene();
    virtual bool init();
virtual void onEnterTransitionDidFinish();	②
    
    CREATE_FUNC(MyAction); 
    void backMenu (cocos2d::Ref* pSender);	③
};
 
#endif // __MYACTION_SCENE_H__

在標頭檔案中第①行程式碼定義了LabelBMFont成員變數,用來在場景中顯示粒子系統的名稱。第②行程式碼聲明瞭onEnterTransitionDidFinish回撥函式,該函式是重寫父類函式,它將在場景出現後回掉。第③行程式碼是聲明瞭一個返回選單點選的回撥函式。

MyActionScene的實現程式碼MyActionScene.ccp檔案,它的主要程式碼如下:

bool MyAction::init()
{
    if ( !Layer::init() )
    {
        return false;
    }
    
    Size visibleSize = Director::getInstance()->getVisibleSize();
 
auto pItmLabel = Label::createWithBMFont("fonts/fnt8.fnt", "<Back");
    auto backMenuItem = MenuItemLabel::create(pItmLabel,  
CC_CALLBACK_1(MyAction::backMenu, this));
backMenuItem->setPosition(Point(visibleSize.width - 100, 100));
 
Menu* mn = Menu::create(backMenuItem,  NULL);
mn->setPosition(Point::ZERO);
this->addChild(mn);
 
pLabel =  Label::createWithBMFont("fonts/fnt8.fnt", "");
pLabel->setPosition(Point(visibleSize.width / 2, visibleSize.height - 50));
this->addChild(pLabel, 3);
 
    return true;
}
 
void MyAction::onEnterTransitionDidFinish()
{   
Layer::onEnterTransitionDidFinish();
 
ParticleSystem* system;
    
    switch (this->getTag()) {	①
case kExplosion:
            system = ParticleExplosion::create();
            pLabel->setString("Explosion ");
break;
case kFire:
            system = ParticleFire::create();
            pLabel->setString("Fire");
break;
case kFireworks:
            system = ParticleFireworks::create();
            pLabel->setString("Fireworks");
break;
case kFlower:
            system = ParticleFlower::create();
            pLabel->setString("Flower");
break;
case kGalaxy:
            system = ParticleGalaxy::create();
            pLabel->setString("Galaxy");
            break;
case kMeteor:
            system = ParticleMeteor::create();
            pLabel->setString("Meteor");
break;
case kRain:
            system = ParticleRain::create();
            pLabel->setString("Rain");
break;
case kSmoke:
            system = ParticleSmoke::create();
            pLabel->setString("Smoke");
break;
        case kSnow:
            system = ParticleSnow::create();
            pLabel->setString("Snow");
break;
case kSpiral:
            system = ParticleSpiral::create();
            pLabel->setString("Spiral");
break;
case kSun:
            system = ParticleSun::create();	②
            pLabel->setString("Sun");
break;
    }
 
    	Size visibleSize = Director::getInstance()->getVisibleSize();
system->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2));
 
    this->addChild(system);
}

我們在MyAction::init()函式中初始化場景,在MyAction::onEnterTransitionDidFinish ()函式中建立粒子系統物件,而不是在MyAction::onEnter()函式建立,這是因為MyAction::onEnter()函式呼叫時候,場景還沒有顯示,如果在該函式中建立爆炸等顯示一次的粒子系統,等到場景顯示的時候,爆炸已經結束了,我們會看不到效果。

程式碼第①~②行建立了11種粒子系統,這裡建立粒子系統時候都採用了它們的預設屬性值。其中他pLabel->setString("xxx")函式是為場景中標籤設定內容,這樣在進入場景後可以看到粒子系統的名稱。