enum
{
ACTION_MANUAL_LAYER = 0,
ACTION_MOVE_LAYER,
ACTION_SCALE_LAYER,
ACTION_ROTATE_LAYER,
ACTION_SKEW_LAYER,
}
TESTLAYER_CREATE_FUNC(ActionManual);
TESTLAYER_CREATE_FUNC(ActionMove);
TESTLAYER_CREATE_FUNC(ActionRotate);
TESTLAYER_CREATE_FUNC(ActionScale);
static NEWTESTFUNC createFunctions[] = {
CF(ActionManual),
CF(ActionMove),
CF(ActionRotate),
CF(ActionScale),
CF(ActionSkew),
}
原型:typedef CCLayer* (*NEWTESTFUNC)();
#define CF(className) create##className
以上定義一些標識層的枚舉變量,創建測試層的函數宏,測試層函數創建的函數指針數組。
定義最大層數 #define MAX_LAYER (sizeof(createFunctions) / sizeof(createFunctions[0]))
class ActionsTestScene : public TestScene
{
public:
virtual void runThisTest();
};
class ActionsDemo : public CCLayer
{
protected:
-- 聲明瞭3個精靈對象
CCSprite* m_grossini;
CCSprite* m_tamara;
CCSprite* m_kathia;
public:
-- 繼承並重寫父類的onEnter和onExit函數
virtual void onEnter();
virtual void onExit();
-- 放置3個精靈的位置
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);
};
(createFunctions[sceneIdx])()這裏根據上面定義的函數指針數組中的函數指針調用相應的場景的創建函數
--分別顯示上一個,當前,下一個場景
static CCLayer* backAction()
{
sceneIdx--;
int total = MAX_LAYER;
if( sceneIdx < 0 )
sceneIdx += total;
CCLayer* pLayer = (createFunctions[sceneIdx])();
pLayer->init();
pLayer->autorelease();
return pLayer;
}
static CCLayer* restartAction()
{
CCLayer* pLayer = (createFunctions[sceneIdx])();
pLayer->init();
pLayer->autorelease();
return pLayer;
}
static CCLayer* nextAction()
{
sceneIdx++;
sceneIdx = sceneIdx % MAX_LAYER;
CCLayer* pLayer = (createFunctions[sceneIdx])();
pLayer->init();
pLayer->autorelease();
return pLayer;
}
-- 運行第一個場景層測試demo
void ActionsTestScene::runThisTest()
{
sceneIdx = -1;
addChild(nextAction());
-- 切換爲當前場景
CCDirector::sharedDirector()->replaceScene(this);
}
-- 進入動作demo測試層
void ActionsDemo::onEnter()
{
CCLayer::onEnter();
// 首先創建了三個精靈,並把他們加入到場景層中
m_grossini = CCSprite::create(s_pPathGrossini);
m_grossini->retain();
m_tamara = CCSprite::create(s_pPathSister1);
m_tamara->retain();
m_kathia = CCSprite::create(s_pPathSister2);
m_kathia->retain();
addChild(m_grossini, 1);
addChild(m_tamara, 2);
addChild(m_kathia, 3);
-- 計算並設置三個精靈的位置
m_grossini->setPosition(ccp(VisibleRect::center().x, VisibleRect::bottom().y+VisibleRect::getVisibleRect().size.height/3));
m_tamara->setPosition(ccp(VisibleRect::center().x, VisibleRect::bottom().y+VisibleRect::getVisibleRect().size.height*2/3));
m_kathia->setPosition(ccp(VisibleRect::center().x, VisibleRect::bottom().y+VisibleRect::getVisibleRect().size.height/2));
// 添加父標題和子標題的Label文字
std::string str = title();
const char * pTitle = str.c_str();
CCLabelTTF* label = CCLabelTTF::create(pTitle, "Arial", 32);
addChild(label, 1);
label->setPosition( ccp(VisibleRect::center().x, VisibleRect::top().y - 30) );
std::string strSubtitle = subtitle();
if( ! strSubtitle.empty() )
{
CCLabelTTF* l = CCLabelTTF::create(strSubtitle.c_str(), "Thonburi", 16);
addChild(l, 1);
l->setPosition( ccp(VisibleRect::center().x, VisibleRect::top().y - 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) );
-- 創建包含三個菜單項的菜單,設置他們的位置,然後把菜單加入到場景層中
CCMenu *menu = CCMenu::create(item1, item2, item3, NULL);
menu->setPosition(CCPointZero);
item1->setPosition(ccp(VisibleRect::center().x - item2->getContentSize().width*2, VisibleRect::bottom().y+item2->getContentSize().height/2));
item2->setPosition(ccp(VisibleRect::center().x, VisibleRect::bottom().y+item2->getContentSize().height/2));
item3->setPosition(ccp(VisibleRect::center().x + item2->getContentSize().width*2, VisibleRect::bottom().y+item2->getContentSize().height/2));
addChild(menu, 1);
}
void ActionsDemo::onExit()
{
-- 銷燬精靈對象
m_grossini->release();
m_tamara->release();
m_kathia->release();
CCLayer::onExit();
}
-- 所有的場景層都在ActionsTestScene場景下面
void ActionsDemo::backCallback(CCObject* pSender)
{
CCScene* s = new ActionsTestScene();
s->addChild( backAction() );
CCDirector::sharedDirector()->replaceScene(s);
s->release();
}
void ActionsDemo::restartCallback(CCObject* pSender)
{
CCScene* s = new ActionsTestScene();
s->addChild( restartAction() );
CCDirector::sharedDirector()->replaceScene(s);
s->release();
}
void ActionsDemo::nextCallback(CCObject* pSender)
{
CCScene* s = new ActionsTestScene();
s->addChild( nextAction() );
CCDirector::sharedDirector()->replaceScene(s);
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(ccp(s.width/2, s.height/2));
}
else if( numberOfSprites == 2 )
{
m_kathia->setPosition( ccp(s.width/3, s.height/2));
m_tamara->setPosition( ccp(2*s.width/3, s.height/2));
m_grossini->setVisible(false);
}
else if( numberOfSprites == 3 )
{
m_grossini->setPosition( ccp(s.width/2, s.height/2));
m_tamara->setPosition( ccp(s.width/4, s.height/2));
m_kathia->setPosition( ccp(3 * s.width/4, s.height/2));
}
}
-- 精靈偏左的位置,Y保證不同,X一致
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(ccp(60, s.height/2));
}
else if( numberOfSprites == 2 )
{
m_kathia->setPosition( ccp(60, s.height/3));
m_tamara->setPosition( ccp(60, 2*s.height/3));
m_grossini->setVisible( false );
}
else if( numberOfSprites == 3 )
{
m_grossini->setPosition( ccp(60, s.height/2));
m_tamara->setPosition( ccp(60, 2*s.height/3));
m_kathia->setPosition( ccp(60, s.height/3));
}
}