anndaming

 

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

posted on 2012-02-17 15:48  anndaming  阅读(778)  评论(0编辑  收藏  举报

导航