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));
}
}