您的位置:首页 > 移动开发 > Cocos引擎

利用cocos2dx 3.2开发消灭星星(三)常用的飘字效果

2014-09-08 19:30 483 查看
游戏中经常需要用到一串字体从右到左的飘入,用于显示关卡等信息。在这里我创建了一个继承Node的一个类:FloatWord,大家也可以自己建一个自己觉得好用的飘字效果类。

头文件FloatWord.h

class FloatWord : public Node{
public:
static FloatWord* create(const std::string& word,const int fontSize,Point begin);
bool init(const std::string& word,const int fontSize,Point begin);
void floatIn(const float delay,std::function<void()> callback);
void floatOut(const float delay,std::function<void()> callback);
void floatInOut(const float speed,const float delay,std::function<void()> callback);

private:
int _fontSize;
Point _begin;
Label* _label;
};


1)create 和 init 是连在一起的,调用create的时候必然会调用init

FloatWord* FloatWord::create(const std::string& word,const int fontSize,Point begin){
FloatWord* ret = new FloatWord();
if(ret && ret->init(word,fontSize,begin)){
ret->autorelease();
return ret;
}
CC_SAFE_DELETE(ret);
return nullptr;
}

bool FloatWord::init(const std::string& word,const int fontSize,Point begin){
if(!Node::init()){
return false;
}
_begin = begin;
Size visibleSize = Director::getInstance()->getVisibleSize();

_label = Label::create(word,"Verdana-Bold",fontSize);
_label->setPosition(begin);
this->addChild(_label);

return true;
}


init方法接受3个参数,分别是飘入的字符串,字体大小,从哪里开始飘入

init方法的作用主要是初始化FloatWord内置的Label

2)FloatWord的飘入

void FloatWord::floatIn(const float delay,std::function<void()> callback){
Size visibleSize = Director::getInstance()->getVisibleSize();
MoveTo* move = MoveTo::create(delay,Point(visibleSize.width/2,_begin.y));
CallFunc* call = CallFunc::create(callback);
Sequence* action = Sequence::create(move,call,NULL);
_label->runAction(action);
}


floatIn函数接受两个参数,第一个参数是飘入经过的时间,第二个参数飘入后调用的函数

这里用到了C++11的function,如果不了解得话可以先去看看

这个floatIn函数也很简单,就是让内置_label执行以下MoveTo动作并且执行回调函数

3)FloatWord的飘出

void FloatWord::floatOut(const float delay,std::function<void()> callback){
Size visibleSize = Director::getInstance()->getVisibleSize();
MoveTo* move = MoveTo::create(delay,Point(0,_begin.y));
CallFunc* call = CallFunc::create(callback);
CallFunc* removeC = CallFunc::create([this](){
this->removeFromParentAndCleanup(true);
});
Sequence* action = Sequence::create(move,call,removeC,NULL);
_label->runAction(action);
}
floatOut函数和floatIn相对应,但是这里的除了执行通过函数传递的回调函数外,还会调用一个有Lambda表达式构造的匿名函数,用于销毁FloatWord对象

这里也用到了C++11的lambda表达式,如果不了解的话可以先去看看

总的来说,floatOut的作用就是,执行飘出动作,调用传入的回调函数,执行销毁

4)FloatInOut

void FloatWord::floatInOut(const float speed,const float delayTime,std::function<void()> callback){
Size visibleSize = Director::getInstance()->getVisibleSize();
MoveTo* moveIn = MoveTo::create(speed,Point(visibleSize.width/2,_begin.y));
MoveTo* moveOut = MoveTo::create(speed,Point(0,_begin.y));
CallFunc* removeC = CallFunc::create([this](){
this->removeFromParentAndCleanup(true);
});
Sequence* action = Sequence::create(moveIn,DelayTime::create(delayTime),moveOut,removeC,CallFunc::create(callback),NULL);
_label->runAction(action);
}


有时候,我们在字体飘入后可能不需要执行回调函数,只是短暂地停留后就直接飘走了,所以我们多定义了一个floatInOut函数

其实和上面的floatIn和floatOut差不多,就是参数有点变化。

参数一是飘入飘出的速度,参数二是飘入后停留的时间,参数三是飘走后的回调函数

至此,我们的FloatWord类已经创建完成。接下来就可以开始我们主游戏界面了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