【Cocos2d-x】开发实战-Cococs2d-x中的菜单

本篇博客讲解:
1.使用菜单
2.文本菜单
3.精灵菜单和图片菜单
4.开关菜单

使用菜单

Menu - 菜单
MenuItem - 菜单项

菜单分类实际上是按照菜单项分类的
菜单和菜单项的继承关系图:

文本菜单,精灵菜单,图片菜单和开关菜单其实准确来讲,应该是:
文本菜单项,精灵菜单项,图片菜单项和开关菜单项

继承MenuItemLabel的菜单其实都是文本菜单
精灵菜单:MenuItemSprite的子类是图片菜单MenuItemImage
开关菜单:MenuItemToggle

文本菜单

文本菜单是菜单项只是显示文本
文本菜单类包括了MenuItemLabel、MenuItemFont和MenuItemAtlasFont。MenuItemLabel是个抽象类,具体使用的时候是使用MenuItemFont和MenuItemAtlasFont两个类。
文本菜单类MenuItemFont,它的其中一个创建函数create定义如下:

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

cocos2d帮我们做了一个宏来帮助我们传递回调函数的参数,CC_CALLBACK_n,n为回调的参数个数

// new callbacks based on C++11
#define CC_CALLBACK_0(__selector__,__target__,...) std::bind(&__selector__,##__VA_ARGS__)
#define CC_CALLBACK_1(__selector__,std::placeholders::_1,##__VA_ARGS__)
#define CC_CALLBACK_2(__selector__,std::placeholders::_2,##__VA_ARGS__)
#define CC_CALLBACK_3(__selector__,std::placeholders::_3,##__VA_ARGS__)

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

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

实例:

bool HelloWorld::init()
{
if (!Layer::init())
{
return false;
}

Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();

Sprite *bg = Sprite::create("menu/background.png"); //背景图片精灵
bg->setPosition(Vec2(origin.x + visibleSize.width / 2,origin.y + visibleSize.height / 2));
this->addChild(bg);

MenuItemFont::setFontName("Times New Roman");//使用系统字体,设置系统字体的名字
MenuItemFont::setFontSize(86);//设置系统字体的大小
MenuItemFont *item1 = MenuItemFont::create("Start",CC_CALLBACK_1(HelloWorld::menuItem1Callback,this)); //创建基于系统字体的MenuItemFont


MenuItemAtlasFont *item2 = MenuItemAtlasFont::create("Help","menu/tuffy_bold_italic-charmap.png",48,65,' ',CC_CALLBACK_1(HelloWorld::menuItem2Callback,this));

Menu* mn = Menu::create(item1,item2,NULL);//把MenuItem放到Menu里,不能直接把MenuItem放到层里
mn->alignItemsVertically();//设置菜单位置,垂直对齐
this->addChild(mn);//把菜单放到层里

return true;
}


void HelloWorld::menuItem1Callback(Ref* pSender)
{
//实际上这里传进来的参数是MenuItem类型,所以在这里可以强转,也可以直接把形参类型写成MenuItem,不写成Ref
MenuItem* item = (MenuItem*)pSender;
//一般情况下,我们不需要这个参数,只有在需要一些特定的信息的情况下,我们才需要进行转换拿值
log("Touch Start Menu Item %p",item); //这个输出是输出指针的地址,没有意义,在这里只是掩饰回调函数起作用了!且对象传过来了
}

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

显示效果:

源代码下载地址:

GITHUB源码下载地址:点我进行下载

精灵菜单和图片菜单

精灵菜单项类MenuItemSprite

创建函数create定义:

static MenuItemSprite * create(Node* normalSprite,Node* selectedSprite,Node* disabledSprite = nullptr);  
static MenuItemSprite* create(Node* normalSprite,//菜单项正常显示时候的精灵
Node* selectedSprite,//选择菜单项时候的精灵
Node* disableSprite,//菜单项禁用时候的精灵
const ccMenuCallback& callback //菜单操作的回调函数指针
)  
static MenuItemSprite * create(Node* normalSprite,const ccMenuCallback& callback);

图片菜单项类MenuIemImage

创建函数create定义:

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

精灵菜单和图片菜单都有三种状态,也就是正常状态,选中状态,还有禁用状态。

实例

bool HelloWorld::init()
{
if ( !Layer::init() )
{
    return false;
}

Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();

Sprite *bg = Sprite::create("menu/background.png");

bg->setPosition(Vec2(origin.x + visibleSize.width/2,origin.y + visibleSize.height /2));
this->addChild(bg);

//开始精灵
Sprite *startSpriteNormal = Sprite::create("menu/start-up.png");
Sprite *startSpriteSelected = Sprite::create("menu/start-down.png");
//创建精灵菜单 添加精灵以及回调函数
MenuItemSprite *startMenuItem = MenuItemSprite::create(startSpriteNormal,startSpriteSelected,CC_CALLBACK_1(HelloWorld::menuItemStartCallback,this));
startMenuItem->setPosition(Director::getInstance()->convertToGL(Vec2(700,170)));
//指定坐标 convertToGL转换-将左上角为原点的UI坐标转换为OpenGL坐标,cocos2d默认坐标为OpenGL坐标
//700,170为UI坐标

// 设置 图片菜单 图片菜单的好处就是直接使用图片就好了
MenuItemImage *settingMenuItem = MenuItemImage::create(
                         "menu/setting-up.png","menu/setting-down.png",CC_CALLBACK_1(HelloWorld::menuItemSettingCallback,this)); 

settingMenuItem->setPosition(Director::getInstance()->convertToGL(Vec2(480,400))); 

// 帮助 图片菜单
MenuItemImage *helpMenuItem = MenuItemImage::create(
                         "menu/help-up.png","menu/help-down.png",CC_CALLBACK_1(HelloWorld::menuItemHelpCallback,this));    

helpMenuItem->setPosition(Director::getInstance()->convertToGL(Vec2(860,480)));
//在这里,精灵菜单和图片菜单没什么区别,视觉效果一样,也一样有回调函数

Menu* mu = Menu::create(startMenuItem,settingMenuItem,helpMenuItem,NULL);//指定菜单 NULL指定菜单列表的结束
mu->setPosition(Vec2::ZERO);//菜单处于坐标原点 - 因为菜单项已经都指定位置了
this->addChild(mu);

return true;
}

