cocos2d-x实战 C++卷 学习笔记--第4章 使用菜单

前言:

菜单中包含菜单项,菜单项类是 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);
时间: 2024-10-11 18:24:21

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

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

前言: 一个场景(Scene)是由多个层(Layer)组成,而且层的个数要至少是1,不能为0. 场景切换 场景切换相关函数 1)void  runWithScene(Scene*  scene) 该函数可以运行场景.只能在启动第一个场景时调用该函数.如果已经有一个场景运行,则不能调用该函数. 2)void  replaceScene(Scene*  scene) 切换到下一个场景.用一个新的场景替换当前场景,当前场景被终端释放. 3)void  pushScene(Scene*  scene)

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

前言: 介绍cocos2d-x中的动作.特效. 动作: 动作(action)包括基本动作和基本动作的组合,这些基本动作有缩放.移动.旋转等,而且这些动作变化的速度也可以设定. 动作类是 Action.它的类图如下: Action有3个子类,FiniteTimeAction 是一种受时间限制的动作,Follow 是一种允许精灵跟随另一个精灵的动作,Speed是在一个动作运行时改变其运动速率. 瞬时动作: 瞬时动作就是不等待立即执行的动作,瞬时动作的基类是ActionInstant.瞬时动作 Act

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

前言: 精灵类是Sprite类.它的子类有PhysicsSprite 和 Skin. PhysicsSprite 是物理引擎精灵类,而Skin是皮肤精灵类,用于骨骼动画. 创建Sprite精灵对象 创建精灵对象有多种方式,常用的函数如下: 1)创建一个精灵对象,纹理等属性需要在创建后设置 static Sprite* create(); 2)指定图片创建精灵 static Sprite* create(const std::string& filename); 3)指定图片和裁剪的矩形区域来创建

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

前言: 介绍cocos2d-x中 标签类. cocos2d-x中 标签类 主要有三种:LabelTTF, LabelAtlas, 和 LabelBMFont.此外,在Cocos2d-x 3.x之后推出了 新的标签类 Label. LabelTTF 标签类 LabelTTF是使用系统中的字体,它是最简单的标签类. create 静态函数完整定义:(此处只介绍一种常用的 create 静态方法) 1 static LabelTTF * create(const std::string& string

第131讲:Hadoop集群管理工具均衡器Balancer 实战详解学习笔记

第131讲:Hadoop集群管理工具均衡器Balancer 实战详解学习笔记 为什么需要均衡器呢? 随着集群运行,具体hdfs各个数据存储节点上的block可能分布得越来越不均衡,会导致运行作业时降低mapreduce的本地性. 分布式计算中精髓性的一名话:数据不动代码动.降低本地性对性能的影响是致使的,而且不能充分利用集群的资源,因为导致任务计算会集中在部分datanode上,更易导致故障. balancer是hadoop的一个守护进程.会将block从忙的datanode移动到闲的datan

第130讲:Hadoop集群管理工具DataBlockScanner 实战详解学习笔记

第130讲:Hadoop集群管理工具DataBlockScanner 实战详解学习笔记 DataBlockScanner在datanode上运行的block扫描器,定期检测当前datanode节点上所有的block,从而在客户端读到有问题的块前及时检测和修复有问题的块. 它有所有维护的块的列表,通过对块的列表依次的扫描,查看是否有校验问题或错误问题,它还有截流机制. 什么叫截流机制?DataBlockScanner扫描时会消耗大量的磁盘带宽,如果占用磁盘带宽太大,会有性能问题.所以它会只占用一小

java JDK8 学习笔记——第16章 整合数据库

第十六章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API中的接口会有数据库厂商操作,称为JDBC驱动程序. 2.JDBC标准主要分为两个部分:JDBC应用程序开发者接口和JDBC驱动程序开发者接口.应用程序需要联机数据库,其相关API主要在java.sql和javax.sql两个包中. 3.应用程序使用JDBC联机数据库的通用语法: Connection conn = DriverManager.g

【算法导论】学习笔记——第6章 堆排序

堆这个数据结构应用非常广泛,数字图像处理的算法里也见过.似乎记得以前老师上课说需要用树结构实现堆排序,看了一下算法导论才明白其精髓.堆虽然是一棵树,但显然没必要非得用树结构实现堆排序.堆排序的性质很好,算法时间复杂度为O(nlgn). 1. 堆排序的简要说明.二叉堆可以分为两种形式:最大堆和最小堆.在最大堆中,最大堆性质是指除了根以外的所有结点i都要满足: A[PARENT(i)] >= A[i]:在最小堆中,最小堆性质是指除了根以外的所有结点i都要满足: A[PARENT(i)] <= A[

APUE学习笔记:第九章 进程关系

9.1 引言 本章将更详尽地说明进程组以及POSIX.1引入的会话的概念.还将介绍登陆shell(登录时所调用的)和所有从登陆shell启动的进程之间的关系. 9.1 终端登陆 系统管理员创建通常名为/etc/ttys的文件,其中每个终端设备都有一行,每一行说明设备名传递给getty程序的参数.当系统自举时,内核创建进程ID为1的进程,依旧是init进程.init进程使系统进入多用户状态.init进程读文件/etc/ttys,对每一个允许登陆的终端设备,init调用一次fork,所生成的子进程则