前言:

菜单中包含菜单项,菜单项类是 MenuItem ,每个菜单项都有三个基本状态:正常、选中和禁止。

(MenuItem)菜单分类:

  • (文本菜单)MenuItemLabel : MenuItemAtlasFont, MenuItemFont
  • (精灵菜单)MenuItemSprite : MenuItemImage
  • (开关菜单)MenuItemToggle

文本菜单

文本菜单是 菜单项 只能显示文本,文本菜单类包括 MenuItemLabel、MenuItemFont 和 MenuItemAtlasFont。

MenuItemLabel 是个抽象类,具体使用的时候是使用 MenuItemFont, MenuItemAtlasFont

MenuItemFont 其中的一个 创建函数 create 如下:

     static MenuItemFont * create(const std::string& value,   /// 要显示的文本
         const ccMenuCallback& callback);    /// 菜单操作的回调函数指针

MenuItemAltasFont 是基于 图片集 的文本菜单项,它的其中一个 创建函数 create 如下:

     static MenuItemAtlasFont* create(const std::string& value,  /// 要显示的文本
         const std::string& charMapFile,       /// 图片集文件
         int itemWidth,     /// 要截取的文字在图片中的 宽度
         int itemHeight,    /// 要截取的文字在图片中的 高度
         char startCharMap,    /// 开始字符
         const ccMenuCallback& callback);  /// 菜单操作的 回调函数 指针

文本菜单 代码示例:

 MenuItemFont::setFontName("Times New Roman");
 MenuItemFont::setFontSize();
 MenuItemFont* item1 = MenuItemFont::create("Start",
         CC_CALLBACK_1(HelloWorld::menuItemCallback_start, this));///item1坐标没有显示设置,默认是mn的坐标
 MenuItemAtlasFont* item2 = MenuItemAtlasFont::create("Help",
         "menu/tuffy_bold_italic-charmap.png",
         ,
         ,
         ' ',
         CC_CALLBACK_1(HelloWorld::menuItemCallback_help, this));
 item2->setPosition(Point(, ));
 Menu* mn = Menu::create(item1, item2, NULL);
 //mn->alignItemsVertically();
 ///mn->setAnchorPoint(ccp(0, 0)); // 设置锚点 没用
 mn->setPosition(Point(, ));
 this->addChild(mn); /// 把菜单对象添加到 当前层 中
     

 void HelloWorld::menuItemCallback_start(cocos2d::Ref* pSender)
 {
     MenuItem* item = (MenuItem*)pSender;
     log("Touch Start Menu item %p", item);
 }

 void HelloWorld::menuItemCallback_help(cocos2d::Ref* pSender)
 {
     MenuItem* item = (MenuItem*)pSender;
     log("Touch Help Menu item %p", item);
 }

精灵菜单和图片菜单

精灵菜单的 菜单项类是 MenuItemSprite

图片菜单的 菜单项类是 MenuItemImage

由于 MenuItemImage 继承于 MenuItemSprite,所以图片菜单也属于精灵菜单。

精灵菜单类 MenuItemSprite,它的其中一个创建函数 create 定义如下:

 static MenuItemSprite * create(Node* normalSprite, /// 菜单项正常显示时的精灵
     Node* selectedSprite,   /// 选择菜单项时的 精灵
     Node* disabledSprite,   /// 菜单项 禁用时的 精灵.MenuItemSprite有一些create函数,disabledSprite参数可省略.
     const ccMenuCallback& callback); /// 菜单操作的 回调函数 指针

图片菜单类 MenuItemImage,它的其中一个创建函数 create 定义如下:

 static MenuItemImage* create(const std::string&normalImage,  /// 菜单项 正常显示时的 图片
     const std::string&selectedImage,  /// 选择 菜单项 时的图片
     const std::string&disabledImage, /// 菜单项 禁用 时的图片.
     const ccMenuCallback& callback); /// 菜单操作的 回调函数 指针

精灵菜单和图片菜单 代码示例:

 /// "开始"  精灵菜单项
     Sprite* startSpNormal = Sprite::create("menu/start-up.png");
     Sprite* startSpSelected = Sprite::create("menu/start-down.png");
     MenuItemSprite* startMenuItem = MenuItemSprite::create(startSpNormal,
         startSpSelected,
         CC_CALLBACK_1(HelloWorld::menuItemCallback_start2, this));
    , )));

     // "设置" 图片菜单项
     MenuItemImage* settingMenuItem = MenuItemImage::create("menu/setting-up.png",
         "menu/setting-down.png",
         CC_CALLBACK_1(HelloWorld::menuItemCallback_setting2, this));
     settingMenuItem->setPosition(Director::getInstance()->convertToGL(Point(, )));

     // "帮助" 图片菜单项
     MenuItemImage* helpMenuItem = MenuItemImage::create("menu/help-up.png",
         "menu/help-down.png",
         CC_CALLBACK_1(HelloWorld::menuItemCallback_help2, this));
     helpMenuItem->setPosition(Director::getInstance()->convertToGL(Point(, )));

     Menu* mu2 = Menu::create(startMenuItem, settingMenuItem, helpMenuItem, NULL);
     ,-));
     this->addChild(mu2);
 void HelloWorld::menuItemCallback_start2(cocos2d::Ref* pSender)   ////  定义若干回调函数 
 {
     MenuItem* item = (MenuItem*)pSender;
     log("Touch menuItemCallback_start2 %p", item);
 }

 void HelloWorld::menuItemCallback_setting2(cocos2d::Ref* pSender)
 {
     MenuItem* item = (MenuItem*)pSender;
     log("Touch menuItemCallback_setting2 %p", item);
 }

 void HelloWorld::menuItemCallback_help2(cocos2d::Ref* pSender)
 {
     MenuItem* item = (MenuItem*)pSender;
     log("Touch menuItemCallback_help2 %p", item);
 }

