【Cocos2d-x游戏引擎开发笔记(12)】粒子系统实现与用户交互的特效

原创文章,转载请注明出处:http://blog.csdn.net/zhy_cheng/article/details/8294125

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

 

 

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

 

下面看代码:

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

这行带码添加触屏事件

 

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

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


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

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


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

 

 void HelloWorld::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
 {
	 CCLog("ccTouchMoved");
	 getLine(pTouch->getLocation());
 }


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

getLine函数如下

 

void HelloWorld::getLine(CCPoint pt)
 {

	 
		cocos2d::CCParticleSystemQuad *mSystem=CCParticleSystemQuad::particleWithFile("Particle.plist");
		//mSystem->initWithFile("Particle.plist");//plist文件可以通过例子编辑器获得
		mSystem->setTextureWithRect(CCTextureCache::sharedTextureCache()->addImage("Particle.png")
        ,CCRectMake(0,0,32,32));//加载图片,第一个参数是纹理,第二个参数是选择图片上的位置
		 mSystem->setBlendAdditive(true);//这个调用必不可少
		mSystem->setPosition(pt);//设置位置
		mSystem->setDuration(0.3f);
		mSystem->setLife(0.5f);
		addChild(mSystem);
		//mSystem->release();
		//delete mSystem;
		//CC_SAFE_DELETE(mSystem);
		mSystem->setAutoRemoveOnFinish(true);
 }


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

 

 

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

设置成员变量

float x,y;


 

bool HelloWorld::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
 {
	 x=pTouch->getLocation().x;
	 y=pTouch->getLocation().y;
	 CCLog("ccTouchBegan");
	 return true;
 }


在ccTouchBegan函数中赋初值。

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

 void HelloWorld::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
 {
	 if(fabs(pTouch->getLocation().x-x)<20&&fabs(pTouch->getLocation().y-y)<20)
	 {
		 getBoom(pTouch->getLocation());
	 }
	 CCLog("ccTouchEnded");
 }


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

 

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

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


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

 

最后附上源代码:点击下载

 

 

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值