~~~~我的生活,我的点点滴滴!!
先看看Menu的继承关系图 在来看MenuItem的继承关系图
前面说过,Menu就是一个cocos2dx为我们提供的定制的层,这样看来他们其实没有太多的交集,但是MenuItems(注意是带有s复数的)他们必须依赖于Menu然后在加载到layer上,不然他们不会响应触摸的,Menu已经帮我们处理好了,我们就开心的用嘛
Menu仅仅是一个MenuItems的集合,这些菜单项作为菜单的一部分,定义了各种按钮或标签。由于Menu包含所有的菜单项,所以它控制这些菜单项的对齐方式和位置。在默认情况下,所有的菜单项被放置在Menu的中心。 Menu包含如下特点:
1. 可以在运行时使用addChild,将MenuItem对象到Menu。
2. Menu只接受MenuItem对象作为children。
在cocos2d-x中创建一个菜单很容易
1.创建一个新的场景(继承自Scene)
2.创建一个MenuItem
MenuItem *pCloseItem = MenuItemImage::create("CloseNormal.png", "CloseSelected.png", CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));
加入到菜单
Menu* pMenu = Menu::create(pCloseItem, NULL);
加入到场景
this->ddChild(pMenu, 1);
对菜单对象增加一个回调方法
void HelloWorld::menuCloseCallback(Ref* pSender)
{
Director::getInstance()->end();
}
这就是所有的了,你可以在你的游戏中使用这个菜单了。
大家看到上面那个MenuItem继承图,他下面还有好多小弟了,下面我们来随便说说他们, 在cocos2dx中,我们有5中菜单项可以选择。它们分别是:MenuItemFont(字体菜单项)、MenuItemImage(图片菜单项)、MenuItemLabel(文本菜单项)、MenuItemSprite(精灵菜单项)、MenuItemToggle(开关菜单项)。下面我们就开始来学习他们的用法吧。
1.MenuItemFont(字体菜单项)
方法1:
MenuItemFont::create(选项文字,触发目标对象,触发目标函数);
方法2:
MenuItemFont::create(选项文字);
2.MenuItemImage(图片菜单项)
方法1:
MenuItemImage::create(默认显示的图片,点击时显示的图片,触发目标对象,触发目标函数);
3.MenuItemLabel(文本菜单项)
方法1:
MenuItemLabel::create(LableTTF对象,触发目标对象,触发目标函数);
4.MenuItemSprite(精灵菜单项)
方法1:
MenuItemSprite::create(默认显示的精灵对象,选中时显示的精灵对象,触发目标对象,触发目标函数);
5.MenuItemToggle(开关菜单项)
方法1:
MenuItemToggle::createWithTarget(触发目标对象,触发目标函数,MenuItem对象的可变参数列表);
//背景
auto bg = Sprite::create("background.png");
bg->setPosition(Point(visibleSize.width/2, visibleSize.height/2));
this->addChild(bg, 0);
//image
auto menuItem_1 = MenuItemImage::create("font1.png", "font2.png", CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
menuItem_1->setPosition(Point(visibleSize.width/2, visibleSize.height - 60));
//ttf
std::string ttfStr = "文本菜单";
GbkToUtf8(ttfStr, "GB2312", "UTF-8");
auto ttf_2 = LabelTTF::create(ttfStr.c_str(), "Helvetica", 24);
auto menuItem_2 = MenuItemLabel::create(ttf_2, CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
menuItem_2->setPosition(Point(visibleSize.width/2, visibleSize.height - 120));
//font
std::string fontStr = "文字菜单";
GbkToUtf8(fontStr, "GB2312", "UTF-8");
auto menuItem_3 = MenuItemFont::create(fontStr, CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));
menuItem_3->setPosition(Point(visibleSize.width/2, visibleSize.height - 180));
//toggle
std::string toggleStr_1 = "开";
GbkToUtf8(toggleStr_1, "GB2312", "UTF-8");
auto font_1 = MenuItemFont::create(toggleStr_1.c_str());
std::string toggleStr_2 = "关";
GbkToUtf8(toggleStr_2, "GB2312", "UTF-8");
auto font_2 = MenuItemFont::create(toggleStr_2.c_str());
auto menuItem_4 = MenuItemToggle::createWithCallback(CC_CALLBACK_1(HelloWorld::menuCloseCallback,this), font_1, font_2, NULL);
menuItem_4->setPosition(Point(visibleSize.width/2, visibleSize.height - 240));
//精灵的不创建了根Image的类似
auto menu = Menu::create(menuItem_1, menuItem_2, menuItem_3, menuItem_4, NULL);
menu->setPosition(Point::ZERO);
this->addChild(menu, 1);
效果图如下,不要在意那第一个的效果,我随便弄的一个图片