注意:

1.掌握类的正确使用;

2.坐标转换

startMenuItem->setPosition(Director::getInstance()->convertToGL(Point(700, 170)));

UI坐标系 原点是 左上角,OpenGL坐标系原点是 左下角。

将UI坐标系中的(700, 170)坐标转换为OpenGL坐标系中的坐标就是(700, Height-170)。Height是屏幕高度。

3.相对坐标位置

mu2->setPosition(Point(X1, Y1));

startMenuItem->setPosition(Point(X2, Y2));

此处暂且忽略坐标系的不同。

mu2设置在 以左下角为原点,(X1, Y1)的坐标位置;

startMenuItem 设置在 以mu2坐标为原点,(X2, Y2)的坐标位置。

那么,startMenuItem相对于 左下角 的坐标位置,其实是(X2-X1, Y2-Y1)。

因为 startMenuItem 是 mu2菜单 的 菜单项,因此他们有这个 相对坐标关系。

开关菜单

开关菜单的 菜单项 是 MenuItemToggle,它是一种可以进行两种(或两种以上)状态切换的菜单项。

它可通过下面的函数创建:

 static MenuItemToggle* createWithCallback(
     const ccMenuCallback& callback, ///菜单操作的 回调函数 指针
     MenuItem* item,  /// 进行切换的 菜单项
     ...
     ) CC_REQUIRES_NULL_TERMINATION; /// 这个函数的参数需要以 NULL 结尾

从第2个参数开始,都是MenuItem类的实例对象,它们是开关菜单显示的菜单项,它们可以是文本、图片、和精灵类型的菜单项。

下面代码是简单形式的 文本类型开关菜单项 

 auto toggleMenuItem = MenuItemToggle::createWithCallback(
     CC_CALLBACK_1(HelloWorld::menuItemCallback_help, this),
     MenuItemFont::create("On"),
     MenuItemFont::create("Off"),
     NULL);

图片类型的开关菜单项

  // 音效.... 此处没有粘贴回调函数的代码。回调函数的代码,可以参考上面介绍的回调函数。
     auto soundOnMenuItem = MenuItemImage::create("menu3/on.png", "menu3/on.png");
     auto soundOffMenuItem = MenuItemImage::create("menu3/off.png", "menu3/off.png");
     auto soundToggleMenuItem = MenuItemToggle::createWithCallback(
         CC_CALLBACK_1(HelloWorld::menuSoundToggleCallback, this),
         soundOnMenuItem,
         soundOffMenuItem,
         NULL);
     soundToggleMenuItem->setPosition(Director::getInstance()->convertToGL(Point(, )));

     // 音乐
     auto musicOnMenuItem = MenuItemImage::create("menu3/on.png", "menu3/on.png");
     auto musicOffMenuItem = MenuItemImage::create("menu3/off.png", "menu3/off.png");
     auto musicOnMenuItem2 = MenuItemImage::create("menu3/on2.png", "menu3/on2.png");
     auto musicOffMenuItem2 = MenuItemImage::create("menu3/off2.png", "menu3/off2.png");

     auto musicToggleMenuItem = MenuItemToggle::createWithCallback(
         CC_CALLBACK_1(HelloWorld::menuMusicToggleCallback, this),
         musicOnMenuItem,
         musicOffMenuItem,
         musicOnMenuItem2, ///我故意多插入了几项。加载不同的图片,你就能看到效果了。
         musicOffMenuItem2,
         NULL);
     musicToggleMenuItem->setPosition(Director::getInstance()->convertToGL(Point(, )));

     // OK 按钮
     auto okMenuItem = MenuItemImage::create(
         "menu3/ok-down.png",
         "menu3/ok-up.png");
     okMenuItem->setPosition(Director::getInstance()->convertToGL(Point(, )));

     Menu* mn3 = Menu::create(soundToggleMenuItem, musicToggleMenuItem, okMenuItem, NULL);
     /// 菜单设置在了(0,0),但是 它的菜单项,在setposition的时候,是相对于此处的 mu3设置的
     mn3->setPosition(Point::ZERO);
     );

