~~~~我的生活,我的点点滴滴!!
先看看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);
效果图如下,不要在意那第一个的效果,我随便弄的一个图片