前言:
菜单中包含菜单项,菜单项类是 MenuItem ,每个菜单项都有三个基本状态:正常、选中和禁止。
(MenuItem)菜单分类:
- (文本菜单)MenuItemLabel : MenuItemAtlasFont, MenuItemFont
- (精灵菜单)MenuItemSprite : MenuItemImage
- (开关菜单)MenuItemToggle
文本菜单
文本菜单是 菜单项 只能显示文本,文本菜单类包括 MenuItemLabel、MenuItemFont 和 MenuItemAtlasFont。
MenuItemLabel 是个抽象类,具体使用的时候是使用 MenuItemFont, MenuItemAtlasFont。
MenuItemFont 其中的一个 创建函数 create 如下:
1 static MenuItemFont * create(const std::string& value, /// 要显示的文本 2 const ccMenuCallback& callback); /// 菜单操作的回调函数指针
MenuItemAltasFont 是基于 图片集 的文本菜单项,它的其中一个 创建函数 create 如下:
1 static MenuItemAtlasFont* create(const std::string& value, /// 要显示的文本 2 const std::string& charMapFile, /// 图片集文件 3 int itemWidth, /// 要截取的文字在图片中的 宽度 4 int itemHeight, /// 要截取的文字在图片中的 高度 5 char startCharMap, /// 开始字符 6 const ccMenuCallback& callback); /// 菜单操作的 回调函数 指针
文本菜单 代码示例:
1 MenuItemFont::setFontName("Times New Roman"); 2 MenuItemFont::setFontSize(86); 3 MenuItemFont* item1 = MenuItemFont::create("Start", 4 CC_CALLBACK_1(HelloWorld::menuItemCallback_start, this));///item1坐标没有显示设置,默认是mn的坐标 5 MenuItemAtlasFont* item2 = MenuItemAtlasFont::create("Help", 6 "menu/tuffy_bold_italic-charmap.png", 7 48, 8 65, 9 ‘ ‘, 10 CC_CALLBACK_1(HelloWorld::menuItemCallback_help, this)); 11 item2->setPosition(Point(500, 300)); 12 Menu* mn = Menu::create(item1, item2, NULL); 13 //mn->alignItemsVertically(); 14 ///mn->setAnchorPoint(ccp(0, 0)); // 设置锚点 没用 15 mn->setPosition(Point(200, 100)); 16 this->addChild(mn); /// 把菜单对象添加到 当前层 中 17 18 19 void HelloWorld::menuItemCallback_start(cocos2d::Ref* pSender) 20 { 21 MenuItem* item = (MenuItem*)pSender; 22 log("Touch Start Menu item %p", item); 23 } 24 25 void HelloWorld::menuItemCallback_help(cocos2d::Ref* pSender) 26 { 27 MenuItem* item = (MenuItem*)pSender; 28 log("Touch Help Menu item %p", item); 29 }
精灵菜单和图片菜单
精灵菜单的 菜单项类是 MenuItemSprite
图片菜单的 菜单项类是 MenuItemImage
由于 MenuItemImage 继承于 MenuItemSprite,所以图片菜单也属于精灵菜单。
精灵菜单类 MenuItemSprite,它的其中一个创建函数 create 定义如下:
1 static MenuItemSprite * create(Node* normalSprite, /// 菜单项正常显示时的精灵 2 Node* selectedSprite, /// 选择菜单项时的 精灵 3 Node* disabledSprite, /// 菜单项 禁用时的 精灵.MenuItemSprite有一些create函数,disabledSprite参数可省略. 4 const ccMenuCallback& callback); /// 菜单操作的 回调函数 指针
图片菜单类 MenuItemImage,它的其中一个创建函数 create 定义如下:
1 static MenuItemImage* create(const std::string&normalImage, /// 菜单项 正常显示时的 图片 2 const std::string&selectedImage, /// 选择 菜单项 时的图片 3 const std::string&disabledImage, /// 菜单项 禁用 时的图片. 4 const ccMenuCallback& callback); /// 菜单操作的 回调函数 指针
精灵菜单和图片菜单 代码示例:
1 /// "开始" 精灵菜单项 2 Sprite* startSpNormal = Sprite::create("menu/start-up.png"); 3 Sprite* startSpSelected = Sprite::create("menu/start-down.png"); 4 MenuItemSprite* startMenuItem = MenuItemSprite::create(startSpNormal, 5 startSpSelected, 6 CC_CALLBACK_1(HelloWorld::menuItemCallback_start2, this)); 7 startMenuItem->setPosition(Director::getInstance()->convertToGL(Point(700, 170))); 8 9 // "设置" 图片菜单项 10 MenuItemImage* settingMenuItem = MenuItemImage::create("menu/setting-up.png", 11 "menu/setting-down.png", 12 CC_CALLBACK_1(HelloWorld::menuItemCallback_setting2, this)); 13 settingMenuItem->setPosition(Director::getInstance()->convertToGL(Point(480, 400))); 14 15 16 // "帮助" 图片菜单项 17 MenuItemImage* helpMenuItem = MenuItemImage::create("menu/help-up.png", 18 "menu/help-down.png", 19 CC_CALLBACK_1(HelloWorld::menuItemCallback_help2, this)); 20 helpMenuItem->setPosition(Director::getInstance()->convertToGL(Point(860, 480))); 21 22 Menu* mu2 = Menu::create(startMenuItem, settingMenuItem, helpMenuItem, NULL); 23 mu2->setPosition(Point(-200,-100)); 24 this->addChild(mu2);
1 void HelloWorld::menuItemCallback_start2(cocos2d::Ref* pSender) //// 定义若干回调函数 2 { 3 MenuItem* item = (MenuItem*)pSender; 4 log("Touch menuItemCallback_start2 %p", item); 5 } 6 7 void HelloWorld::menuItemCallback_setting2(cocos2d::Ref* pSender) 8 { 9 MenuItem* item = (MenuItem*)pSender; 10 log("Touch menuItemCallback_setting2 %p", item); 11 } 12 13 void HelloWorld::menuItemCallback_help2(cocos2d::Ref* pSender) 14 { 15 MenuItem* item = (MenuItem*)pSender; 16 log("Touch menuItemCallback_help2 %p", item); 17 }
注意:
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,它是一种可以进行两种(或两种以上)状态切换的菜单项。
它可通过下面的函数创建:
1 static MenuItemToggle* createWithCallback( 2 const ccMenuCallback& callback, ///菜单操作的 回调函数 指针 3 MenuItem* item, /// 进行切换的 菜单项 4 ... 5 ) CC_REQUIRES_NULL_TERMINATION; /// 这个函数的参数需要以 NULL 结尾
从第2个参数开始,都是MenuItem类的实例对象,它们是开关菜单显示的菜单项,它们可以是文本、图片、和精灵类型的菜单项。
下面代码是简单形式的 文本类型 的 开关菜单项
1 auto toggleMenuItem = MenuItemToggle::createWithCallback( 2 CC_CALLBACK_1(HelloWorld::menuItemCallback_help, this), 3 MenuItemFont::create("On"), 4 MenuItemFont::create("Off"), 5 NULL);
图片类型的开关菜单项
1 // 音效.... 此处没有粘贴回调函数的代码。回调函数的代码,可以参考上面介绍的回调函数。 2 auto soundOnMenuItem = MenuItemImage::create("menu3/on.png", "menu3/on.png"); 3 auto soundOffMenuItem = MenuItemImage::create("menu3/off.png", "menu3/off.png"); 4 auto soundToggleMenuItem = MenuItemToggle::createWithCallback( 5 CC_CALLBACK_1(HelloWorld::menuSoundToggleCallback, this), 6 soundOnMenuItem, 7 soundOffMenuItem, 8 NULL); 9 soundToggleMenuItem->setPosition(Director::getInstance()->convertToGL(Point(818, 220))); 10 11 // 音乐 12 auto musicOnMenuItem = MenuItemImage::create("menu3/on.png", "menu3/on.png"); 13 auto musicOffMenuItem = MenuItemImage::create("menu3/off.png", "menu3/off.png"); 14 auto musicOnMenuItem2 = MenuItemImage::create("menu3/on2.png", "menu3/on2.png"); 15 auto musicOffMenuItem2 = MenuItemImage::create("menu3/off2.png", "menu3/off2.png"); 16 17 auto musicToggleMenuItem = MenuItemToggle::createWithCallback( 18 CC_CALLBACK_1(HelloWorld::menuMusicToggleCallback, this), 19 musicOnMenuItem, 20 musicOffMenuItem, 21 musicOnMenuItem2, ///我故意多插入了几项。加载不同的图片,你就能看到效果了。 22 musicOffMenuItem2, 23 NULL); 24 musicToggleMenuItem->setPosition(Director::getInstance()->convertToGL(Point(816, 362))); 25 26 // OK 按钮 27 auto okMenuItem = MenuItemImage::create( 28 "menu3/ok-down.png", 29 "menu3/ok-up.png"); 30 okMenuItem->setPosition(Director::getInstance()->convertToGL(Point(600, 510))); 31 32 Menu* mn3 = Menu::create(soundToggleMenuItem, musicToggleMenuItem, okMenuItem, NULL); 33 /// 菜单设置在了(0,0),但是 它的菜单项,在setposition的时候,是相对于此处的 mu3设置的 34 mn3->setPosition(Point::ZERO); 35 this->addChild(mn3, 3);