Cocos2d-x游戏引擎开发——粒子系统实现与用户交互的特效

发表于2015-12-15
评论0 526浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏程序行业精英群

711501594

无实战不学习,这次来用粒子系统实现与用户交互的特效。下面是在我的安卓手机上的效果图

 

 

第一张图片实现手指在屏幕上滑动的时候一群粒子跟着手指,第二张图片实现手指在屏幕上点击的时候一个爆炸效果。另外还用粒子系统实现一个太阳和烟。

 

下面看代码:

  1. CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,false);  

这行带码添加触屏事件

 

添加触屏事件的响应函数:

  1. virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);  
  2. virtual void ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);  
  3. virtual void ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);  


先来看看实现太阳和烟的代码:

  1.                 CCSprite* pSprite = CCSprite::create("background.png");  
  2.                 CC_BREAK_IF(! pSprite);  
  3.                 pSprite->setPosition(ccp(400, 240));  
  4. this->addChild(pSprite, 0);  
  5. sun->setTextureWithRect(CCTextureCache::sharedTextureCache()->addImage("fire.png"),CCRectMake(0,0,32,32));    
  6. sun->setPosition(ccp(700,350));  
  7. addChild(sun);  
  8. smoke->setTextureWithRect(CCTextureCache::sharedTextureCache()->addImage("fog.png"),CCRectMake(0,0,32,32));    
  9. smoke->setPosition(ccp(600,150));  
  10. smoke->setLife(1);  
  11. addChild(smoke);  


先添加一个背景,再添加太阳和烟,这里要注意了,太阳和烟一定要是成员函数,否则在Android手机上用户快速滑动屏幕的时候,手机卡的话局部对象会被释放,用了成员变量的话就不会出现这种效果。

 

  1. void HelloWorld::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)  
  2. {  
  3.  CCLog("ccTouchMoved");  
  4.  getLine(pTouch->getLocation());  
  5. }  


在ccTouchMoved方法中,调用getLine函数获得滑动时产生粒子的效果。

getLine函数如下

 

  1. void HelloWorld::getLine(CCPoint pt)  
  2.  {  
  3.   
  4.        
  5.         cocos2d::CCParticleSystemQuad *mSystem=CCParticleSystemQuad::particleWithFile("Particle.plist");  
  6.         //mSystem->initWithFile("Particle.plist");//plist文件可以通过例子编辑器获得  
  7.         mSystem->setTextureWithRect(CCTextureCache::sharedTextureCache()->addImage("Particle.png")  
  8.         ,CCRectMake(0,0,32,32));//加载图片,第一个参数是纹理,第二个参数是选择图片上的位置  
  9.          mSystem->setBlendAdditive(true);//这个调用必不可少  
  10.         mSystem->setPosition(pt);//设置位置  
  11.         mSystem->setDuration(0.3f);  
  12.         mSystem->setLife(0.5f);  
  13.         addChild(mSystem);  
  14.         //mSystem->release();  
  15.         //delete mSystem;  
  16.         //CC_SAFE_DELETE(mSystem);  
  17.         mSystem->setAutoRemoveOnFinish(true);  
  18.  }  


使用粒子编辑器编辑好的Particle.plist文件,产生粒子效果。根据传过来的位置设置粒子的位置。

 

 

对于点击的爆炸效果,先要判断用户是点击。

设置成员变量

  1. float x,y;  


 

  1. bool HelloWorld::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)  
  2.  {  
  3.      x=pTouch->getLocation().x;  
  4.      y=pTouch->getLocation().y;  
  5.      CCLog("ccTouchBegan");  
  6.      return true;  
  7.  }  


在ccTouchBegan函数中赋初值。

在ccTouchEnded函数中判断是否是点击

  1. void HelloWorld::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)  
  2. {  
  3.  if(fabs(pTouch->getLocation().x-x)<20&&fabs(pTouch->getLocation().y-y)<20)  
  4.  {  
  5.      getBoom(pTouch->getLocation());  
  6.  }  
  7.  CCLog("ccTouchEnded");  
  8. }  


这里通过判断开始的点和结束的点的x和y方向是否都小于20来判断是否是点击。这样的话就算是用户点击有微小的偏移也会作为点击,这样处理与实现相符,应为用户点击的确会出现偏移,这时起始点和结束点有微小的距离。

 

在getBoom函数中实现爆炸效果:

  1. void HelloWorld::getBoom(CCPoint pt)  
  2.  {  
  3.           
  4.         cocos2d::CCParticleSystemQuad   *mSystem2 = CCParticleSystemQuad::particleWithFile("Boom.plist");  
  5.         //mSystem2->initWithFile("Boom.plist");//plist文件可以通过例子编辑器获得  
  6.         mSystem2->setTextureWithRect(CCTextureCache::sharedTextureCache()->addImage("fire.png")  
  7.         ,CCRectMake(0,0,32,32));//加载图片,第一个参数是纹理,第二个参数是选择图片上的位置  
  8.          mSystem2->setBlendAdditive(true);//这个调用必不可少  
  9.         mSystem2->setPosition(pt);//设置位置  
  10.         mSystem2->setDuration(0.05f);  
  11.         addChild(mSystem2);  
  12.         //mSystem2->release();  
  13.         //CC_SAFE_DELETE(mSystem2);  
  14.         mSystem2->setAutoRemoveOnFinish(true);  
  15.           
  16.       
  17.  }  


好了,就这样了,最后要注意的是一定要调用setAutoRemoveOnFinish(true);函数释放内存,不然内存泄露。

原文链接

著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

游戏学院公众号二维码
腾讯游戏学院
微信公众号

提供更专业的游戏知识学习平台