cocos2d-x 之粒子系统交互实现
这次实现的功能与上一篇文章《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

浙公网安备 33010602011771号