cocos2d-x实战 C++卷 学习笔记--第4章 使用菜单的更多相关文章

  1. cocos2d-x实战 C++卷 学习笔记--第4章 字符串 __String类

    前言: <cocos2d-x实战C++卷>学习笔记.(cocos2d-x 是3.0版本) 介绍 cocos2d-x 通用的字符串类  __String . 使用cocos2d::__Str ...

  2. cocos2d-x实战 C++卷 学习笔记--第7章 动作、特效(一)

    前言: 介绍cocos2d-x中的动作.特效. 动作: 动作(action)包括基本动作和基本动作的组合,这些基本动作有缩放.移动.旋转等,而且这些动作变化的速度也可以设定. 动作类是 Action. ...

  3. cocos2d-x实战 C++卷 学习笔记--第6章 场景与层

    前言: 一个场景(Scene)是由多个层(Layer)组成,而且层的个数要至少是1,不能为0. 场景切换 场景切换相关函数 1)void  runWithScene(Scene*  scene) 该函 ...

  4. cocos2d-x实战 C++卷 学习笔记--第4章 win32平台下中文乱码问题

    前言: 将GBK编码的字符串转为UTF-8编码.(通俗点说就是解决中文乱码问题) 简要介绍: 在Win32平台下通过 log 输出中文字符时,会出现中文乱码问题.同样的代码在 ios 和 Androi ...

  5. cocos2d-x实战 C++卷 学习笔记--第5章 精灵

    前言: 精灵类是Sprite类.它的子类有PhysicsSprite 和 Skin. PhysicsSprite 是物理引擎精灵类,而Skin是皮肤精灵类,用于骨骼动画. 创建Sprite精灵对象 创 ...

  6. cocos2d-x实战 C++卷 学习笔记--第4章 使用标签

    前言: 介绍cocos2d-x中 标签类. cocos2d-x中 标签类 主要有三种:LabelTTF, LabelAtlas, 和 LabelBMFont.此外,在Cocos2d-x 3.x之后推出 ...

  7. Docker技术入门与实战 第二版-学习笔记-10-Docker Machine 项目-2-driver

    1>使用的driver 1〉generic 使用带有SSH的现有VM/主机创建机器. 如果你使用的是机器不直接支持的provider,或者希望导入现有主机以允许Docker Machine进行管 ...

  8. Docker技术入门与实战 第二版-学习笔记-8-网络功能network-3-容器访问控制和自定义网桥

    1)容器访问控制 容器的访问控制,主要通过 Linux 上的 iptables防火墙来进行管理和实现. iptables是 Linux 上默认的防火墙软件,在大部分发行版中都自带. 容器访问外部网络 ...

  9. Spring实战第八章学习笔记————使用Spring Web Flow

    Spring实战第八章学习笔记----使用Spring Web Flow Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序. 其实我们可以使用任何WEB框架写流程化的应 ...

随机推荐

  1. 射频识别技术漫谈(15)——Mifare1的安全性及7字节序列号M1卡【worlsing笔记】

    Mifare1的安全性主要指卡中数据的安全性,要求卡中的数据不能被非法修改或窃听.数据的安全性主要使用加密技术来保证,加密技术有两个关键因素:加密算法和密钥.现代加密技术的一大特点是加密算法公开,如果 ...

  2. UVa123 - Searching Quickly

    题目地址:点击打开链接 C++代码: #include <iostream> #include <set> #include <map> #include < ...

  3. Linq使用之标准运算符方法

    #region linq的标准查询运算符(即lambda方式) 注:C#不支持标准查询运算符中带有整形参数(索引)的重载 // 1.标准查询运算符之筛选方法——where            //I ...

  4. thinkphp的目录结构

    ├─ThinkPHP.php 框架入口文件 ├─Common 框架公共文件 ├─Conf 框架配置文件 ├─Extend 框架扩展目录 ├─Lang 核心语言包目录 ├─Lib 核心类库目录 │ ├─ ...

  5. C#中让窗体自动靠边隐藏

    1: private void Yincangtimer_Tick(object sender, EventArgs e)//窗体隐藏事件 2: { 3: int a = Control.MouseP ...

  6. Clarkson不等式

  7. BZOJ 1927: [Sdoi2010]星际竞速 费用流

    1927: [Sdoi2010]星际竞速 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  8. 用JAVA写一个函数,功能例如以下: 随意给定一组数, 找出随意数相加之后的结果为35(随意设定)的情况

    用JAVA写一个函数.功能例如以下:随意给定一组数,比如{12,60,-8,99,15,35,17,18},找出随意数相加之后的结果为35(随意设定)的情况. 能够递归算法来解: package te ...

  9. 反射---Java高级开发必须懂的

        理解反射对学习Java框架有很大的帮助,如Spring框架的核心就是使用Java反射实现的,而且对做一些Java底层的操作会很有帮助.  一.Class类的使用         1.万事万物皆 ...

  10. 10个android开源项目

    http://www.51testing.com/?uid-116228-action-viewspace-itemid-244285 1.Android团队提供的示例项目 如果不是从学习Androi ...