//回调函数
void HelloWorld::menuItemHelpCallback(Ref* pSender)
{
MenuItem* item = (MenuItem*)pSender;
log("Touch Help %p",item);
}

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

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

小提示:这里图片的UI坐标可以通过画图工具或者PhotoShop获得坐标

显示效果

源代码下载地址:

GITHUB源码下载地址: 点我进行下载

开关菜单MenulItemToggle

开关菜单有两种状态,这两种状态可以用任何的图片来替代(比如精灵-只要是菜单项就可以)
函数创建:(也是菜单项)

static MenulItemToggle* createWithCallback(
const ccMenuCallback& callback,//菜单操作的回调函数指针 - 状态切换时调用的函数,菜单的事件处理
MenuItem* item,//进行切换的菜单项 MenuItem的集合,将其他菜单项放在开关菜单中
...
)

简单形式的文本类型的开关菜单:

auto toggleMenuItem = MenuItemToggle::createWithCallback(
CC_CALLBACK_1(HelloWorld::menuItem1Callback,this),MenuItemFont::create("On"),MenuItemFont::create("Off"),NULL);//最后记得加NULL(Object-c中区分元素集合的结束),在开关菜单中,其实只能放两个子菜单项,多菜单项没意义,因为只是两个状态的切换 

Menu* mn=Menu::create(toggleMenuItem,NULL);//把菜单项放入菜单中
this->addChhild(mn);//把菜单放入层中

这里只是简单的文本菜单,当然也可以是精灵菜单,也可以是图片菜单…

实例

bool HelloWorld::init()
{

if (!Layer::init()){
return false;
}

Size visibleSize = Director::getInstance()->getVisibleSize();//大小
Vec2 origin = Director::getInstance()->getVisibleOrigin();//锚点 默认为0.5 0.5

//Sprite* bg = Sprite::create("menu/setting-back.png");
auto bg = Sprite::create("menu/setting-back.png");// auto-自动推断类型
bg->setPosition(Vec2(origin.x+visibleSize.width/2,origin.y+visibleSize.height/2));
this->addChild(bg);

//音效菜单项
auto soundOnMenuItem = MenuItemImage::create("menu/on.png","menu/on.png");//正常和按下是同一张图片 - 开
auto soundOffMenuItem = MenuItemImage::create("menu/off.png","menu/off.png");//关
//音效开关菜单项
auto soundToggleMenuItem = MenuItemToggle::createWithCallback(CC_CALLBACK_1(HelloWorld::menuSoundToggleCallback,//函数指针
    soundOnMenuItem,soundOffMenuItem,//菜单项集合
    NULL//集合结束
    );
//设置坐标 - UI坐标(原点为左上角)转换为OpenGL坐标(原点为左下角)
soundToggleMenuItem->setPosition(Director::getInstance()->convertToGL(Vec2(818,220)));

//音乐菜单项 
auto musicOnMenuItem = MenuItemImage::create(
    "menu/on.png","menu/on.png");
auto musicOffMenuItem = MenuItemImage::create(
    "menu/off.png","menu/off.png");
//音乐开关菜单项
auto musicToggleMenuItem = MenuItemToggle::createWithCallback(CC_CALLBACK_1(HelloWorld::menuMusicToggleCallback,musicOnMenuItem,musicOffMenuItem,NULL);
musicToggleMenuItem->setPosition(Director::getInstance()->convertToGL(Vec2(818,362)));

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

Menu* mn = Menu::create(soundToggleMenuItem,musicToggleMenuItem,okMenuItem,NULL);
mn->setPosition(Vec2::ZERO);
this->addChild(mn);

return true;
}


void HelloWorld::menuSoundToggleCallback(Ref* pSender)
{
log("menuSoundToggleCallback");
}


void HelloWorld::menuMusicToggleCallback(Ref* pSender)
{
log("menuMusicToggleCallback");
}

先是创建On和Off图片惨淡项->创建开关菜单->Menu
Menu 放入 Layer

显示效果

源代码下载地址:

GITHUB源码下载地址: 点我进行下载

本文章由[谙忆]编写, 所有权利保留。
欢迎转载,分享是进步的源泉。

转载请注明出处:http://chenhaoxiang.cn

本文源自人生之旅_谙忆的博客

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是