2.4.2 菜单(Menu)

优质
小牛编辑
122浏览
2023-12-01

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

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

auto myMenu = Menu::create();

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

使用图像创建菜单:

// creating a menu with a single item

// create a menu item by specifying images
auto closeItem = MenuItemImage::create("CloseNormal.png", "CloseSelected.png",
CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));

auto menu = Menu::create(closeItem, NULL);
this->addChild(menu, 1);

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

// creating a Menu from a Vector of items
Vector<MenuItem*> MenuItems;

auto closeItem = MenuItemImage::create("CloseNormal.png", "CloseSelected.png",
CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));

MenuItems.pushBack(closeItem);

/* repeat for as many menu items as needed */

auto menu = Menu::createWithArray(MenuItems);
this->addChild(menu, 1);

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

使用 Lambda 表达式

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

一个简单的 lambda 表达式:

// create a simple Hello World lambda
auto func = [] () { cout << "Hello World"; };

// now call it someplace in code
func();

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

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