这次实现的功能与上一篇文章《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