Cocos2dx特效 水紋特效1

Cocos2dx特效水紋特效1

DionysosLai 2014-5-15

       判斷一個小遊戲是否能夠很好的吸引人,除了遊戲本身的核心玩法吸引人之外。很多時候,是要靠一些小細節來體現。比方說一個打槍類遊戲,玩家隨便朝四周射擊,子彈打到牆壁上面。玩家的隨意操作,其實都包含着一種期望的心裏。如果遊戲能給出子彈打到牆壁的效果,比方說音效、彈痕等,玩家的心裏得到滿足,自然而然就對遊戲的評價更高一點。如果這時,遊戲能夠在給出角色由於射擊後坐力,導致後退,屏幕搖晃等效果。那麼,遊戲的效果就so perfect 了。

         在很多時候,玩家會隨意觸摸屏幕,這些觸摸大部分是對遊戲操作來說是無效,沒有任何效果。如果我們能夠對玩家的操作給出一些反應,就可以得到很好效果。水紋效果,正是對這中無效操作的一種很好迴應。

         這裏,我們的水紋效果,其實是使用了一系列動畫來實現的,當然可以使用cocos2dx本身自帶效果,這個下次再講。本次,是有動畫特效來實現的。

         使用的資源如下:

 http://download.csdn.net/detail/dionysos_lai/7367545

         然後對這個效果進行了封裝了:

         .h文件如下:

/**
*@file BAWaterEffect.h
*@brie 播放水紋特效
*
*詳細概述
*
*@author DionysosLai,email: [email protected]
*@version 1.0
*@data 2014-5-15 9:40
*/

#ifndef __WATER_EFFECT_H__
#define __WATER_EFFECT_H__

#include "cocos2d.h"  
#include "cocos-ext.h"

class WaterEffect : public cocos2d::CCNode  
{  
public:  
	WaterEffect();  
	~WaterEffect();  

	static WaterEffect* create();  
	virtual bool init();  

private:   
	void initData();  
	cocos2d::extension::CCArmature*	createArmature(const char* armatureName, const char* armatureProName);
	void onPlayEffect( cocos2d::extension::CCArmature *pArmature, cocos2d::extension::MovementEventType eventType, const char *animationID );
private:  
	cocos2d::extension::CCArmature* m_arEffect;
public:
	void playEffect(void);

};  

#endif /* defined(__WATER_EFFECT_H__) */  

         .cpp文件如下:

#include "BAWaterEffect.h"

USING_NS_CC;
using namespace cocos2d::ui;
using namespace cocos2d::extension;

WaterEffect::WaterEffect()
{

}

WaterEffect::~WaterEffect()
{

}

WaterEffect* WaterEffect::create()
{
	WaterEffect *pNode = new WaterEffect();  
	if (pNode && pNode->init())  
	{  
		pNode->autorelease();  
		return pNode;  
	}  
	CC_SAFE_DELETE(pNode);  
	return NULL;  
}

bool WaterEffect::init()
{
	if (!CCNode::init())  
	{  
		return false;  
	}  
	initData();  
	return true;  
}

void WaterEffect::initData()
{
	m_arEffect = this->createArmature("WaterAnimation/WaterAnimation.ExportJson", "WaterAnimation");
	m_arEffect->setPosition(ccp(0.f, 0.f));
	this->addChild(m_arEffect, 0);
}

cocos2d::extension::CCArmature* WaterEffect::createArmature( const char* armatureName, const char* armatureProName )
{
	CCArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo(armatureName);
	CCArmature *armature = CCArmature::create(armatureProName);
	return armature;
}

///@brief 播放水紋效果
///@param[in] 
///@return 
///@author DionysosLai,[email protected] 
///@retval  
///@post 
///@version 1.0 
///@data 2014-5-15 10:22
void WaterEffect::playEffect( void )
{
	m_arEffect->getAnimation()->play("Water_Play");
	m_arEffect->getAnimation()->setMovementEventCallFunc(this, movementEvent_selector(WaterEffect::onPlayEffect));
}

///@brief 檢測水紋效果是否播完
///@param[in] 
///@return 
///@author DionysosLai,[email protected] 
///@retval  
///@post 
///@version 1.0 
///@data 2014-5-15 10:23
void WaterEffect::onPlayEffect( cocos2d::extension::CCArmature *pArmature, cocos2d::extension::MovementEventType eventType, const char *animationID )
{
	/// COMPLETE--只有在動作設置爲不循環播放時纔在動畫結束響應一次
	if (eventType == COMPLETE)
	{
		this->removeAllChildren();
	}
}

使用方式如下:在要使用的文件下定義一個函數:      

voidplayWaterEffect(const cocos2d::CCPoint point);

實現方式如下:

///@brief 播放水紋效果
///@param[in] 
///@return 
///@author DionysosLai,[email protected] 
///@retval  
///@post 
///@version 1.0 
///@data 2014-5-15 10:38
void BATVRemote::playWaterEffect( const cocos2d::CCPoint point )
{
	/// 播放水紋效果
	WaterEffect* waterEffect = WaterEffect::create();
	waterEffect->playEffect();
	waterEffect->setPosition(point);
	this->addChild(waterEffect, ZWATER);
}

最後在要用的地方,直接調用函數playWaterEffect即可。

關注用戶體驗,聚焦精品遊戲。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章