基本動做和組合動做實現了針對精靈的各類運動和動畫效果的改變。但這樣的改變速度勻速的、線性的。經過ActionEase及其的派生類和Speed 類咱們能夠使精靈以非勻速或非線性速度運動,這樣看起了效果更加逼真。php
ActionEase的類圖以下圖所示。html
下面咱們經過一個實例介紹一下這些動做中速度的控制的使用,這個實例以下圖所示,上圖是一個操做菜單場景,選擇菜單能夠進入到下圖動做場景,在下圖動做場景中點擊Go按鈕能夠執行咱們選擇的動做效果,點擊Back按鈕能夠返回到菜單場景。ide
下面咱們再看看具體的程序代碼,首先看一下看HelloWorldScene.h文件,它的代碼以下:動畫
[html] view plaincopy
網站
#ifndef __HELLOWORLD_SCENE_H__ this
#define __HELLOWORLD_SCENE_H__ spa
#include "cocos2d.h" .net
#include "MyActionScene.h" orm
typedef enum ① htm
{
kEaseIn = 1
,kEaseOut
,kEaseInOut
,kEaseSineIn
,kEaseSineOut
,kEaseSineInOut
,kEaseExponentialIn
,kEaseExponentialOut
,kEaseExponentialInOut
,kSpeed
} ActionTypes; ②
class HelloWorld : public cocos2d:ayer
{
public:
static cocos2d::Scene* createScene();
virtual bool init();
void OnClickMenu(cocos2d::Ref* pSender);
CREATE_FUNC(HelloWorld);
};
#endif // __HELLOWORLD_SCENE_H__
上述代碼第①~②是定義個枚舉類型ActionTypes,枚舉類型ActionTypes中定義了10個常量,這10個常量對應10個菜單項。
HelloWorldScene的實現代碼HelloWorldScene.ccp文件,它的主要代碼以下:
[html] view plaincopy
bool HelloWorld::init()
{
if( !Layer::init() )
{
returnfalse;
}
SizevisibleSize = Director::getInstance()->getVisibleSize();
Pointorigin = Director::getInstance()->getVisibleOrigin();
autobg = Sprite::create("background.png");
bg->setPosition(Point(visibleSize.width/2,visibleSize.height /2));
this->addChild(bg);
autopItmLabel1 = Label::createWithBMFont("fonts/fnt2.fnt","EaseIn");
autopItmMenu1 = MenuItemLabel::create(pItmLabel1,
CC_CALLBACK_1(HelloWorld::OnClickMenu, this));
pItmMenu1->setTag(kEaseIn);
autopItmLabel2 = Label::createWithBMFont("fonts/fnt2.fnt","EaseOut");
autopItmMenu2 = MenuItemLabel::create(pItmLabel2,
CC_CALLBACK_1(HelloWorld::OnClickMenu,this));
pItmMenu2->setTag(kEaseOut);
autopItmLabel3 = Label::createWithBMFont("fonts/fnt2.fnt","EaseInOut");
autopItmMenu3 = MenuItemLabel::create(pItmLabel3,
CC_CALLBACK_1(HelloWorld::OnClickMenu,this));
pItmMenu3->setTag(kEaseInOut);
autopItmLabel4 = Label::createWithBMFont("fonts/fnt2.fnt","EaseSineIn");
autopItmMenu4 = MenuItemLabel::create(pItmLabel4,
CC_CALLBACK_1(HelloWorld::OnClickMenu,this));
pItmMenu4->setTag(kEaseSineIn);
autopItmLabel5 = Label::createWithBMFont("fonts/fnt2.fnt", "EaseSineOut");
autopItmMenu5 = MenuItemLabel::create(pItmLabel5,
CC_CALLBACK_1(HelloWorld::OnClickMenu,this));
pItmMenu5->setTag(kEaseSineOut);
autopItmLabel6 = Label::createWithBMFont("fonts/fnt2.fnt","EaseSineInOut");
autopItmMenu6 = MenuItemSprite::create(pItmLabel6,
CC_CALLBACK_1(HelloWorld::OnClickMenu,this));
pItmMenu6->setTag(kEaseSineInOut);
autopItmLabel7 = Label::createWithBMFont("fonts/fnt2.fnt","EaseExponentialIn");
autopItmMenu7 = MenuItemSprite::create(pItmLabel7,
CC_CALLBACK_1(HelloWorld::OnClickMenu,this));
pItmMenu7->setTag(kEaseExponentialIn);
autopItmLabel8 = Label::createWithBMFont("fonts/fnt2.fnt","EaseExponentialOut");
autopItmMenu8 = MenuItemLabel::create(pItmLabel8,
CC_CALLBACK_1(HelloWorld::OnClickMenu,this));
pItmMenu8->setTag(kEaseExponentialOut);
autopItmLabel9 = Label::createWithBMFont("fonts/fnt2.fnt","EaseExponentialInOut");
autopItmMenu9 = MenuItemLabel::create(pItmLabel9,
CC_CALLBACK_1(HelloWorld::OnClickMenu,this));
pItmMenu9->setTag(kEaseExponentialInOut);
autopItmLabel10 = Label::createWithBMFont("fonts/fnt2.fnt","Speed");
autopItmMenu10 = MenuItemLabel::create(pItmLabel10,
CC_CALLBACK_1(HelloWorld::OnClickMenu,this));
pItmMenu10->setTag(kSpeed);
automn = Menu::create(pItmMenu1,pItmMenu2,pItmMenu3,pItmMenu4,pItmMenu5,
pItmMenu6,pItmMenu7,pItmMenu8,pItmMenu9,pItmMenu10,NULL);
mn->alignItemsInColumns(2,2, 2, 2, 2, NULL);
this->addChild(mn);
returntrue;
}
void HelloWorld::OnClickMenu(Ref* pSender)
{
MenuItem*nmitem = (MenuItem*)pSender;
auto sc = Scene::create();
auto layer = MyAction::create();
layer->setTag(nmitem->getTag());
sc->addChild(layer);
autoreScene = TransitionSlideInR::create(1.0f, sc);
Director::getInstance()->replaceScene(reScene);
}
在上訴代碼你們比較熟悉了,咱們這裏就再也不介紹了。下面咱們再看看下一個場景MyActionScene,它的MyActionScene.ccp,它的主要代碼以下:
[html] view plaincopy
void MyAction::goMenu(Ref* pSender)
{
log("Tag = %i",this->getTag());
FiniteTimeAction * ac1 = (FiniteTimeAction *)MoveBy::create(2,Point(200, 0));
FiniteTimeAction * ac2 = ((FiniteTimeAction *)ac1)->reverse();
ActionInterval * ac = Sequence::create(ac1, ac2, NULL);
switch (this->getTag()) {
case kEaseIn:
sprite->runAction(EaseIn::create(ac, 3)); ①
break;
case kEaseOut:
sprite->runAction(EaseOut::create(ac, 3)); ②
break;
case kEaseInOut:
sprite->runAction(EaseInOut::create(ac,3)); ③
break;
case kEaseSineIn:
sprite->runAction(EaseSineIn::create(ac)); ④
break;
case kEaseSineOut:
sprite->runAction(EaseSineOut::create(ac)); ⑤
break;
case kEaseSineInOut:
sprite->runAction(EaseSineInOut::create(ac)); ⑥
break;
case kEaseExponentialIn:
sprite->runAction(EaseExponentialIn::create(ac)); ⑦
break;
case kEaseExponentialOut:
sprite->runAction(EaseExponentialOut::create(ac)); ⑧
break;
case kEaseExponentialInOut:
sprite->runAction(EaseExponentialInOut::create(ac)); ⑨
break;
case kSpeed:
sprite->runAction(Speed::create(ac, (CCRANDOM_0_1() * 5))); ⑩
break;
}
}
第①行代碼sprite->runAction(EaseIn::create(ac, 3))是以3倍速度由慢至快。第②代碼sprite->runAction(EaseOut::create(ac, 3))是以3倍速度由快至慢。第③代碼sprite->runAction(EaseInOut::create(ac, 3))是以3倍速度由慢至快再由快至慢。
第④代碼sprite->runAction(EaseSineIn::create(ac))是採用正弦變換速度由慢至快。第⑤代碼sprite->runAction(EaseSineOut::create(ac))是採用正弦變換速度由快至慢。第⑥代碼sprite->runAction(EaseOut::create(ac, 3)) 是採用正弦變換速度由慢至快再由快至慢。
第⑦代碼sprite->runAction(EaseExponentialIn::create(ac))採用指數變換速度由慢至快。第⑧代碼sprite->runAction(EaseExponentialOut::create(ac))採用指數變換速度由快至慢。第⑨代碼sprite->runAction(EaseExponentialInOut::create(ac)) 採用指數變換速度由慢至快再由快至慢。
第⑩代碼sprite->runAction(Speed::create(ac, (CCRANDOM_0_1() * 5))) 隨機設置變換速度。
更多內容請關注Cocos2d-x系列圖書《Cocos2d-x實戰(卷Ⅰ):C++開發》
本書交流討論網站:http://www.cocoagame.net
歡迎加入cocos2d-x技術討論羣:25776038六、327403678