CCScene * pScene = CCScene::create();
CCLayer * pLayer = new TestController();
pLayer->autorelease();
pScene->addChild(pLayer);
pDirector->runWithScene(pScene);
首先创建一个场景和一个TestController层,把TestController层加入到场景中然后运行该场景
class TestController : public CCLayer
{
public:
TestController();
~TestController();
void menuCallback(CCObject * pSender);
void closeCallback(CCObject * pSender);
virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);
private:
CCPoint m_tBeginPos;
CCMenu* m_pItemMenu;
};
在这之前定义了一些枚举变量和一些字符串变量记录测试demo
enum
{
TEST_ACTIONS = 0,
TEST_TRANSITIONS,
TEST_PROGRESS_ACTIONS,
TEST_EFFECTS,
TEST_CLICK_AND_MOVE,
TEST_ROTATE_WORLD,
TEST_PARTICLE,
TEST_EASE_ACTIONS,
TEST_MOTION_STREAK,
TEST_DRAW_PRIMITIVES,
TEST_COCOSNODE,
}
const std::string g_aTestNames[TESTS_COUNT] = {
"ActionsTest",
"TransitionsTest",
"ActionsProgressTest",
"EffectsTest",
"ClickAndMoveTest",
"RotateWorldTest",
"ParticleTest",
"ActionsEaseTest",
"MotionStreakTest",
"DrawPrimitivesTest",
"NodeTest",
}
接着定义一些资源文件的相对目录名
static const char s_pPathGrossini[] = "Images/grossini.png";
static const char s_pPathSister1[] = "Images/grossinis_sister1.png";
static const char s_pPathSister2[] = "Images/grossinis_sister2.png";
static const char s_pPathB1[] = "Images/b1.png";
static const char s_pPathB2[] = "Images/b2.png";
接着来看TestController的构造函数
// add close menu
CCMenuItemImage *pCloseItem = CCMenuItemImage::create(s_pPathClose, s_pPathClose, this, menu_selector(TestController::closeCallback) );
CCMenu* pMenu =CCMenu::create(pCloseItem, NULL);
pMenu->setPosition( CCPointZero );
pCloseItem->setPosition(ccp( VisibleRect::right().x - 30, VisibleRect::top().y - 30));
addChild(pMenu, 1);
这里创建了一个关闭按钮的菜单,和一个回调函数TestController::closeCallback用来响应菜单点击事件
// add menu items for tests
m_pItemMenu = CCMenu::create();
for (int i = 0; i < TESTS_COUNT; ++i)
{
CCLabelTTF* label = CCLabelTTF::create(g_aTestNames[i].c_str(), "Arial", 24);
CCMenuItemLabel* pMenuItem = CCMenuItemLabel::create(label, this, menu_selector(TestController::menuCallback));
m_pItemMenu->addChild(pMenuItem, i + 10000);
pMenuItem->setPosition( ccp( VisibleRect::center().x, (VisibleRect::top().y - (i + 1) * LINE_SPACE) ));
}
m_pItemMenu->setContentSize(CCSizeMake(VisibleRect::getVisibleRect().size.width, (TESTS_COUNT + 1) * (LINE_SPACE)));
m_pItemMenu->setPosition(s_tCurPos);
addChild(m_pItemMenu);
这里创建测试项目的菜单文字并对每一个项目添加对应的响应函数TestController::menuCallback
setTouchEnabled(true); 这里设置允许触屏响应事件
关闭菜单的响应函数主要处理如下
CCDirector::sharedDirector()->end();
//get the userdata, its the index of the menu item clicked
CCMenuItem* pMenuItem = (CCMenuItem *)(pSender);
int nIdx = pMenuItem->getZOrder() - 10000;
// create the test scene and run it
TestScene* pScene = CreateTestScene(nIdx);
if (pScene)
{
pScene->runThisTest();
pScene->release();
}
获取对应菜单按钮的索引值,然后创建对应的场景数据并运行测试demo。
static TestScene* CreateTestScene(int nIdx)
{
CCDirector::sharedDirector()->purgeCachedData();
TestScene* pScene = NULL;
switch (nIdx)
{
case TEST_ACTIONS:
pScene = new ActionsTestScene(); break;
case TEST_TRANSITIONS:
pScene = new TransitionsTestScene(); break;
case TEST_PROGRESS_ACTIONS:
pScene = new ProgressActionsTestScene(); break;
case TEST_EFFECTS:
pScene = new EffectTestScene(); break;
default:
break;
}
return pScene;
}
根据给定的索引值创建场景,在此之前清空上一个场景的cache数据。
class ActionsTestScene : public TestScene
{
public:
virtual void runThisTest();
};
创建ActionsTestScene场景。
class TestScene : public CCScene
{
public:
TestScene(bool bPortrait = false);
virtual void onEnter();
virtual void runThisTest() = 0;
// The CallBack for back to the main menu scene
virtual void MainMenuCallback(CCObject* pSender);
};
测试场景的demo底层基类。
void TestScene::onEnter()
{
CCScene::onEnter();
//add the menu item for back to main menu
CCLabelTTF* label = CCLabelTTF::create("MainMenu", "Arial", 20);
CCMenuItemLabel* pMenuItem = CCMenuItemLabel::create(label, this, menu_selector(TestScene::MainMenuCallback));
CCMenu* pMenu =CCMenu::create(pMenuItem, NULL);
pMenu->setPosition( CCPointZero );
pMenuItem->setPosition( ccp( VisibleRect::right().x - 50, VisibleRect::bottom().y + 25) );
addChild(pMenu, 1);
}
在测试场景中创建菜单用于返回主场景。
void TestScene::MainMenuCallback(CCObject* pSender)
{
CCScene* pScene = CCScene::create();
CCLayer* pLayer = new TestController();
pLayer->autorelease();
pScene->addChild(pLayer);
CCDirector::sharedDirector()->replaceScene(pScene);
}
这里重新创建场景和TestController层,并用该场景替换之前的场景。
// 定义菜单回调的函数指针
typedef CCLayer* (*NEWTESTFUNC)();
-- className定义创建层的宏,返回静态CCLayer的指针
#define TESTLAYER_CREATE_FUNC(className) \
static CCLayer* create##className() \
{ return new className(); }
-- 创建className函数名
#define CF(className) create##className