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

你可能感兴趣的:(cocos2d-x)