• 菜单(Menu)
    • 使用 Lambda 表达式

    菜单(Menu)

    菜单是什么,我们肯定都很熟悉了,在每个游戏中都会有菜单。我们使用菜单浏览游戏选项,更改游戏设置。菜单通常包含开始,退出,设置,关于等项,菜单当然也可以包含子菜单。在 Cocos2d-x 提供 Menu 对象支持菜单功能,Menu 对象是一种特殊的 Node 对象

    创建一个菜单用于添加菜单项:

    1. auto myMenu = Menu::create();

    像我们刚才提到的一个菜单,总会有一些菜单项,比如开始,退出,设置等,没有菜单项的菜单没有存在的意义。Cocos2d-x 提供了一些方法来创建菜单项,比如使用 Label 对象,或是使用一张图像。菜单项一般有正常状态和选择状态。菜单项显示时是正常状态,当你点击它时变为选择状态,同时点击菜单还会触发一个回调函数。

    使用图像创建菜单:

    1. // creating a menu with a single item
    2. // create a menu item by specifying images
    3. auto closeItem = MenuItemImage::create("CloseNormal.png", "CloseSelected.png",
    4. CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
    5. auto menu = Menu::create(closeItem, NULL);
    6. this->addChild(menu, 1);

    还可以使用 MenuItem 的一个 vector 创建菜单:

    1. // creating a Menu from a Vector of items
    2. Vector<MenuItem*> MenuItems;
    3. auto closeItem = MenuItemImage::create("CloseNormal.png", "CloseSelected.png",
    4. CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
    5. MenuItems.pushBack(closeItem);
    6. /* repeat for as many menu items as needed */
    7. auto menu = Menu::createWithArray(MenuItems);
    8. this->addChild(menu, 1);

    运行本文档的代码示例,你就能看到在 Chapter 6 有一个 Label 菜单项组成的菜单。

    菜单(Menu)  - 图1

    使用 Lambda 表达式

    我们知道,当您点击菜单项时会触发一个回调函数。C++ 11 支持了 lambda 表达式,lambda 表达式是 匿名函数,所以你可以在回调方法处,使用 lambda 表达式,这样能让代码看起来更简洁,同时不会有额外的性能开销。

    一个简单的 lambda 表达式:

    1. // create a simple Hello World lambda
    2. auto func = [] () { cout << "Hello World"; };
    3. // now call it someplace in code
    4. func();

    使用 lambda 表达式作为菜单项的回调函数:

    1. auto closeItem = MenuItemImage::create("CloseNormal.png", "CloseSelected.png",
    2. [&](Ref* sender){
    3. // your code here
    4. });