您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x 之粒子系统交互实现

2012-02-17 15:48 375 查看
这次实现的功能与上一篇文章《cocos2d-x 之虚拟摇杆实现》方法一致,只是交互的效果不同而已,此处主要介绍的是粒子系统的使用,目标是让粒子随着触摸点移动并变化。

同样,先生成一个继承于CCLayer的类,此片命名为MyTrack

MyTrack.h

#pragma once

#include "cocos2d.h"

using namespace cocos2d;

class MyTrack :
public CCLayer
{
public:
MyTrack(void);
MyTrack(const char* fileName);
~MyTrack(void);
public:
bool active;			// 是否粒子系统被激活
float emissionRate;		// 标识每秒钟产生粒子数
CCParticleSystem *meteor;

//************************************
// Method:    Active
// FullName:  MyTrack::Active
// Access:    public
// Returns:   void
// Qualifier: 设置粒子系统可用
//************************************
void Active();
//************************************
// Method:    Inactive
// FullName:  MyTrack::Inactive
// Access:    public
// Returns:   void
// Qualifier: 设置粒子系统不可用
//************************************
void Inactive();

//************************************
// Method:    initParticleWithFile
// FullName:  MyTrack::initParticleWithFile
// Access:    public
// Returns:   void
// Qualifier: 根据plist文件初始化粒子系统
// Parameter: const char * fileName
//************************************
void initParticleWithFile(const char* fileName);

//************************************
// Method:    init
// FullName:  MyTrack::init
// Access:    public
// Returns:   void
// Qualifier: 初始化函数
//************************************
void myInit();

// 以下是复写Touch响应函数
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);

LAYER_NODE_FUNC(MyTrack);
};


MyTrack.cpp

#include "MyTrack.h"

MyTrack::MyTrack(void)
{
myInit();
}

MyTrack::MyTrack(const char* fileName)
{
myInit();
initParticleWithFile(fileName);
}

MyTrack::~MyTrack(void)
{
}

void MyTrack::myInit()
{
active = false;
emissionRate = 0;
}

void MyTrack::initParticleWithFile(const char* fileName)
{
meteor = CCParticleSystemQuad::particleWithFile(fileName);
emissionRate = meteor->getEmissionRate();		// 记录每秒生成粒子数,用于触摸交互时设定相关参数

meteor->setEmissionRate(0);
}

void MyTrack::Active()
{
if(!active)
{
active = true;
CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 0, false);	// 添加触摸委托
this->addChild(meteor);
}
}

void MyTrack::Inactive()
{
if(active)
{
active = false;
CCTouchDispatcher::sharedDispatcher()->removeDelegate(this);	// 删除委托
this->removeChild(meteor, false);
}
}

bool MyTrack::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
CCPoint touchPoint = pTouch->locationInView(pTouch->view());
touchPoint = CCDirector::sharedDirector()->convertToGL(touchPoint);

meteor->setPosition(touchPoint);		// 随触摸点定位
meteor->setEmissionRate(emissionRate);	// 开始生成粒子

return true;			// 这里返回为true,是为了让Moved与Ended能有响应。若返回为false,则Moved与Ended不会起作用
}

void MyTrack::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
{
CCPoint touchPoint = pTouch->locationInView(pTouch->view());
touchPoint = CCDirector::sharedDirector()->convertToGL(touchPoint);

meteor->setPosition(touchPoint);		// 随触摸点定位
}

void MyTrack::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
meteor->setEmissionRate(0);	// 当触摸释放时,不在生成粒子,故设置每秒产生粒子数为0
}

最后在HelloWorldScence.cpp的init函数中加上以下代码即可:

myTrack = new MyTrack("meteor.plist");
myTrack->Active();
this->addChild(myTrack);


效果图:





相关资源文件 下载~!!

把下载到的资源文件后缀名改成zip,解压即可。。。我的服务器不支持rar与zip的外链~~~T_T
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: