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即可。
關注用戶體驗,聚焦精品遊戲。