cocos2d-x实战 C++卷 学习笔记--第4章 使用菜单
前言:
菜单中包含菜单项,菜单项类是 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章 使用菜单的更多相关文章
- cocos2d-x实战 C++卷 学习笔记--第4章 字符串 __String类
前言: <cocos2d-x实战C++卷>学习笔记.(cocos2d-x 是3.0版本) 介绍 cocos2d-x 通用的字符串类 __String . 使用cocos2d::__Str ...
- cocos2d-x实战 C++卷 学习笔记--第7章 动作、特效(一)
前言: 介绍cocos2d-x中的动作.特效. 动作: 动作(action)包括基本动作和基本动作的组合,这些基本动作有缩放.移动.旋转等,而且这些动作变化的速度也可以设定. 动作类是 Action. ...
- cocos2d-x实战 C++卷 学习笔记--第6章 场景与层
前言: 一个场景(Scene)是由多个层(Layer)组成,而且层的个数要至少是1,不能为0. 场景切换 场景切换相关函数 1)void runWithScene(Scene* scene) 该函 ...
- cocos2d-x实战 C++卷 学习笔记--第4章 win32平台下中文乱码问题
前言: 将GBK编码的字符串转为UTF-8编码.(通俗点说就是解决中文乱码问题) 简要介绍: 在Win32平台下通过 log 输出中文字符时,会出现中文乱码问题.同样的代码在 ios 和 Androi ...
- cocos2d-x实战 C++卷 学习笔记--第5章 精灵
前言: 精灵类是Sprite类.它的子类有PhysicsSprite 和 Skin. PhysicsSprite 是物理引擎精灵类,而Skin是皮肤精灵类,用于骨骼动画. 创建Sprite精灵对象 创 ...
- cocos2d-x实战 C++卷 学习笔记--第4章 使用标签
前言: 介绍cocos2d-x中 标签类. cocos2d-x中 标签类 主要有三种:LabelTTF, LabelAtlas, 和 LabelBMFont.此外,在Cocos2d-x 3.x之后推出 ...
- Docker技术入门与实战 第二版-学习笔记-10-Docker Machine 项目-2-driver
1>使用的driver 1〉generic 使用带有SSH的现有VM/主机创建机器. 如果你使用的是机器不直接支持的provider,或者希望导入现有主机以允许Docker Machine进行管 ...
- Docker技术入门与实战 第二版-学习笔记-8-网络功能network-3-容器访问控制和自定义网桥
1)容器访问控制 容器的访问控制,主要通过 Linux 上的 iptables防火墙来进行管理和实现. iptables是 Linux 上默认的防火墙软件,在大部分发行版中都自带. 容器访问外部网络 ...
- Spring实战第八章学习笔记————使用Spring Web Flow
Spring实战第八章学习笔记----使用Spring Web Flow Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序. 其实我们可以使用任何WEB框架写流程化的应 ...
随机推荐
- [Objective-c 基础 - 3.3] block数据类型
A.概念 1.block类似函数 (1)可以保存代码 (2)有返回值 (3)有形参 2.block的标志:^ // 没有参数和返回值的block void (^myblock)() = ^{ // ...
- shell 检测ip的合法性与检测网络掩码的合法性
有时我们需要检测IP输入的正确性与网络掩码的正确性,用shell脚本写的: #验证ip地址的正确性 check_ip_format() { echo $1 | grep "^[0-9]\{1 ...
- android 文件上传
1.java原生上传 拼接上传的字符串 2.HttpClient方式上传 1.导入httpClient jar(core.mime)包 2.设置FileBody.MultiPartEntity.发送请 ...
- 【转】C++对象内存分配问题
原文:http://blog.csdn.net/c504665913/article/details/7797859 如果一个人自称为程序高手,却对内存一无所知,那么我可以告诉你,他一定在吹牛.用C或 ...
- 关于【cocos2dx-3.0beta-制作flappybird】教程在3.2project中出现找不到CCMenuItem.h的解决方法
文章原文:http://blog.csdn.net/kantian_/article/details/36187141 作者升级源码.能够在3.1平台下执行. 我的是vs2013+cocos2dx-3 ...
- Cocos2d-x 3.x 资料整理
cocos2d-x-3.0rc0新project的分辨率设置和控制台输出信息 http://kome2000.blog.51cto.com/969562/1379704 Cocos2d-x 3. ...
- as。 对象和数组
---恢复内容开始--- http://w3help.org/zh-cn/causes/SJ9011 ---恢复内容结束--- http://zengrong.net/post/5.htm
- 为什么for不能有序遍历数组的所有元素?(Array的设计原理)
这个题目略微浅显,但却不易讲明白.如果我告诉你,我们不能以任何代码保证可以有序遍历出一个数组的所有元素,你肯定会反驳我,因为使用for明明就可以啊!但其实不是. 一.为什么FOR不能保证遍历所有? 代 ...
- [010]Try块和异常处理
Throw表达式和try块的定义如下: 1. throw 表达式,错误检测部分使用这种表达式来说明遇到了不可处理的错误.可以说,throw 引发了异常条件. 2. try 块,错误处理部分使用它来处理 ...
- 文件和目录之access函数
本篇博文内容摘自<UNIX环境高级编程>(第二版),仅作个人学习记录所用.关于本书可参考:http://www.apuebook.com/. 当用open函数打开一个文件时,内核以进程的有 ...