[置頂] Cocos2d-x扣血飄字特效用完你就消失--之游戲開發《趙云要格斗》(8)
來源:程序員人生 發布時間:2015-01-23 09:09:56 閱讀次數:4125次
這里是Evankaka的博客,歡迎大家前面討論與交換~~~~~~
轉載請注明出處http://blog.csdn.net/evankaka/article/details/42740575
本文這里將要實現的1個功能是怪物受傷血量減少時,會出現1個扣了多少血量的數字從怪物中間飄到頭頂,然后消失。然后有兩種方式,1種是每次都扣一樣的數字,1種是每次在1定范圍內的數字隨機,本文上接博主的文章http://blog.csdn.net/evankaka/article/details/42689689。
cocos2d-x版本:2.2.5
工程環境:windows7+VS2010
打開方式:將工程放在cocos2d-x安裝目錄下的project文件夾下用VS打開
效果:

目錄
1、自定扣血飄字殊效類FlyWord
2、使用方法
3、思路總結
1、自定扣血飄字殊效類FlyWord
其實這里這里就是1個CCLabelTTF的類型來履行動畫CCMoveBy的1個進程
下面來看看我自己定義,頭文件FlyWord.h
#ifndef __FLYWORD_H__
#define __FLYWORD_H__
#include "cocos2d.h"
#include "cocos-ext.h"
USING_NS_CC;
USING_NS_CC_EXT;
class FlyWord: public CCNode{
public:
//創建文字飛舞,create 和 init 是連在1起的,調用create的時候必定會調用init
static FlyWord* create(const char *word,const int fontSize,CCPoint begin);
//init方法接受3個參數,分別是飄入的字符串,字體大小,從哪里開始飄入,init方法的作用主要是初始化FloatWord內置的Label
bool init(const char *word,const int fontSize,CCPoint begin);
//文字從下到上飛舞
void Flying();
//文字飛舞后刪除所有對象
void Flyend();
private:
int _fontSize;//字體大小
CCPoint _begin;//要添加到的怪物的中心點
CCLabelTTF* m_plabel;//字體類型
};
#endif // __FLYWORD_H__
然后是實現類FlyWord.cpp
#include "FlyWord.h"
FlyWord* FlyWord::create(const char *word,const int fontSize,CCPoint begin){
FlyWord* ret = new FlyWord();
//這樣寫更安全1些
if(ret && ret->init(word,fontSize,begin)){
ret->autorelease();
return ret;
}
CC_SAFE_DELETE(ret);//安全刪除
return nullptr;
}
bool FlyWord::init(const char *word,const int fontSize,CCPoint begin){
if(!CCNode::init()){
return false;
}
//初始化
_begin = begin;
m_plabel = CCLabelTTF::create(word,"Marker Felt",fontSize);
//設置色彩
ccColor3B RGB;
RGB.r=255;
RGB.g=0;
RGB.b=0;
m_plabel->setColor(RGB);
this->addChild(m_plabel);
this->setPosition(ccp(begin.x,begin.y));
//初始化完成后就開始飄字了
Flying();
return true;
}
//文字從下到上飛舞
void FlyWord::Flying()
{
CCMoveBy* moveact=CCMoveBy::create(0.5f,CCPointMake(0,70));//0.5秒向上移動70
//創建回調動作,文字飛舞完后
CCCallFunc* callFunc=CCCallFunc::create(this,callfunc_selector(FlyWord::Flyend));
//創建連續動作
CCActionInterval* act=CCSequence::create(moveact,callFunc,NULL);
//setVisible(true);
this->runAction(act);
}
void FlyWord::Flyend()
{
//完成以后把該對象從內存中刪除掉
this->removeAllChildrenWithCleanup(true);
this->removeFromParentAndCleanup(true);
}
代碼里都有非常詳細的說明,這里我就不再說明了
2、使用方法
在Monster.h或Monster.cpp中添加頭文件#include "FlyWord.h"
下面是每次隨機產生10⑶0的1個要減少的血量,這也是游戲中比較常見的,怪物每次的受傷量可能不1樣。
//受傷動畫結束
void Monster::HurtEnd()
{
IsHurt=false;
//產生10⑶01個隨機掉血的量
srand((UINT)GetCurrentTime());
int x = rand()%30+10;
//轉成字符
char szName[100] = {0};
sprintf(szName,"-%d",x);
//怪物掉血
Monster_xue->setCurrentProgress(Monster_xue->getCurrentProgress()-x);
//扣血飄字
FlyWord *wen_zi=FlyWord::create(szName,30,CCPointMake(0,0));//放在當前怪物的(0,0)位置,這里的(0,0)是它的中心,具體可以看看錨點
this->addChild(wen_zi,2);
if(Monster_xue->getCurrentProgress()==0)
{
//播放怪物死亡動畫
DeadAnimation("monster_dead",2,MonsterDirecton);
}
}
如果,想讓怪物每次受傷量都1樣,很簡單,代碼為
//受傷動畫結束
void Monster::HurtEnd()
{
IsHurt=false;
////產生10⑶01個隨機掉血的量
//srand((UINT)GetCurrentTime());
//int x = rand()%30+10;
//轉成字符
char szName[100] = {0};
sprintf(szName,"-%d",10);
//怪物掉血
Monster_xue->setCurrentProgress(Monster_xue->getCurrentProgress()⑴0);
//扣血飄字
FlyWord *wen_zi=FlyWord::create(szName,30,CCPointMake(0,0));//放在當前怪物的(0,0)位置,這里的(0,0)是它的中心,具體可以看看錨點
this->addChild(wen_zi,2);
if(Monster_xue->getCurrentProgress()==0)
{
//播放怪物死亡動畫
DeadAnimation("monster_dead",2,MonsterDirecton);
}
}
1.10⑶0隨機掉血。文字從下到上

2.固定掉血,
文字從下到上

3、思路總結
主要是這個文字類的設計,這里我的思路的得到英雄的位置,然后CCLabelTTF對像就從英雄的中間位置開始向上移動,履行動畫CCMoveBy的1個進程移動寫成后它就自己釋放了(removeAllChildrenWithCleanup(true)和removeFromParentAndCleanup(true);)。用完1次就扔了,然后等到怪物掉血了,再用,用完再扔,多方便~游戲開發進程中有時思路真的很重要啊!
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