对于cocos2dx初学者来说,引擎内带的案例test是一个很有用、很值得琢磨的东西,里面基本包含了cocos2dx的所有用法。
运行后出现如下的窗口。那如何进入我们想要进入的模块场景呢?例如运行一开始则进入Camera3DTest 这个场景。
首先分析看看AppDelegate.cpp这个文件:
在bool AppDelegate::applicationDidFinishLaunching()函数中有下面语句:
auto scene = Scene::create();
auto layer = new (std::nothrow) TestController();
layer->autorelease();
layer->addConsoleAutoTest();
scene->addChild(layer);
director->runWithScene(scene);
生成TestController层,添加到自动释放池中,若未被其它节点引用则下一帧被释放(-1)。
添加到scene中,并运行此场景。
转到controller.cpp中,
先看看这个结构体
typedef struct _Controller{
const char *test_name;
std::function<TestScene*()> callback;
} Controller;
std::function<TestScene*()> callback,类似一个函数指针,是C++11新增的一个泛函数,类似这样
TestScene* callback()
{
do your something;
}
之后定义一个Controller g_aTestNames[],这样的结构数组,存储对应模块信息。
// add menu items for tests
TTFConfig ttfConfig("fonts/arial.ttf",24);
_itemMenu = Menu::create();
for (int i = 0; i < g_testCount; ++i)
{
auto label = Label::createWithTTF(ttfConfig,g_aTestNames[i].test_name);
auto menuItem = MenuItemLabel::create(label,CC_CALLBACK_1(TestController::menuCallback,this));
_itemMenu->addChild(menuItem,i + 10000);
menuItem->setPosition(VisibleRect::center().x,(VisibleRect::top().y - (i + 1) * LINE_SPACE));
}
就是定义了文本标签菜单,其回调函数CC_CALLBACK_1(TestController::menuCallback,this));
void TestController::menuCallback(Ref * sender)
{
Director::getInstance()->purgeCachedData();
auto menuItem = static_cast<MenuItem *>(sender);
int idx = menuItem->getLocalZOrder() - 10000;
auto scene = g_aTestNames[idx].callback();
if (scene)
{
scene->runThisTest();
scene->release();
}
}
其中的idx就是模块的id号,红色的那部分就是在前面介绍的std::function的函数。