以前兩斧子,相信你們已經對於動畫的原理有了比較清楚的瞭解,這最後一斧子,我們一塊兒看一看ActionsTest.h與cpp。咱們打開頭文件來看一下代碼:算法
#ifndef _ActionsTest_H_ app
#define _ActionsTest_H_ 框架
//包含示例的基本頭文件,由於要用到演示場景基類TestScene。這個類在以前的TestCpp框架分析中有講解。 ide
#include "../testBasic.h" 函數
////----#include "cocos2d.h" oop
//使用Cocos2d的命名空間 動畫
USING_NS_CC; this
//這裏是一個枚舉,列出了示例中全部的精靈動畫類型 spa
enum
{
ACTION_MANUAL_LAYER = 0,//基本狀態
ACTION_MOVE_LAYER, //移動動畫
ACTION_SCALE_LAYER, //縮放動畫
ACTION_ROTATE_LAYER, //旋轉動畫
ACTION_SKEW_LAYER, //扭曲動畫
ACTION_SKEWROTATE_LAYER,//扭曲與旋轉組合動畫
ACTION_JUMP_LAYER, //跳躍動畫
ACTION_CARDINALSPLINE_LAYER,//貝塞爾曲線動畫
ACTION_CATMULLROM_LAYER,//點構成的曲線動畫
ACTION_BEZIER_LAYER, //貝塞爾曲線路徑動畫
ACTION_BLINK_LAYER, //閃現動畫
ACTION_FADE_LAYER, //淡入淡出動畫
ACTION_TINT_LAYER, //變色動畫
ACTION_ANIMATE_LAYER, //幀動畫
ACTION_SEQUENCE_LAYER, //動畫序列
ACTION_SEQUENCE2_LAYER, //動畫序列
ACTION_SPAWN_LAYER, //動畫組合
ACTION_REVERSE, //反向播放動畫
ACTION_DELAYTIME_LAYER, //動畫暫停與繼續播放
ACTION_REPEAT_LAYER, //重複播放動畫
ACTION_REPEATEFOREVER_LAYER,//無限循環播放動畫
ACTION_ROTATETOREPEATE_LAYER,//循環旋轉動畫一
ACTION_ROTATEJERK_LAYER,//循環旋轉動畫二
ACTION_CALLFUNC_LAYER,//動畫與函數調用一
ACTION_CALLFUNCND_LAYER,//動畫與函數調用二
ACTION_REVERSESEQUENCE_LAYER,//反向動畫序列。
ACTION_REVERSESEQUENCE2_LAYER,//反向動畫序列二。
ACTION_ORBIT_LAYER,//旋轉攝像機動畫
ACTION_FLLOW_LAYER,//跟隨動畫
ACTION_TARGETED_LAYER,//控制目標動畫
PAUSERESUMEACTIONS_LAYER,//暫停與恢復動畫
ACTION_ISSUE1305_LAYER,//1305號動畫
ACTION_ISSUE1305_2_LAYER,//1305號的動畫二
ACTION_ISSUE1288_LAYER,//1288號動畫
ACTION_ISSUE1288_2_LAYER,//1288的動畫二
ACTION_ISSUE1327_LAYER,//1327號動畫
ACTION_LAYER_COUNT,//動畫最大數量
};
//看完這些枚舉,我想說的是,精靈動畫的類型真TMD豐富啊!居然多到想不出名字~:)
//這是用於展現每種動畫的基礎場景類,它包含了一個返回主菜單的按鈕。
class ActionsTestScene : public TestScene
{
public:
//重虛函數runThisTest作一些初始化工做。
virtual void runThisTest();
};
爲了方便代碼閱讀,我將CPP中相應函數實現移過來,後面都按這種格式:
//演示動畫所用場景基類的初始化函數重載
void ActionsTestScene::runThisTest()
{
//先將索引置-1,後面調用NextAction()使其加1變爲0,即演示第一個動畫。
s_nActionIdx = -1;
addChild(NextAction());
//運行當前場景。
CCDirector::sharedDirector()->replaceScene(this);
}
//從CCLayer派生出一個基礎的動畫演示類,用於包含要表現動做的一些精靈。
class ActionsDemo : public CCLayer
{
protected:
//動畫的主角要出場啦!如下是三個圖片精靈實例指針,其分別指向出場表演的男1號grossini,女1號tamara,女2號kathia,這一男兩女將成爲動畫演示的三位演員。你們歡迎它們!
CCSprite* m_grossini;
CCSprite* m_tamara;
CCSprite* m_kathia;
public:
//重載當前動畫類被載入時要調用的函數onEnter作一些精靈生成的處理。
virtual void onEnter();
//重載當前動畫類被卸載時要調用的函數onExit作一些釋放處理。
virtual void onExit();
//這個函數用於指定須要幾位演員出場時若是要求居中對齊該怎麼站位。
void centerSprites(unsigned int numberOfSprites);
//這個函數用於指定須要幾位演員出場時若是要求居左對齊該怎麼站位。
void alignSpritesLeft(unsigned int numberOfSprites);
//取得動畫的主標題
virtual std::string title();
//取得動畫的副標題
virtual std::string subtitle();
//當在點擊「重置」按鈕時的回調函數
void restartCallback(CCObject* pSender);
//當在點擊「下一個」按鈕時的回調函數
void nextCallback(CCObject* pSender);
//當在點擊「上一個」按鈕時的回調函數。
void backCallback(CCObject* pSender);
};
//取得演示動畫CCLayer所用基類的主標題
std::string ActionsDemo::title()
{
return "ActionsTest";
}
//取得演示動畫CCLayer所用基類的副標題
std::string ActionsDemo::subtitle()
{
return "";
}
//加載演示動畫CCLayer所用基類時的初始化處理函數。
void ActionsDemo::onEnter()
{
CCLayer::onEnter();
//建立了三個演員。
//男一號,其使用圖片地址爲s_pPathGrossini
m_grossini = CCSprite::create(s_pPathGrossini);
m_grossini->retain();
//女一號,其使用圖片地址爲s_pPathSister1
m_tamara = CCSprite::create(s_pPathSister1);
m_tamara->retain();
//女二號,其使用圖片地址爲s_pPathSister2
m_kathia = CCSprite::create(s_pPathSister2);
m_kathia->retain();
//將三位演員都放入當前演示動畫所在的CCLayer中。
addChild(m_grossini, 1);
addChild(m_tamara, 2);
addChild(m_kathia, 3);
//取得屏幕的大小
CCSize s = CCDirector::sharedDirector()->getWinSize();
//男一號站在屏幕中下位置
m_grossini->setPosition(CCPointMake(s.width/2, s.height/3));
//女一號站在屏幕中上位置
m_tamara->setPosition(CCPointMake(s.width/2, 2*s.height/3));
//女二號站在屏幕正中間
m_kathia->setPosition(CCPointMake(s.width/2, s.height/2));
// 建立一個文字標籤用於顯示標題
std::string str = title();
const char * pTitle = str.c_str();
CCLabelTTF* label = CCLabelTTF::create(pTitle, "Arial", 18);
addChild(label, 1);
//將文字標籤放在屏幕正中靠上位置
label->setPosition( CCPointMake(s.width/2, s.height - 30) );
//建立一個文字標籤用於顯示副標題
std::string strSubtitle = subtitle();
if( ! strSubtitle.empty() )
{
//建立文件標籤並放在主標題文字標籤之下。
CCLabelTTF* l = CCLabelTTF::create(strSubtitle.c_str(), "Thonburi", 22);
addChild(l, 1);
l->setPosition( CCPointMake(s.width/2, s.height - 60) );
}
// 建立三個按鈕(看名字應理解爲圖片菜單項,其實就是具備普通和按下兩種狀態的圖片切換效果的按鈕)用於控制演示的動畫。
// 第一個按鈕,在按下時調用演示上一個動畫的函數。
CCMenuItemImage *item1 = CCMenuItemImage::create(s_pPathB1, s_pPathB2, this, menu_selector(ActionsDemo::backCallback) );
// 第二個按鈕,在按下時調用從新演示當前動畫的函數。
CCMenuItemImage *item2 = CCMenuItemImage::create(s_pPathR1, s_pPathR2, this, menu_selector(ActionsDemo::restartCallback) );
// 第三個按鈕,在按下時調用演示下一個動畫的函數。
CCMenuItemImage *item3 = CCMenuItemImage::create(s_pPathF1, s_pPathF2, this, menu_selector(ActionsDemo::nextCallback) );
//由這三個按鈕(也就是剛說的「圖片菜單項」)生成一個菜單。由於CMenuItemImage和CCMenu都是CCNode的子類。因此這一句本質上是將若干CCNode作爲一個新的CCNode的子節點並返回。
CCMenu *menu = CCMenu::create(item1, item2, item3, NULL);
//將菜單放在零零點位置。
menu->setPosition(CCPointZero);
//設置各個按鈕相對於菜單項的位置。
item1->setPosition(CCPointMake(s.width/2 - item2->getContentSize().width*2, item2->getContentSize().height/2));
item2->setPosition(CCPointMake(s.width/2, item2->getContentSize().height/2));
item3->setPosition(CCPointMake(s.width/2 + item2->getContentSize().width*2, item2->getContentSize().height/2));
//將菜單加入當前的演示動畫CCLayer所用基類中。
addChild(menu, 1);
}
//在當前演示動畫CCLayer所用基類被釋放時的處理函數
void ActionsDemo::onExit()
{
//精靈的釋放,表明三位演員的退場。
m_grossini->release();
m_tamara->release();
m_kathia->release();
CCLayer::onExit();
}
//從新演示當前動畫的回調函數。
void ActionsDemo::restartCallback(CCObject* pSender)
{
//建立一個新場景
CCScene* s = new ActionsTestScene();
//將RestartAction()函數返回的CCLayer加入場景中。
s->addChild( RestartAction() );
//將新場景作爲遊戲要顯示的場景。
CCDirector::sharedDirector()->replaceScene(s);
//引用計數器減1操做,以使將來能夠正確的被釋放。
s->release();
}
//演示下一個動畫的回調函數。
void ActionsDemo::nextCallback(CCObject* pSender)
{
//建立一個新場景
CCScene* s = new ActionsTestScene();
//將NextAction()函數返回的CCLayer加入場景中。
s->addChild( NextAction() );
//將新場景作爲遊戲要顯示的場景。
CCDirector::sharedDirector()->replaceScene(s);
//引用計數器減1操做,以使將來能夠正確的被釋放。
s->release();
}
//演示上一個動畫的回調函數。
void ActionsDemo::backCallback(CCObject* pSender)
{
//建立一個新場景
CCScene* s = new ActionsTestScene();
//將BackAction ()函數返回的CCLayer加入場景中。
s->addChild( BackAction() );
//將新場景作爲遊戲要顯示的場景。
CCDirector::sharedDirector()->replaceScene(s);
//引用計數器減1操做,以使將來能夠正確的被釋放。
s->release();
}
//這個函數用於指定須要幾位演員出場時若是要求居中對齊該怎麼站位。
void ActionsDemo::centerSprites(unsigned int numberOfSprites)
{
//取得屏幕大小
CCSize s = CCDirector::sharedDirector()->getWinSize();
if( numberOfSprites == 0 )
{ //若是指定沒有演員,將三位演員都設爲不顯示
m_tamara->setVisible(false);
m_kathia->setVisible(false);
m_grossini->setVisible(false);
}
else if ( numberOfSprites == 1 )
{ //若是指定只有一位演員來表演,則將男一號放在屏幕中央,兩位女演員設爲不顯示。
m_tamara->setVisible(false);
m_kathia->setVisible(false);
m_grossini->setPosition(CCPointMake(s.width/2, s.height/2));
}
else if( numberOfSprites == 2 )
{ //若是指定兩位演員來表演,則將兩位女演員放在屏幕中心位置對齊的兩邊,並將男演員設爲不顯示。
m_kathia->setPosition( CCPointMake(s.width/3, s.height/2));
m_tamara->setPosition( CCPointMake(2*s.width/3, s.height/2));
m_grossini->setVisible(false);
}
else if( numberOfSprites == 3 )
{ //三位演員同時上場,分別放在屏幕左,中,右三個位置。
m_grossini->setPosition( CCPointMake(s.width/2, s.height/2));
m_tamara->setPosition( CCPointMake(s.width/4, s.height/2));
m_kathia->setPosition( CCPointMake(3 * s.width/4, s.height/2));
}
}
//這個函數用於指定須要幾位演員出場時若是要求居左對齊該怎麼站位。同上,只是位置略有差異。
void ActionsDemo::alignSpritesLeft(unsigned int numberOfSprites)
{
CCSize s = CCDirector::sharedDirector()->getWinSize();
if( numberOfSprites == 1 )
{
m_tamara->setVisible(false);
m_kathia->setVisible(false);
m_grossini->setPosition(CCPointMake(60, s.height/2));
}
else if( numberOfSprites == 2 )
{
m_kathia->setPosition( CCPointMake(60, s.height/3));
m_tamara->setPosition( CCPointMake(60, 2*s.height/3));
m_grossini->setVisible( false );
}
else if( numberOfSprites == 3 )
{
m_grossini->setPosition( CCPointMake(60, s.height/2));
m_tamara->setPosition( CCPointMake(60, 2*s.height/3));
m_kathia->setPosition( CCPointMake(60, s.height/3));
}
}
//這是第一個要演示的動畫,其實它只是把三位演員顯示出來。
class ActionManual : public ActionsDemo
{
public:
//重載當前動畫類被載入時要調用的函數onEnter作一些精靈生成的處理。
virtual void onEnter();
//重載取得動畫的副標題
virtual std::string subtitle();
};
//基礎演示動畫所用CCLayer被加載時的初始化處理函數。
void ActionManual::onEnter()
{ //調用基類的同名函數,加載三位演員。
ActionsDemo::onEnter();
//取得屏幕的大小
CCSize s = CCDirector::sharedDirector()->getWinSize();
//將女一號演員在X,Y方向上分別縮放後放在相應位置,並設置其半透明。
m_tamara->setScaleX( 2.5f);
m_tamara->setScaleY( -1.0f);
m_tamara->setPosition( CCPointMake(100,70) );
//透明度的取值爲0~255,0表明徹底透明,255表明徹底不透明。
m_tamara->setOpacity( 128);
//男一號演員,這裏讓它旋轉120度以後放在屏幕中心位置,並設置其全身顏色爲紅色。
m_grossini->setRotation( 120);
m_grossini->setPosition( CCPointMake(s.width/2, s.height/2));
//色彩設置爲紅色。ccc3分別用R,G,B三元色作爲參數返回色彩值。
m_grossini->setColor( ccc3( 255,0,0));
//女二號演員,這裏設置位置爲屏幕中心靠左。
m_kathia->setPosition( CCPointMake(s.width-100, s.height/2));
//色彩設置爲藍色,這以用預約義的宏ccBLUE來表明藍色的色彩值。
m_kathia->setColor( ccBLUE);
}
//取得當前演示動畫的副標題。
std::string ActionManual::subtitle()
{
return "Manual Transformation";
}
//第二種動畫演示表現了三位演員的移動變化。
class ActionMove : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
};
//移動動畫所用CCLayer被加載時的初始化處理函數。
void ActionMove::onEnter()
{ //調用基類的同名函數,加載三位演員。
ActionsDemo::onEnter();
//讓三位演員以居中對齊方式進行站位。
centerSprites(3);
//取得屏幕的大小
CCSize s = CCDirector::sharedDirector()->getWinSize();
//建立三個時間漸變更畫。第一個是由CCActionInterval子類CCMoveTo靜態函數所建立的「2秒移動到某位置」,第二個是由CCActionInterval子類CCMoveTo靜態函數所建立的「2秒移動多少距離」。第三個是第二個動畫的反向播放。
CCActionInterval* actionTo = CCMoveTo::create(2, CCPointMake(s.width-40, s.height-40));
CCActionInterval* actionBy = CCMoveBy::create(2, CCPointMake(80,80));
CCActionInterval* actionByBack = actionBy->reverse();
//讓三個演員分別按照不一樣的動畫形式來演示。女一號就按第一種動畫來進行演示。
m_tamara->runAction( actionTo);
//男一號呢?它的演示是第二個動畫和第三個動畫的串聯。CCSequence::create函數能夠將多個動畫串聯在一塊兒,按照串聯的順序進行逐個播放。
m_grossini->runAction( CCSequence::create(actionBy, actionByBack, NULL));
//女二號同女一號相似也是演示一個移動到某位置的動畫。這裏指定1秒內移動到40,40的位置。
m_kathia->runAction(CCMoveTo::create(1, CCPointMake(40,40)));
}
//這裏取得移動動畫演示的副標題。
std::string ActionMove::subtitle()
{
return "MoveTo / MoveBy";
}
//第三種動畫演示表現了三位演員的縮放變化。
class ActionScale : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
};
//縮放動畫演示
void ActionScale::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//將三個演員按居中對齊進行站位
centerSprites(3);
//三個要演示的動畫形式分別是
//1.縮放到指定的程度
CCActionInterval* actionTo = CCScaleTo::create(2.0f, 0.5f);
//2.當前縮放值再續繼縮放多少
CCActionInterval* actionBy = CCScaleBy::create(2.0f, 1.0f, 10.0f);
//3.同2
CCActionInterval* actionBy2 = CCScaleBy::create(2.0f, 5.0f, 1.0f);
//讓男一號演示動畫1
m_grossini->runAction( actionTo);
//讓女一號演示一個動畫序列,這個序列爲先演示動畫2,再演示動畫2的反向播放。
m_tamara->runAction( CCSequence::create(actionBy, actionBy->reverse(), NULL));
//女二號的動畫同女一號
m_kathia->runAction( CCSequence::create(actionBy2, actionBy2->reverse(), NULL));
}
//副標題
std::string ActionScale::subtitle()
{
return "ScaleTo / ScaleBy";
}
//第四種動畫演示表現了三位演員的旋轉變化
class ActionRotate : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
};
void ActionRotate::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//將三個演員按居中對齊進行站位
centerSprites(3);
//定義幾種旋轉到某個角度的動畫
CCActionInterval* actionTo = CCRotateTo::create( 2, 45);
CCActionInterval* actionTo2 = CCRotateTo::create( 2, -45);
CCActionInterval* actionTo0 = CCRotateTo::create(2 , 0);
//女一號演示一個動畫序列
m_tamara->runAction( CCSequence::create(actionTo, actionTo0, NULL));
//定義從如今的角度在2秒內繼續旋轉360度的動畫
CCActionInterval* actionBy = CCRotateBy::create(2 , 360);
//定義actionBy的反向播放動畫
CCActionInterval* actionByBack = actionBy->reverse();
//男一號演示一個動畫序列
m_grossini->runAction( CCSequence::create(actionBy, actionByBack, NULL));
//女二號演示一個動畫序列,這個動畫序列中有一個動畫爲actionTo0的拷貝,並將這個拷貝設爲由內存管理器進行內存釋放。這句裏有兩個知識點:(1)爲何要使用動畫的拷貝?(2)爲何要調用autorelease?答案分別是:(1)目前的引擎機制要求每一個動畫只能有一個演員使用。當你調用runAction時會將動畫加入動畫管理器,而動畫管理器調用addAction函數時,會在最後調用pAction->startWithTarget(pTarget);若是這個動畫已經有一個演員在使用了,這裏會覆蓋掉以前的演員信息,動畫只能被最後使用的演員佔有。(2)由於create函數建立動畫時,會在內部對動畫調用autorelease,而copy函數只會新生成一個動畫的複製品,不會對其進行調用autorelease。
m_kathia->runAction( CCSequence::create(actionTo2, actionTo0->copy()->autorelease(), NULL));
}
//顯示副標題
std::string ActionRotate::subtitle()
{
return "RotateTo / RotateBy";
}
//第五種動畫演示表現了三位演員的扭曲變化。
class ActionSkew : public ActionsDemo
{
virtual void onEnter();
virtual std::string subtitle();
};
void ActionSkew::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//將三個演員按居中對齊進行站位
centerSprites(3);
//這裏定義了五種動畫
//前兩種動畫是扭曲到指定程度
CCActionInterval *actionTo = CCSkewTo::create(2, 37.2f, -37.2f);
CCActionInterval *actionToBack = CCSkewTo::create(2, 0, 0);
//而後兩種動畫是繼續扭曲多少
CCActionInterval *actionBy = CCSkewBy::create(2, 0.0f, -90.0f);
CCActionInterval *actionBy2 = CCSkewBy::create(2, 45.0f, 45.0f);
//最後一種動畫是actionBy的反向播放
CCActionInterval *actionByBack = actionBy->reverse();
//女一號演示一個動畫序列,這個動畫序列有兩個動畫,先是actionTo,而後是actionToBack
m_tamara->runAction(CCSequence::create(actionTo, actionToBack, NULL));
//男一號演示一個動畫序列,這個動畫序列有兩個動畫,先是actionBy,而後是actionByBack
m_grossini->runAction(CCSequence::create(actionBy, actionByBack, NULL));
//女二號演示一個動畫序列,這個動畫序列也是有兩個動畫,先是actionBy2,而後是它的反向播放。
m_kathia->runAction(CCSequence::create(actionBy2, actionBy2->reverse(), NULL));
}
//副標題
string ActionSkew::subtitle()
{
return "SkewTo / SkewBy";
}
//第六種動畫演示表現的是前面幾種變化的大雜燴。
class ActionSkewRotateScale : public ActionsDemo
{
virtual void onEnter();
virtual std::string subtitle();
};
void ActionSkewRotateScale::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//本動畫用不到三位演員,在此將它們刪除
m_tamara->removeFromParentAndCleanup(true);
m_grossini->removeFromParentAndCleanup(true);
m_kathia->removeFromParentAndCleanup(true);
//這裏取得一個寬高均爲100的大小
CCSize boxSize = CCSizeMake(100.0f, 100.0f);
//建立一個顏色層
CCLayerColor *box = CCLayerColor::create(ccc4(255, 255, 0, 255));
//設置錨點爲左下角
box->setAnchorPoint(ccp(0, 0));
//設置當前顏色層的位置
box->setPosition(ccp(190, 110));
//設置顏色色的大小
box->setContentSize(boxSize);
//在顏色層上再加立兩個子顏色層。
//第一個是紅色,放在左上角。
static float markrside = 10.0f;
CCLayerColor *uL = CCLayerColor::create(ccc4(255, 0, 0, 255));
box->addChild(uL);
uL->setContentSize(CCSizeMake(markrside, markrside));
uL->setPosition(ccp(0.f, boxSize.height - markrside));
uL->setAnchorPoint(ccp(0, 0));
//第二個是藍色,放在右上角。
CCLayerColor *uR = CCLayerColor::create(ccc4(0, 0, 255, 255));
box->addChild(uR);
uR->setContentSize(CCSizeMake(markrside, markrside));
uR->setPosition(ccp(boxSize.width - markrside, boxSize.height - markrside));
uR->setAnchorPoint(ccp(0, 0));
addChild(box);
//定義幾種動畫,分別爲扭曲,旋轉,縮放。
CCActionInterval *actionTo = CCSkewTo::create(2, 0.f, 2.f);
CCActionInterval *rotateTo = CCRotateTo::create(2, 61.0f);
CCActionInterval *actionScaleTo = CCScaleTo::create(2, -0.44f, 0.47f);
CCActionInterval *actionScaleToBack = CCScaleTo::create(2, 1.0f, 1.0f);
CCActionInterval *rotateToBack = CCRotateTo::create(2, 0);
CCActionInterval *actionToBack = CCSkewTo::create(2, 0, 0);
//讓顏色層同時演示三個動畫序列。這裏要理解爲何它能夠同時演示多個動畫序列?咱們以前將過runAction會將演員和動畫通知動畫管理器,這些動畫會存入相應的動畫集,動畫管理器在每幀會更新相應的動畫,這裏雖然用的是動畫序列,可是動畫序列自己仍然是動畫。因此調用屢次runAction能夠將多個動畫或動畫序列同時播放。
box->runAction(CCSequence::create(actionTo, actionToBack, NULL));
box->runAction(CCSequence::create(rotateTo, rotateToBack, NULL));
box->runAction(CCSequence::create(actionScaleTo, actionScaleToBack, NULL));
}
//取得副標題。
string ActionSkewRotateScale::subtitle()
{
return "Skew + Rotate + Scale";
}
//第七種動畫演示表現的是如何讓演員們按照拋物線跳躍。
class ActionJump : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
};
void ActionJump::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//將三個演員按居中對齊進行站位
centerSprites(3);
//定義一個動畫,表明跳躍到某個位置
CCActionInterval* actionTo = CCJumpTo::create(2, CCPointMake(300,300), 50, 4);
//定義一個動畫,表明從如今的位置跳躍多遠距離。
CCActionInterval* actionBy = CCJumpBy::create(2, CCPointMake(300,0), 50, 4);
//定義一個只是向上跳的動畫
CCActionInterval* actionUp = CCJumpBy::create(2, CCPointMake(0,0), 80, 4);
//定義第二個動畫的反向播放動畫
CCActionInterval* actionByBack = actionBy->reverse();
//三位演員分別運行相應動畫。
m_tamara->runAction( actionTo);
m_grossini->runAction( CCSequence::create(actionBy, actionByBack, NULL));
//CCRepeatForever是一個無限循環動畫。它將指定的動畫進行無限循環播放。
m_kathia->runAction( CCRepeatForever::create(actionUp));
}
//顯示副標題。
std::string ActionJump::subtitle()
{
return "JumpTo / JumpBy";
}
//第八種動畫演示表現的是讓演員們按照貝塞爾曲線的路徑運動。
class ActionBezier : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
};
void ActionBezier::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//取得屏幕大小
CCSize s = CCDirector::sharedDirector()->getWinSize();
//將三位演員按居中對齊進行站位
centerSprites(3);
// 建立第一個貝塞爾曲線
ccBezierConfig bezier;
bezier.controlPoint_1 = CCPointMake(0, s.height/2);
bezier.controlPoint_2 = CCPointMake(300, -s.height/2);
bezier.endPosition = CCPointMake(300,100);
//建立一個貝塞爾曲線動畫,這個CCBezierBy的意思是當前位置爲曲線起點。曲線的其它點是相對於它的位置。
CCActionInterval* bezierForward = CCBezierBy::create(3, bezier);
//建立上面動畫的反向播放動畫。
CCActionInterval* bezierBack = bezierForward->reverse();
//建立一個無限循環動畫序列,這個動畫序列由上面兩個動畫組成。 CCAction* rep = CCRepeatForever::create((CCActionInterval*)CCSequence::create( bezierForward, bezierBack, NULL));
// 建立第二個貝塞爾曲線
// 設置一下女一號的當前位置。
m_tamara->setPosition(CCPointMake(80,160));
ccBezierConfig bezier2;
bezier2.controlPoint_1 = CCPointMake(100, s.height/2);
bezier2.controlPoint_2 = CCPointMake(200, -s.height/2);
bezier2.endPosition = CCPointMake(240,160);
//建立一個貝塞爾曲線動畫,這個CCBezierTo的意思是演員當前位置爲曲線起點。曲線的其它點是屏幕的絕對位置。
CCActionInterval* bezierTo1 = CCBezierTo::create(2, bezier2);
//設置一下女二號的當前位置。建立相同的動畫。
m_kathia->setPosition(CCPointMake(400,160));
//若是剛纔的ActionRotate 您理解的透徹,那這裏其實也能夠改爲:CCActionInterval* bezierTo2 = (CCActionInterval*)(bezierTo1->copy()->autorelease());
CCActionInterval* bezierTo2 = CCBezierTo::create(2, bezier2);
//三位演員開始動畫演示。
m_grossini->runAction( rep);
m_tamara->runAction(bezierTo1);
m_kathia->runAction(bezierTo2);
}
//顯示副標題。
std::string ActionBezier::subtitle()
{
return "BezierBy / BezierTo";
}
//第九種動畫演示表現的是演員們玩「我閃我閃亂你眼」
class ActionBlink : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
};
void ActionBlink::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//將二位女演員按居中對齊進行站位
centerSprites(2);
//這個CCBlink的create簡單,就是指定幾秒內共閃動幾回。
CCActionInterval* action1 = CCBlink::create(2, 10);
CCActionInterval* action2 = CCBlink::create(2, 5);
//兩位演員開始表演「閃閃惹人愛」
m_tamara->runAction( action1);
m_kathia->runAction(action2);
}
//顯示副標題。
std::string ActionBlink::subtitle()
{
return "Blink";
}
//第十種動畫演示表現的是演員們淡入淡出
class ActionFade : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
};
void ActionFade::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//將二位女演員按居中對齊進行站位
centerSprites(2);
//設置女一號的透明度爲0
m_tamara->setOpacity( 0 );
//CCFadeIn是一個淡入動畫,參數爲秒數。表明須要多久顯示。
CCActionInterval* action1 = CCFadeIn::create(1.0f);
//淡入的反向播放,其時是從算法上實現了淡出。
CCActionInterval* action1Back = action1->reverse();
//CCFadeOut是一個淡出動畫。參數爲秒數。表明須要多久消融。
CCActionInterval* action2 = CCFadeOut::create(1.0f);
//淡入的反向播放,其時是從算法上實現了淡入。
CCActionInterval* action2Back = action2->reverse();
//兩位女演員各自演員一個動畫序列。
m_tamara->runAction( CCSequence::create( action1, action1Back, NULL));
m_kathia->runAction( CCSequence::create( action2, action2Back, NULL));
}
//顯示副標題。
std::string ActionFade::subtitle()
{
return "FadeIn / FadeOut";
}
//第十一種動畫演示表現的是演員們如何進行色彩漸變。
class ActionTint : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
};
void ActionTint::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//將二位女演員按居中對齊進行站位
centerSprites(2);
//建立三個變色動畫,第一個是2秒時間變化到指定的色值。第二個是2秒時間從當前色彩狀態變化多少色值,第三個是第二個動畫的反向動畫。
CCActionInterval* action1 = CCTintTo::create(2, 255, 0, 255);
CCActionInterval* action2 = CCTintBy::create(2, -127, -255, -127);
CCActionInterval* action2Back = action2->reverse();
//女一號運行動畫1。
m_tamara->runAction( action1);
//女二號運行一個動畫序列,這個動畫序列先運行動畫2,而後運行動畫3。
m_kathia->runAction( CCSequence::create( action2, action2Back, NULL));
}
std::string ActionTint::subtitle()
{
return "TintTo / TintBy";
}
//第十二種動畫演示表現的是演員的逐幀動做動畫。
class ActionAnimate : public ActionsDemo
{
public:
virtual void onEnter();
virtual void onExit();
virtual std::string title();
virtual std::string subtitle();
};
void ActionAnimate::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//將三位演員按居中對齊進行站位
centerSprites(3);
//建立一個序列幀動畫。
CCAnimation* animation = CCAnimation::create();
//載入15張圖片作爲每幀顯示的精靈圖片。
for( int i=1;i<15;i++)
{
char szName[100] = {0};
sprintf(szName, "Images/grossini_dance_%02d.png", i);
animation->addSpriteFrameWithFileName(szName);
}
//設置幀間隔時間。
animation->setDelayPerUnit(2.8f / 14.0f);
//設置動畫結束後保持初始幀數據不進行釋放。
animation->setRestoreOriginalFrame(true);
//建立序列幀動畫。
CCAnimate* action = CCAnimate::create(animation);
//男一號動行一個動畫序列,這個動畫序列先播放一遍序列幀動畫,而後再反向播放一遍序列幀動畫。
m_grossini->runAction(CCSequence::create(action, action->reverse(), NULL));
//下面演示了經過一個plist文件來播放一個序列幀動畫。
//先取得序列幀動畫管理器。
CCAnimationCache *cache = CCAnimationCache::sharedAnimationCache();
//加載一個plist文件
cache->addAnimationsWithFile("animations/animations-2.plist");
//取得plist文件中的對應序列幀動畫信息
CCAnimation *animation2 = cache->animationByName("dance_1");
//以此信息建立一個序列幀動畫。
CCAnimate* action2 = CCAnimate::create(animation2);
//女一號運行一個動畫序列,這個動畫序列先播放一遍序列幀動畫,而後再反向播放一遍序列幀動畫。
m_tamara->runAction(CCSequence::create(action2, action2->reverse(), NULL));
//產生一個plist文件中的對應序列幀動畫信息的拷貝
CCAnimation *animation3 = (CCAnimation *)animation2->copy()->autorelease();
//設置動畫信息中的動畫循環次數
animation3->setLoops(4);
//以此信息建立一個序列幀動畫。
CCAnimate* action3 = CCAnimate::create(animation3);
//女二號運行此動畫。
m_kathia->runAction(action3);
}
void ActionAnimate::onExit()
{
ActionsDemo::onExit();
//TODO:[[NSNotificationCenter defaultCenter] removeObserver:observer_];
}
std::string ActionAnimate::title()
{
return "Animation";
}
std::string ActionAnimate::subtitle()
{
return "Center: Manual animation. Border: using file format animation";
}
//第十三種動畫演示的是多種動畫如何組成動畫序列。
class ActionSequence : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
};
void ActionSequence::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//只須要男一號上場
alignSpritesLeft(1);
//建立一個動畫序列,先運行一個移動動畫,再運行一個旋轉動畫。
CCFiniteTimeAction* action = CCSequence::create(
CCMoveBy::create( 2, CCPointMake(240,0)),
CCRotateBy::create( 2, 540),
NULL);
//男一號演示此動畫。
m_grossini->runAction(action);
}
std::string ActionSequence::subtitle()
{
return "Sequence: Move + Rotate";
}
//第十四種動畫演示表現的是如何使多種動畫在組成動畫序列中可以進行響應控制。
class ActionSequence2 : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
void callback1();
void callback2(CCNode* sender);
void callback3(CCNode* sender, void* data);
};
void ActionSequence2::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//只須要男一號上場
alignSpritesLeft(1);
//男一號設置不顯示
m_grossini->setVisible(false);
//建立一個序列動畫。這個序列動畫包含了一些動畫和回調函數, CCCallFunc爲不帶參數的回調函數,CCCallFuncN爲以演示當前動畫的演員爲參數的回調函數,CCCallFuncND爲以演示當前動畫的演員和一個用戶輸入值爲參數的回調函數。
CCFiniteTimeAction* action = CCSequence::create(
CCPlace::create(CCPointMake(200,200)),
CCShow::create(),
CCMoveBy::create(1, CCPointMake(100,0)),
CCCallFunc::create(this, callfunc_selector(ActionSequence2::callback1)),
CCCallFuncN::create(this, callfuncN_selector(ActionSequence2::callback2)),
CCCallFuncND::create(this, callfuncND_selector(ActionSequence2::callback3), (void*)0xbebabeba),
NULL);
//男一號運行此動畫序列。
m_grossini->runAction(action);
}
//不帶參數的回調函數
void ActionSequence2::callback1()
{
CCSize s = CCDirector::sharedDirector()->getWinSize();
CCLabelTTF *label = CCLabelTTF::create("callback 1 called", "Marker Felt", 16);
label->setPosition(CCPointMake( s.width/4*1,s.height/2));
addChild(label);
}
//以演示當前動畫的演員爲參數的回調函數
void ActionSequence2::callback2(CCNode* sender)
{
CCSize s = CCDirector::sharedDirector()->getWinSize();
CCLabelTTF *label = CCLabelTTF::create("callback 2 called", "Marker Felt", 16);
label->setPosition(CCPointMake( s.width/4*2,s.height/2));
addChild(label);
}
//以演示當前動畫的演員和一個用戶輸入值爲參數的回調函數
void ActionSequence2::callback3(CCNode* sender, void* data)
{
CCSize s = CCDirector::sharedDirector()->getWinSize();
CCLabelTTF *label = CCLabelTTF::create("callback 3 called", "Marker Felt", 16);
label->setPosition(CCPointMake( s.width/4*3,s.height/2));
addChild(label);
}
std::string ActionSequence2::subtitle()
{
return "Sequence of InstantActions";
}
//第十五種動畫演示表現的是幾種動畫的並行,即如何同時進行多種動畫。
class ActionSpawn : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
};
void ActionSpawn::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//只須要男一號上場
alignSpritesLeft(1);
//建立一個動畫組合,使用方法與動畫序列相似了,這裏同時播放了跳躍和旋轉的動畫。
CCAction* action = CCSpawn::create(
CCJumpBy::create(2, CCPointMake(300,0), 50, 4),
CCRotateBy::create( 2, 720),
NULL);
//讓男一行運行此動畫組合。
m_grossini->runAction(action);
}
std::string ActionSpawn::subtitle()
{
return "Spawn: Jump + Rotate";
}
//第十六種動畫演示表現的是動畫的倒退重播,就像你看DVD按着後退鍵。
class ActionReverse : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
};
void ActionReverse::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//只須要男一號上場
alignSpritesLeft(1);
//建立一個跳躍動畫。
CCActionInterval* jump = CCJumpBy::create(2, CCPointMake(300,0), 50, 4);
//建立一個動畫序列,先運行上面的跳躍動畫,再運其反向動畫。
CCFiniteTimeAction* action = CCSequence::create( jump, jump->reverse(), NULL);
//男一號運行動畫。
m_grossini->runAction(action);
}
std::string ActionReverse::subtitle()
{
return "Reverse an action";
}
//第十七種動畫演示表現的是動畫的暫停與繼續播放。
class ActionDelayTime : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
};
void ActionDelayTime::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//只須要男一號上場
alignSpritesLeft(1);
//建立一個移動動畫。
CCActionInterval* move = CCMoveBy::create(1, CCPointMake(150,0));
//建立一個動畫序列,先播放移動動畫,再暫停2秒,而後再播放移動動畫。
CCFiniteTimeAction* action = CCSequence::create( move, CCDelayTime::create(2), move, NULL);
//男一行運行此動畫序列。
m_grossini->runAction(action);
}
std::string ActionDelayTime::subtitle()
{
return "DelayTime: m + delay + m";
}
//第十八種動畫演示表現的是動畫的重複播放。
class ActionRepeat : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
};
void ActionRepeat::onEnter()
{ //動畫演示的初始化
ActionsDemo::onEnter();
//兩位演員上場
alignSpritesLeft(2);
//建立一個移動動畫。
CCActionInterval* a1 = CCMoveBy::create(1, CCPointMake(150,0));
//建立一個循環3次的序列動畫。序列動畫先設置精靈位置在60,60,而後播放上面的移動動畫。
CCActionInterval* action1 = CCRepeat::create(
CCSequence::create( CCPlace::create(CCPointMake(60,60)), a1, NULL) ,
3);
//建立一個無限循環動畫。這個無限循環的動畫是一個動畫序列,先播放第一個移動動畫,再播放其反向動畫。
CCAction* action2 = CCRepeatForever::create(
(CCActionInterval*)(CCSequence::create((CCActionInterval*)(a1->copy()->autorelease()), a1->reverse(), NULL))
);
//女二號播放循環3次的序列動畫
m_kathia->runAction(action1);
//女一號播放無限循環動畫。
m_tamara->runAction(action2);
}
std::string ActionRepeat::subtitle()
{
return "Repeat / RepeatForever actions";
}
//第十九種動畫演示表現的是動畫的無限循環旋轉。
class ActionRepeatForever : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
void repeatForever(CCNode* pTarget);
};
void ActionRepeatForever::onEnter()
{ //動畫演示的初始化
ActionsDemo::onEnter();
//只須要男一號上場
centerSprites(1);
//建立一個動畫序列,先暫停1秒,而後調用
CCFiniteTimeAction* action = CCSequence::create(
CCDelayTime::create(1),
CCCallFuncN::create( this, callfuncN_selector(ActionRepeatForever::repeatForever) ),
NULL);
//男一號運行此動畫。
m_grossini->runAction(action);
}
//回調函數。
void ActionRepeatForever::repeatForever(CCNode* pSender)
{
//建立一個無限循環的旋轉動畫。
CCRepeatForever *repeat = CCRepeatForever::create( CCRotateBy::create(1.0f, 360) );
//讓男一號運行此無限循環動畫。
pSender->runAction(repeat);
}
std::string ActionRepeatForever::subtitle()
{
return "CallFuncN + RepeatForever";
}
//第二十種動畫演示表現的是動畫的無限循環旋轉到某個角度。
class ActionRotateToRepeat : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
};
void ActionRotateToRepeat::onEnter()
{ //動畫演示的初始化
ActionsDemo::onEnter();
//須要兩位演員
centerSprites(2);
//建立一個1秒內旋轉到90度的動畫
CCActionInterval* act1 = CCRotateTo::create(1, 90);
//建立一個1秒內旋轉到0度的動畫
CCActionInterval* act2 = CCRotateTo::create(1, 0);
//建立一個動畫序列,先運行動動畫1,再運行動畫2
CCActionInterval* seq = (CCActionInterval*)(CCSequence::create(act1, act2, NULL));
//建立一個無限循環播放動畫序列的動畫。
CCAction* rep1 = CCRepeatForever::create(seq);
//建立一個循環10次播放動畫序列的動畫。
CCActionInterval* rep2 = CCRepeat::create((CCFiniteTimeAction*)(seq->copy()->autorelease()), 10);
//兩位演員分別播放相應的循環動畫。
m_tamara->runAction(rep1);
m_kathia->runAction(rep2);
}
std::string ActionRotateToRepeat ::subtitle()
{
return "Repeat/RepeatForever + RotateTo";
}
//第二十一種動畫演示表現的是動畫的旋轉與反向旋轉。
class ActionRotateJerk : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
};
void ActionRotateJerk::onEnter()
{ //動畫演示的初始化
ActionsDemo::onEnter();
//須要兩位演員
centerSprites(2);
//建立一個動畫序列,先播放一個0.5秒旋轉到-20度的動畫,再播放一個0.5秒旋轉到20度的動畫。
CCFiniteTimeAction* seq = CCSequence::create(
CCRotateTo::create(0.5f, -20),
CCRotateTo::create(0.5f, 20),
NULL);
//建立一個循環播放10次上面的動畫序列的循環動畫。
CCActionInterval* rep1 = CCRepeat::create(seq, 10);
//建立一個無限循環播放上面的動畫序列的循環動畫。
CCAction* rep2 = CCRepeatForever::create( (CCActionInterval*)(seq->copy()->autorelease()) );
//兩位演員分別播放各自的循環動畫。
m_tamara->runAction(rep1);
m_kathia->runAction(rep2);
}
std::string ActionRotateJerk::subtitle()
{
return "RepeatForever / Repeat + Rotate";
}
//第二十二種動畫演示表現的是動畫過程當中的函數響應。
class ActionCallFunc : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
void callback1();
void callback2(CCNode* pTarget);
void callback3(CCNode* pTarget, void* data);
};
void ActionCallFunc::onEnter()
{ //動畫演示的初始化
ActionsDemo::onEnter();
//須要三位演員
centerSprites(3);
//建立一個動畫序列,先播放一個2秒橫向移動200的動畫,而後調用一個回調函數。
CCFiniteTimeAction* action = CCSequence::create(
CCMoveBy::create(2, CCPointMake(200,0)),
CCCallFunc::create(this, callfunc_selector(ActionCallFunc::callback1)),
NULL);
//建立一個動畫序列,先播放一個2秒放大2倍的動畫,再播放一個2秒的淡出動畫,以後調用一個回調函數。
CCFiniteTimeAction* action2 = CCSequence::create(
CCScaleBy::create(2 , 2),
CCFadeOut::create(2),
CCCallFuncN::create(this, callfuncN_selector(ActionSequence2::callback2)),
NULL);
//建立一個動畫序列,先播放一個3秒內旋轉360度的動畫,而後是一個2秒內淡出的動畫,以後調用一個回調函數。
CCFiniteTimeAction* action3 = CCSequence::create(
CCRotateBy::create(3 , 360),
CCFadeOut::create(2),
CCCallFuncND::create(this, callfuncND_selector(ActionSequence2::callback3), (void*)0xbebabeba),
NULL);
//三位演員分別演示相應的動畫。
m_grossini->runAction(action);
m_tamara->runAction(action2);
m_kathia->runAction(action3);
}
//第一個回調函數。
void ActionCallFunc::callback1()
{
CCSize s = CCDirector::sharedDirector()->getWinSize();
CCLabelTTF *label = CCLabelTTF::create("callback 1 called", "Marker Felt", 16);
label->setPosition(CCPointMake( s.width/4*1,s.height/2));
addChild(label);
}
//第二個回調函數。
void ActionCallFunc::callback2(CCNode* pSender)
{
CCSize s = CCDirector::sharedDirector()->getWinSize();
CCLabelTTF *label = CCLabelTTF::create("callback 2 called", "Marker Felt", 16);
label->setPosition(CCPointMake( s.width/4*2,s.height/2));
addChild(label);
}
//第三個回調函數。
void ActionCallFunc::callback3(CCNode* pTarget, void* data)
{
CCSize s = CCDirector::sharedDirector()->getWinSize();
CCLabelTTF *label = CCLabelTTF::create("callback 3 called", "Marker Felt", 16);
label->setPosition(CCPointMake( s.width/4*3,s.height/2));
addChild(label);
}
std::string ActionCallFunc::subtitle()
{
return "Callbacks: CallFunc and friends";
}
//第二十二種動畫演示表現的是動畫過程當中的帶參數的函數響應。
class ActionCallFuncND : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string title();
virtual std::string subtitle();
void removeFromParentAndCleanup(CCNode* pSender, void* data);
};
void ActionCallFuncND::onEnter()
{ //動畫演示的初始化
ActionsDemo::onEnter();
//只須要男演員上場。
centerSprites(1);
//建立一個動畫序列,首先播放一個2秒橫向移動200的動畫,而後調用一個回調函數,可帶一個參數true。
CCFiniteTimeAction* action = CCSequence::create(CCMoveBy::create(2.0f, ccp(200,0)),
CCCallFuncND::create(this, callfuncND_selector(ActionCallFuncND::removeFromParentAndCleanup), (void*)true),
NULL);
//男演員演示動畫
m_grossini->runAction(action);
}
std::string ActionCallFuncND::title()
{
return "CallFuncND + auto remove";
}
std::string ActionCallFuncND::subtitle()
{
return "CallFuncND + removeFromParentAndCleanup. Grossini dissapears in 2s";
}
//帶參數的回調函數。data在這裏爲true。
void ActionCallFuncND::removeFromParentAndCleanup(CCNode* pSender, void* data)
{
bool bCleanUp = data != NULL;
m_grossini->removeFromParentAndCleanup(bCleanUp);
}
//第二十三種動畫演示表現的是動畫的序列播放與反向序列播放。
class ActionReverseSequence : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
};
void ActionReverseSequence::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//只須要男演員上場。
alignSpritesLeft(1);
//建立一個移動動畫。
CCActionInterval* move1 = CCMoveBy::create(1, CCPointMake(250,0));
//建立第二個移動動畫。
CCActionInterval* move2 = CCMoveBy::create(1, CCPointMake(0,50));
//建立一個動畫序列,首先播放第一個移動動畫,再播放第二個移動動畫,最後播放第一個移動動畫的反向動畫。
CCFiniteTimeAction* seq = CCSequence::create( move1, move2, move1->reverse(), NULL);
//建立一個動畫序列,先播放第一個動畫序列,而後播放這個動畫序列的反向動畫序列。
CCFiniteTimeAction* action = CCSequence::create( seq, seq->reverse(), NULL);
//男演員演示這個動畫序列。
m_grossini->runAction(action);
}
std::string ActionReverseSequence::subtitle()
{
return "Reverse a sequence";
}
//第二十四種動畫演示表現的是動畫的序列播放與反向序列播放。
class ActionReverseSequence2 : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
};
void ActionReverseSequence2::onEnter()
{ //動畫演示的初始化
ActionsDemo::onEnter();
//須要兩位演員。
alignSpritesLeft(2);
//建立一個移動動畫。
CCActionInterval* move1 = CCMoveBy::create(1, CCPointMake(250,0));
//建立第二個移動動畫。
CCActionInterval* move2 = CCMoveBy::create(1, CCPointMake(0,50));
//建立兩個精靈顯示隱藏切換動畫。這個動畫會判斷精靈顯示狀態,若是顯示則切換爲隱藏,若是隱藏則切換爲顯示。
CCToggleVisibility* tog1 = new CCToggleVisibility();
CCToggleVisibility* tog2 = new CCToggleVisibility();
tog1->autorelease();
tog2->autorelease();
//建立動畫序列,先播第一個移動動畫,而後隱藏,而後播第二個移動動畫,而後顯示,再播第一個移動動畫的反向動畫。
CCFiniteTimeAction* seq = CCSequence::create( move1, tog1, move2, tog2, move1->reverse(), NULL);
//建立第二個動畫序列,先播放第一個動畫序列,再播放它的反向動畫序列。
CCActionInterval* action = CCRepeat::create((CCActionInterval*)(CCSequence::create( seq, seq->reverse(), NULL)), 3);
//女二號播放第二個動畫序列.
m_kathia->runAction(action);
//建立一個移動動畫。
CCActionInterval* move_tamara = CCMoveBy::create(1, CCPointMake(100,0));
//建立第二個移動動畫。
CCActionInterval* move_tamara2 = CCMoveBy::create(1, CCPointMake(50,0));
//建立一個隱藏動畫,這個動畫的過程當中精靈是處於隱藏狀態。
CCActionInstant* hide = new CCHide();
hide->autorelease();
//建立一個動畫序列,先運行第一個移動動畫,而後隱動畫,最後第二個移動動畫。
CCFiniteTimeAction* seq_tamara = CCSequence::create( move_tamara, hide, move_tamara2, NULL);
//建立動畫序列的反向動畫序列。
CCFiniteTimeAction* seq_back = seq_tamara->reverse();
//女一號運行一個動畫序列,這個動畫序列會先運行第一個動畫序列,而後再運行它的反向動畫序列。
m_tamara->runAction( CCSequence::create( seq_tamara, seq_back, NULL));
}
std::string ActionReverseSequence2::subtitle()
{
return "Reverse sequence 2";
}
//第二十五種動畫演示表現的是旋轉攝像機動畫,這時會用到攝像機球型運動算法,攝像機會處在一個以目標物爲球心的球體表面,其能夠在球體表面上繞橫向和縱向軸旋轉。
class ActionOrbit : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
};
void ActionOrbit::onEnter()
{ //動畫演示的初始化
ActionsDemo::onEnter();
//須要三位演員。
centerSprites(3);
//建立第一個旋轉攝像機動畫。
//建立的這個動畫爲2秒內在半徑爲1的球面上繞縱向軸轉180度。
CCActionInterval* orbit1 = CCOrbitCamera::create(2,1, 0, 0, 180, 0, 0);
//建立第一個動畫序列,先運行攝像機動畫,再運行它的反向動畫。
CCFiniteTimeAction* action1 = CCSequence::create(
orbit1,
orbit1->reverse(),
NULL);
//建立第二個旋轉攝像機動畫以及動畫序列。
//建立的這個動畫爲2秒內在半徑爲1的球面上,位置點在橫向軸旋轉-45度,而後動畫過程會沿以旋轉後的座標系在縱向軸轉180度。
CCActionInterval* orbit2 = CCOrbitCamera::create(2,1, 0, 0, 180, -45, 0);
CCFiniteTimeAction* action2 = CCSequence::create(
orbit2,
orbit2->reverse(),
NULL);
//建立第三個旋轉攝像機動畫及動畫序列。
//建立的這個動畫爲2秒內在半徑爲1的球面上,位置點在橫向軸旋轉90度,而後動畫過程會沿以旋轉後的座標系在縱向軸轉180度,注意,這時候在世界座標系中看,實際上是沿橫向軸轉180度~!
CCActionInterval* orbit3 = CCOrbitCamera::create(2,1, 0, 0, 180, 90, 0);
CCFiniteTimeAction* action3 = CCSequence::create(
orbit3,
orbit3->reverse(),
NULL);
//三位演員分別播放相應的無限循環動畫。 m_kathia->runAction(CCRepeatForever::create((CCActionInterval*)action1));
m_tamara->runAction(CCRepeatForever::create((CCActionInterval*)action2));
m_grossini->runAction(CCRepeatForever::create((CCActionInterval*)action3));
//建立一個移動動畫。
CCActionInterval* move = CCMoveBy::create(3, CCPointMake(100,-100));
//建立這個移動動畫的反向動畫。
CCActionInterval* move_back = move->reverse();
//將這兩個動畫放到一個動畫序列中。
CCFiniteTimeAction* seq = CCSequence::create(move, move_back, NULL);
//建立一個無限循環動畫,播放這個動畫序列。
CCAction* rfe = CCRepeatForever::create((CCActionInterval*)seq);
//三位演員要同時播放這個無限循環動畫。
m_kathia->runAction(rfe);
m_tamara->runAction((CCAction*)(rfe->copy()->autorelease()));
m_grossini->runAction((CCAction*)(rfe->copy()->autorelease()));
}
std::string ActionOrbit::subtitle()
{
return "OrbitCamera action";
}
//第二十六種動畫演示表現的是跟隨動畫。
class ActionFollow : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
};
void ActionFollow::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//只須要一位演員上場
centerSprites(1);
//取得可視區域的大小
CCSize s = CCDirector::sharedDirector()->getWinSize();
//男一號設置位置。
m_grossini->setPosition(CCPointMake(-200, s.height / 2));
//建立一個移動動畫。
CCActionInterval* move = CCMoveBy::create(2, CCPointMake(s.width * 3, 0));
//建立這個移動動畫的反向動畫。
CCActionInterval* move_back = move->reverse();
//建立一個動畫序列,先播放移動動畫,再播放其反向動畫。
CCFiniteTimeAction* seq = CCSequence::create(move, move_back, NULL);
//建立一個無限循環動畫,播放這個動畫序列。
CCAction* rep = CCRepeatForever::create((CCActionInterval*)seq);
//男一號演員這個無限循環動畫。
m_grossini->runAction(rep);
//當前層運行一個跟隨動畫,跟隨男一號,並設置其包圍區域。
this->runAction(CCFollow::create(m_grossini, CCRectMake(0, 0, s.width * 2 - 100, s.height)));
}
std::string ActionFollow::subtitle()
{
return "Follow action";
}
//第二十七種動畫演示表現的是控制目標動畫。
class ActionTargeted : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string title();
virtual std::string subtitle();
};
void ActionTargeted::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//須要兩位演員上場
centerSprites(2);
//先建立一個跳躍動畫。
CCJumpBy* jump1 = CCJumpBy::create(2,CCPointZero,100,3);
//再建立一個相同的跳躍動畫。
CCJumpBy* jump2 = (CCJumpBy*)jump1->copy()->autorelease();
//建立一個旋轉動畫。
CCRotateBy* rot1 = CCRotateBy::create(1, 360);
//再建立一個相同的旋轉動畫。
CCRotateBy* rot2 = (CCRotateBy*)rot1->copy()->autorelease();
//建立第一個控制目標動畫,讓女二號播放第二個跳躍動畫。
CCTargetedAction *t1 = CCTargetedAction::create(m_kathia, jump2);
//建立第二個控制目標動畫,讓女二號播放第二個旋轉動畫。
CCTargetedAction *t2 = CCTargetedAction::create(m_kathia, rot2);
//建立一個動畫序列,先播放一個第一個跳躍動畫,再播放第一個控制目標動畫,再播放第一個旋轉動畫,再播放第二個控制目標動畫。
CCSequence* seq = (CCSequence*)CCSequence::create(jump1, t1, rot1, t2, NULL);
//建立一個無限循環動畫,播放上面的動畫序列。
CCRepeatForever *always = CCRepeatForever::create(seq);
//女一號運行這個無限循環動畫。
m_tamara->runAction(always);
}
std::string ActionTargeted::title()
{
return "ActionTargeted";
}
std::string ActionTargeted::subtitle()
{
return "Action that runs on another target. Useful for sequences";
}
//第二十八種動畫演示表現的是1305號動畫。
class Issue1305 : public ActionsDemo
{
public:
virtual void onEnter();
virtual void onExit();
void log(CCNode* pSender);
void addSprite(float dt);
virtual std::string title();
virtual std::string subtitle();
private:
CCSprite* m_pSpriteTmp;
};
void Issue1305::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//空無一人
centerSprites(0);
//建立一個精靈
m_pSpriteTmp = CCSprite::create("Images/grossini.png");
//讓精靈運行一個回調函數打印一個日誌。注意:在這裏沒有讓精靈加入當前Layer,因此它不會真正的runAction,必須等它被掛在Layer下後才能被遍歷更新。
m_pSpriteTmp->runAction(CCCallFuncN::create(this, callfuncN_selector(Issue1305::log)));
//佔用精靈,故引用計數加一。
m_pSpriteTmp->retain();
//當前結點在2秒後調用回調函數增長一個精靈。
scheduleOnce(schedule_selector(Issue1305::addSprite), 2);
}
//精靈調用的回調函數。
void Issue1305::log(CCNode* pSender)
{
CCLog("This message SHALL ONLY appear when the sprite is added to the scene, NOT BEFORE");
}
void Issue1305::onExit()
{
m_pSpriteTmp->release();
ActionsDemo::onExit();
}
void Issue1305::addSprite(float dt)
{
//在這裏設置精靈的位置並將其加入到當前的Layer下。
m_pSpriteTmp->setPosition(ccp(250,250));
addChild(m_pSpriteTmp);
}
上面這個動畫運行後,等2秒建立出精靈,而後動做管理器才能執行精靈運行的函數打印日誌,輸出到Output窗口。
std::string Issue1305::title()
{
return "Issue 1305";
}
std::string Issue1305::subtitle()
{
return "In two seconds you should see a message on the console. NOT BEFORE.";
}
//第二十九種動畫演示表現的是1305號動畫二。
class Issue1305_2 : public ActionsDemo
{
public:
virtual void onEnter();
void log1();
void log2();
void log3();
void log4();
virtual std::string title();
virtual std::string subtitle();
};
void Issue1305_2::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//不須要演員上場
centerSprites(0);
//建立一個精靈.加載一個圖。
CCSprite *spr = CCSprite::create("Images/grossini.png");
//設置位置
spr->setPosition(ccp(200,200));
//加入當前Layer。
addChild(spr);
//建立一個移動動畫。
CCMoveBy* act1 = CCMoveBy::create(2 ,ccp(0, 100));
//建立一個回調函數。
CCCallFunc* act2 = CCCallFunc::create(this, callfunc_selector(Issue1305_2::log1)) ;
//建立第二個移動動畫。
CCMoveBy* act3 = CCMoveBy::create(2, ccp(0, -100));
//建立第二個回調函數。
CCCallFunc* act4 = CCCallFunc::create(this, callfunc_selector(Issue1305_2::log2)) ;
//建立第三個移動動畫。
CCMoveBy* act5 = CCMoveBy::create(2, ccp(100, -100));
//建立第三個回調函數。
CCCallFunc* act6 = CCCallFunc::create(this, callfunc_selector(Issue1305_2::log3)) ;
//建立第四個移動動畫。
CCMoveBy* act7 = CCMoveBy::create(2, ccp(-100, 0));
//建立第四個回調函數。
CCCallFunc* act8 = CCCallFunc::create(this, callfunc_selector(Issue1305_2::log4)) ;
//建立一個動畫序列,將前面的動畫都順序包含進來。
CCFiniteTimeAction* actF = CCSequence::create(act1, act2, act3, act4, act5, act6, act7, act8, NULL);
//經過動畫管理器來指定精靈播放動畫序列。 CCDirector::sharedDirector()->getActionManager()->addAction(actF ,spr, false);
}
void Issue1305_2::log1()
{
CCLog("1st block");
}
void Issue1305_2::log2()
{
CCLog("2nd block");
}
void Issue1305_2::log3()
{
CCLog("3rd block");
}
void Issue1305_2::log4()
{
CCLog("4th block");
}
std::string Issue1305_2::title()
{
return "Issue 1305 #2";
}
std::string Issue1305_2::subtitle()
{
return "See console. You should only see one message for each block";
}
//第三十種動畫演示表現的是1288號動畫。
class Issue1288 : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string title();
virtual std::string subtitle();
};
void Issue1288::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//不須要演員上場。
centerSprites(0);
//建立一個精靈,設置其位置並加入當前Layer。
CCSprite *spr = CCSprite::create("Images/grossini.png");
spr->setPosition(ccp(100, 100));
addChild(spr);
//建立兩個移動動畫。
CCMoveBy* act1 = CCMoveBy::create(0.5, ccp(100, 0));
CCMoveBy* act2 = (CCMoveBy*)act1->reverse();
//將兩個動畫放入一個新建立的動畫序列。
CCFiniteTimeAction* act3 = CCSequence::create(act1, act2, NULL);
//建立一個循環2次播放動畫序列的動畫。
CCRepeat* act4 = CCRepeat::create(act3, 2);
//讓精靈播放這個循環2次播放動畫序列的動畫。
spr->runAction(act4);
}
std::string Issue1288::title()
{
return "Issue 1288";
}
std::string Issue1288::subtitle()
{
return "Sprite should end at the position where it started.";
}
//第三十種動畫演示表現的是1288號動畫二。
class Issue1288_2 : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string title();
virtual std::string subtitle();
};
void Issue1288_2::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//不須要演員上場。
centerSprites(0);
//建立一個精靈,設置其位置並加入當前Layer。
CCSprite *spr = CCSprite::create("Images/grossini.png");
spr->setPosition(ccp(100, 100));
addChild(spr);
//建立一個移動動畫。
CCMoveBy* act1 = CCMoveBy::create(0.5, ccp(100, 0));
//建立一個循環播放1次上面的移動動畫,並讓精靈運行它。
spr->runAction(CCRepeat::create(act1, 1));
}
std::string Issue1288_2::title()
{
return "Issue 1288 #2";
}
std::string Issue1288_2::subtitle()
{
return "Sprite should move 100 pixels, and stay there";
}
//第三十一種動畫演示表現的是1327號動畫。
class Issue1327 : public ActionsDemo
{
public:
virtual void onEnter();
virtual std::string subtitle();
virtual std::string title();
void logSprRotation(CCNode* pSender);
};
void Issue1327::onEnter()
{
//動畫演示的初始化
ActionsDemo::onEnter();
//不須要演員上場。
centerSprites(0);
//建立一個精靈,設置其位置並加入當前Layer。
CCSprite *spr = CCSprite::create("Images/grossini.png");
spr->setPosition(ccp(100, 100));
addChild(spr);
//又是一堆回調函數和旋轉動畫。
CCCallFuncN* act1 = CCCallFuncN::create(this, callfuncN_selector(Issue1327::logSprRotation));
CCRotateBy* act2 = CCRotateBy::create(0.25, 45);
CCCallFuncN* act3 = CCCallFuncN::create(this, callfuncN_selector(Issue1327::logSprRotation));
CCRotateBy* act4 = CCRotateBy::create(0.25, 45);
CCCallFuncN* act5 = CCCallFuncN::create(this, callfuncN_selector(Issue1327::logSprRotation));
CCRotateBy* act6 = CCRotateBy::create(0.25, 45);
CCCallFuncN* act7 = CCCallFuncN::create(this, callfuncN_selector(Issue1327::logSprRotation));
CCRotateBy* act8 = CCRotateBy::create(0.25, 45);
CCCallFuncN* act9 = CCCallFuncN::create(this, callfuncN_selector(Issue1327::logSprRotation));
//建立一個動畫序列,將上面9個動畫順序放入。
CCFiniteTimeAction* actF = CCSequence::create(act1, act2, act3, act4, act5, act6, act7, act8, act9, NULL);
//精靈運行這個動畫序列。
spr->runAction(actF);
}
std::string Issue1327::title()
{
return "Issue 1327";
}
std::string Issue1327::subtitle()
{
return "See console: You should see: 0, 45, 90, 135, 180";
}
void Issue1327::logSprRotation(CCNode* pSender)
{
CCLog("%f", ((CCSprite*)pSender)->getRotation());
}
//第三十二種動畫演示表現的是由點構成的曲線動畫。
class ActionCatmullRom : public ActionsDemo
{
public:
~ActionCatmullRom();
virtual void onEnter();
virtual void draw();
virtual std::string subtitle();
virtual std::string title();
private:
CCPointArray *m_pArray1;
CCPointArray *m_pArray2;
};
void ActionCatmullRom::onEnter()
{ //動畫演示初始化
ActionsDemo::onEnter();
//2位演員上場
this->centerSprites(2);
//取得可視區域大小。
CCSize s = CCDirector::sharedDirector()->getWinSize();
//女一號設置位置。
m_tamara->setPosition(ccp(50, 50));
//建立一個位置點數組,初始化數組大小爲20.
CCPointArray *array = CCPointArray::create(20);
//放入一堆位置點。
array->addControlPoint(ccp(0, 0));
array->addControlPoint(ccp(80, 80));
array->addControlPoint(ccp(s.width - 80, 80));
array->addControlPoint(ccp(s.width - 80, s.height - 80));
array->addControlPoint(ccp(80, s.height - 80));
array->addControlPoint(ccp(80, 80));
array->addControlPoint(ccp(s.width / 2, s.height / 2));
//建立一個3秒鐘按點數組構成的曲線移動的動畫,位置點爲相對位置。
CCCatmullRomBy *action = CCCatmullRomBy::create(3, array);
//建立它的反向動畫。
CCFiniteTimeAction *reverse = action->reverse();
//建立一個動畫序列,將原動畫和反向動畫順序放入。
CCFiniteTimeAction *seq = CCSequence::create(action, reverse, NULL);
//女一號運行這個動畫序列。
m_tamara->runAction(seq);
//再建立一個位置點數組。
CCPointArray *array2 = CCPointArray::create(20);
//又放入一堆位置點。
array2->addControlPoint(ccp(s.width / 2, 30));
array2->addControlPoint(ccp(s.width -80, 30));
array2->addControlPoint(ccp(s.width - 80, s.height - 80));
array2->addControlPoint(ccp(s.width / 2, s.height - 80));
array2->addControlPoint(ccp(s.width / 2, 30));
//建立一個3秒鐘按點數組構成的曲線移動的動畫,位置點爲絕對位置。
CCCatmullRomTo *action2 = CCCatmullRomTo::create(3, array2);
//建立它的反向動畫。
CCFiniteTimeAction *reverse2 = action2->reverse();
//建立一個動畫序列,將原動畫和反向動畫順序放入。
CCFiniteTimeAction *seq2 = CCSequence::create(action2, reverse2, NULL);
//女二號運行這個動畫序列。
m_kathia->runAction(seq2);
//將兩個位置點數組的地址保存到成員指針變量,並對引用計數器加1防止被釋放掉。
m_pArray1 = array;
m_pArray1->retain();
m_pArray2 = array2;
m_pArray2->retain();
}
ActionCatmullRom::~ActionCatmullRom()
{
//當前演示層釋放時,一併釋放點數組。
m_pArray1->release();
m_pArray2->release();
}
void ActionCatmullRom::draw()
{
ActionsDemo::draw();
//繪製相對位置曲線
//先將當前OPENGL的矩陣狀態壓棧
kmGLPushMatrix();
//移動到50,50點的位置
kmGLTranslatef(50, 50, 0);
//以這個點爲原點繪製相對路徑
ccDrawCatmullRom(m_pArray1, 50);
//恢復矩陣狀態
kmGLPopMatrix();
//再繪製絕對位置的曲線
ccDrawCatmullRom(m_pArray2,50);
}
string ActionCatmullRom::title()
{
return "CatmullRomBy / CatmullRomTo";
}
string ActionCatmullRom::subtitle()
{
return "Catmull Rom spline paths. Testing reverse too";
}
//第三十三種動畫演示表現的是由點構成的貝塞爾曲線動畫。
class ActionCardinalSpline : public ActionsDemo
{
public:
~ActionCardinalSpline();
virtual void onEnter();
virtual void draw();
virtual std::string subtitle();
virtual std::string title();
private:
CCPointArray *m_pArray;
};
void ActionCardinalSpline::onEnter()
{
//動畫演示初始化
ActionsDemo::onEnter();
//2位演員上場
this->centerSprites(2);
//取得可視區域大小。
CCSize s = CCDirector::sharedDirector()->getWinSize();
//建立一個位置點數組,初始化數組大小爲20.
CCPointArray *array = CCPointArray::create(20);
//放入一堆位置點。
array->addControlPoint(ccp(0, 0));
array->addControlPoint(ccp(s.width/2-30, 0));
array->addControlPoint(ccp(s.width/2-30, s.height-80));
array->addControlPoint(ccp(0, s.height-80));
array->addControlPoint(ccp(0, 0));
//建立一個3秒鐘按點數組構成的貝塞爾曲線移動的動畫,位置點爲相對位置。
CCCardinalSplineBy *action = CCCardinalSplineBy::create(3, array, 0);
//建立它的反向動畫。
CCActionInterval *reverse = action->reverse();
//建立一個動畫序列,將原動畫和反向動畫順序放入。
CCFiniteTimeAction *seq = CCSequence::create(action, reverse, NULL);
//女一號設置位置並運行此曲線動畫。
m_tamara->setPosition(ccp(50, 50));
m_tamara->runAction(seq);
//建立一個3秒鐘按點數組構成的貝塞爾曲線移動的動畫,位置點爲相對位置。 CCCardinalSplineBy *action2 = CCCardinalSplineBy::create(3, array, 1);
//建立它的反向動畫。
CCActionInterval *reverse2 = action2->reverse();
//建立一個動畫序列,將原動畫和反向動畫順序放入。
CCFiniteTimeAction *seq2 = CCSequence::create(action2, reverse2, NULL);
//女二號設置位置並運行此曲線動畫。
m_kathia->setPosition(ccp(s.width/2, 50));
m_kathia->runAction(seq2);
//將位置點數組的地址保存到成員指針變量,並對引用計數器加1防止被釋放掉。
m_pArray = array;
array->retain();
}
ActionCardinalSpline::~ActionCardinalSpline()
{
m_pArray->release();
}
void ActionCardinalSpline::draw()
{
ActionsDemo::draw();
//繪製第一個相對位置曲線
//先將當前OPENGL的矩陣狀態壓棧
kmGLPushMatrix();
//移動到50,50點的位置
kmGLTranslatef(50, 50, 0);
//以這個點爲原點繪製相對路徑
ccDrawCardinalSpline(m_pArray, 0, 100);
//恢復矩陣狀態
kmGLPopMatrix();
CCSize s = CCDirector::sharedDirector()->getWinSize();
//繪製第二個相對位置曲線
//先將當前OPENGL的矩陣狀態壓棧
kmGLPushMatrix();
//移動到s.width/2, 50的位置
kmGLTranslatef(s.width/2, 50, 0);
//以這個點爲原點繪製相對路徑
ccDrawCardinalSpline(m_pArray, 1, 100);
//恢復矩陣狀態
kmGLPopMatrix();
}
string ActionCardinalSpline::title()
{
return "CardinalSplineBy / CardinalSplineAt";
}
string ActionCardinalSpline::subtitle()
{
return "Cardinal Spline paths. Testing different tensions for one array";
}
//第三十四種動畫演示表現的是控制暫停和恢復動畫。
class PauseResumeActions : public ActionsDemo
{
public:
PauseResumeActions();
virtual ~PauseResumeActions();
virtual void onEnter();
virtual std::string subtitle();
virtual std::string title();
void pause(float dt);
void resume(float dt);
private:
CCSet *m_pPausedTargets;
};
PauseResumeActions::PauseResumeActions()
: m_pPausedTargets(NULL)
{
}
PauseResumeActions::~PauseResumeActions()
{
CC_SAFE_RELEASE(m_pPausedTargets);
}
void PauseResumeActions::onEnter()
{ //動畫演示初始化
ActionsDemo::onEnter();
//兩位演員上場。
this->centerSprites(2);
//女一號運行一個無限循環的動畫。
m_tamara->runAction(CCRepeatForever::create(CCRotateBy::create(3, 360)));
//男一行運行一個反方向無限循環的動畫。 m_grossini->runAction(CCRepeatForever::create(CCRotateBy::create(3, -360)));
//女二號的動畫同女一號同樣。
m_kathia->runAction(CCRepeatForever::create(CCRotateBy::create(3, 360)));
//當前層在3秒後調用回調函數暫停。
this->schedule(schedule_selector(PauseResumeActions::pause), 3, false, 0);
//當前層在5秒後調用回調函數恢復。
this->schedule(schedule_selector(PauseResumeActions::resume), 5, false, 0);
}
string PauseResumeActions::title()
{
return "PauseResumeActions";
}
string PauseResumeActions::subtitle()
{
return "All actions pause at 3s and resume at 5s";
}
//暫停的回調函數,用於暫停動畫。
void PauseResumeActions::pause(float dt)
{
CCLog("Pausing");
//取得顯示設備
CCDirector *director = CCDirector::sharedDirector();
//若是原來有要暫停的目標容器,釋放暫停的目標容器
CC_SAFE_RELEASE(m_pPausedTargets);
//調用顯示設備的接口暫停全部的動畫並將這些動畫返回給容器
m_pPausedTargets = director->getActionManager()->pauseAllRunningActions();
//由於佔用它,因此對此引用計數器加1
CC_SAFE_RETAIN(m_pPausedTargets);
}
//恢復的回調函數,用於恢復暫停的動畫。
void PauseResumeActions::resume(float dt)
{
CCLog("Resuming");
//取得顯示設備
CCDirector *director = CCDirector::sharedDirector();
//調用顯示設備的接口恢復全部的暫停的動畫
director->getActionManager()->resumeTargets(m_pPausedTargets);
}
#endif
每個演示完畢!你們明白了麼?固然CPP裏還有一點東西還須要說一下。
#include "ActionsTest.h"
#include "../testResource.h"
#include "cocos2d.h"
//這裏定義三個全局函數,用於動畫演示控制
CCLayer* NextAction();//演示下一個動畫
CCLayer* BackAction();//演示上一個動畫
CCLayer* RestartAction();//從新演示當前動畫
//要演示的動畫索引
static int s_nActionIdx = -1;
//建立相應的動畫
CCLayer* CreateLayer(int nIndex)
{
//在頭文件裏咱們看到大量的動畫演示類,它們都是由CCLayer基類派生的。這裏定義一個CCLayer類用於指向下面建立的相應動畫演示實例。
CCLayer * pLayer = NULL;
//根據索引new出相應的動畫演示實例。
switch (nIndex)
{
case ACTION_MANUAL_LAYER:
pLayer = new ActionManual(); break;
case ACTION_MOVE_LAYER:
pLayer = new ActionMove(); break;
case ACTION_SCALE_LAYER:
pLayer = new ActionScale(); break;
case ACTION_ROTATE_LAYER:
pLayer = new ActionRotate(); break;
case ACTION_SKEW_LAYER:
pLayer = new ActionSkew(); break;
case ACTION_SKEWROTATE_LAYER:
pLayer = new ActionSkewRotateScale(); break;
case ACTION_JUMP_LAYER:
pLayer = new ActionJump(); break;
case ACTION_BEZIER_LAYER:
pLayer = new ActionBezier(); break;
case ACTION_BLINK_LAYER:
pLayer = new ActionBlink(); break;
case ACTION_FADE_LAYER:
pLayer = new ActionFade(); break;
case ACTION_TINT_LAYER:
pLayer = new ActionTint(); break;
case ACTION_ANIMATE_LAYER:
pLayer = new ActionAnimate(); break;
case ACTION_SEQUENCE_LAYER:
pLayer = new ActionSequence(); break;
case ACTION_SEQUENCE2_LAYER:
pLayer = new ActionSequence2(); break;
case ACTION_SPAWN_LAYER:
pLayer = new ActionSpawn(); break;
case ACTION_REVERSE:
pLayer = new ActionReverse(); break;
case ACTION_DELAYTIME_LAYER:
pLayer = new ActionDelayTime(); break;
case ACTION_REPEAT_LAYER:
pLayer = new ActionRepeat(); break;
case ACTION_REPEATEFOREVER_LAYER:
pLayer = new ActionRepeatForever(); break;
case ACTION_ROTATETOREPEATE_LAYER:
pLayer = new ActionRotateToRepeat(); break;
case ACTION_ROTATEJERK_LAYER:
pLayer = new ActionRotateJerk(); break;
case ACTION_CALLFUNC_LAYER:
pLayer = new ActionCallFunc(); break;
case ACTION_CALLFUNCND_LAYER:
pLayer = new ActionCallFuncND(); break;
case ACTION_REVERSESEQUENCE_LAYER:
pLayer = new ActionReverseSequence(); break;
case ACTION_REVERSESEQUENCE2_LAYER:
pLayer = new ActionReverseSequence2(); break;
case ACTION_ORBIT_LAYER:
pLayer = new ActionOrbit(); break;
case ACTION_FLLOW_LAYER:
pLayer = new ActionFollow(); break;
case ACTION_TARGETED_LAYER:
pLayer = new ActionTargeted(); break;
case ACTION_ISSUE1305_LAYER:
pLayer = new Issue1305(); break;
case ACTION_ISSUE1305_2_LAYER:
pLayer = new Issue1305_2(); break;
case ACTION_ISSUE1288_LAYER:
pLayer = new Issue1288(); break;
case ACTION_ISSUE1288_2_LAYER:
pLayer = new Issue1288_2(); break;
case ACTION_ISSUE1327_LAYER:
pLayer = new Issue1327(); break;
case ACTION_CARDINALSPLINE_LAYER:
pLayer = new ActionCardinalSpline(); break;
case ACTION_CATMULLROM_LAYER:
pLayer = new ActionCatmullRom(); break;
case PAUSERESUMEACTIONS_LAYER:
pLayer = new PauseResumeActions(); break;
default:
break;
}
return pLayer;
}
//演示下一個動畫的函數實現
CCLayer* NextAction()
{
++s_nActionIdx;
s_nActionIdx = s_nActionIdx % ACTION_LAYER_COUNT;
CCLayer* pLayer = CreateLayer(s_nActionIdx);
pLayer->autorelease();
return pLayer;
}
//演示上一個動畫的函數實現
CCLayer* BackAction()
{
--s_nActionIdx;
if( s_nActionIdx < 0 )
s_nActionIdx += ACTION_LAYER_COUNT;
CCLayer* pLayer = CreateLayer(s_nActionIdx);
pLayer->autorelease();
return pLayer;
}
//從新演示當前動畫的函數實現。
CCLayer* RestartAction()
{
CCLayer* pLayer = CreateLayer(s_nActionIdx);
pLayer->autorelease();
return pLayer;
}
三板斧,威力十足,若是還有什麼不懂的。那我真沒得好說了。下課!