Learning Cocos2d-x for WP8(5)——详解Menu菜单
原文:Learning Cocos2d-x for WP8(5)——详解Menu菜单
C#(wp7)兄弟篇Learning Cocos2d-x for XNA(5)——详解Menu菜单
菜单是游戏必不可少的元素,菜单的实现,无非就是文字或者图片。
CCLabel元素更多的时候是实现说明的作用,用于导航性的菜单,更多时候是用CCMenu。
主要的几个Menu相关的元素的继承关系。


工程文件:MenuTest.h和MenuTest.cpp
CCMenuItemFont
核心语句
//CCMenuItemFont
CCMenuItemFont::setFontName("American Typewriter");//字体纹理
CCMenuItemFont::setFontSize();
CCMenuItemFont* menuItemFont1=CCMenuItemFont::itemFromString("START");
CCMenuItemFont* menuItemFont2=CCMenuItemFont::itemFromString("QUIT"); CCMenu* menu1=CCMenu::menuWithItems(menuItemFont1,menuItemFont2,NULL);
menu1->alignItemsVertically();//菜单垂直排列
menu1->setPosition(,);
this->addChild(menu1);
注意menuWithItems(菜单项列表)中参数最后为“NULL”,这是个技术要求,欠缺会编译错误。

CCMenuItemSprite
添加三张图片至核心语句Assets文件夹下



核心语句
//CCMenuItemSprite
CCSprite* pSpriteNormal1=CCSprite::spriteWithFile("btn-about-normal.png");
CCSprite* pSpriteSelected1=CCSprite::spriteWithFile("btn-about-selected.png");
CCMenuItemSprite* menuItemSprite1=CCMenuItemSprite::itemFromNormalSprite(pSpriteNormal1,pSpriteSelected1,this,menu_selector(MenuTestLayer::btnAboutMenuCallback2));
char imgMenuSprite[]="MenuSpritePlay.png";
CCSprite* pSpriteNormal2=CCSprite::spriteWithFile(imgMenuSprite,CCRectMake(,,,));
CCSprite* pSpriteSelected2=CCSprite::spriteWithFile(imgMenuSprite,CCRectMake(,,,));
CCMenuItemSprite* menuItemSprite2=CCMenuItemSprite::itemFromNormalSprite(pSpriteNormal2,pSpriteSelected2,this,menu_selector(MenuTestLayer::btnPlayMenuCallback2)); CCMenu* menu2=CCMenu::menuWithItems(menuItemSprite1,menuItemSprite2,NULL);
menu2->alignItemsHorizontally();//菜单水平排列
menu2->setPosition(,);
this->addChild(menu2);
Normal状态:未点击菜单按钮时呈现的状态。
Selected状态:当点中菜单时选择的状态
注意第二种的实现方法,两个按钮在同一张图片中,显示一个按钮。
CCRectMake()起到决定性作用,四个参数为x、y、width、high。
x,y为图片从左上角为(0,0)起始坐标点的二维坐标,width为截取的图片的宽度,high为高度。

此获取一张图片下的部分图片方法,会在游戏中经常用到。

CCMenuItemImage
CCMenuItemImage与CCMenuItemSprite的实现方法差不多。
核心代码
//CCMenuItemImage
CCMenuItemFont* title3=CCMenuItemFont::itemFromString("MenuItemImageTitle");//标题
title3->setIsEnabled(false);
CCMenuItemImage* pMenuItemImage1=CCMenuItemImage::itemFromNormalImage("btn-about-normal.png","btn-about-selected.png",this,menu_selector(MenuTestLayer::btnAboutMenuCallback3)); CCMenu* menu3=CCMenu::menuWithItems(title3,pMenuItemImage1,NULL);
menu3->alignItemsVertically();//菜单垂直排列
menu3->setPosition(,);
this->addChild(menu3);

CCMenuItemToggle
开关按钮,有时候,这种按钮的实现会使用户体验更好
添加两张图片至Assets文件夹


常规的Toggle是文字,但也可用图片,点击切换哦。
核心代码
//CCMenuItemToggle
CCMenuItemFont::setFontName("American Typewriter");
CCMenuItemFont::setFontSize();
CCMenuItemFont* titleSound = CCMenuItemFont::itemFromString("Sound");
titleSound->setIsEnabled(false);
CCMenuItemToggle* menuItemToggle1=CCMenuItemToggle::itemWithTarget(this,
menu_selector(MenuTestLayer::menuItemToggle1Callback),
CCMenuItemFont::itemFromString("On"),
CCMenuItemFont::itemFromString("Off"),
NULL);
//图片Toggle
CCMenuItemFont* titleBackground = CCMenuItemFont::itemFromString("Background");
titleBackground->setIsEnabled(false);
CCMenuItemToggle* menuItemToggle2=CCMenuItemToggle::itemWithTarget(this,
menu_selector(MenuTestLayer::menuItemToggle2Callback),
CCMenuItemSprite::itemFromNormalSprite(CCSprite::spriteWithFile("bg_Sea1Mini.png"),CCSprite::spriteWithFile("bg_Sea1Mini.png")),
CCMenuItemSprite::itemFromNormalSprite(CCSprite::spriteWithFile("bg_Sea2Mini.jpg"),CCSprite::spriteWithFile("bg_Sea2Mini.jpg")),
NULL); CCMenu* menu4=CCMenu::menuWithItems(titleSound,menuItemToggle1,titleBackground,menuItemToggle2,NULL);
menu4->alignItemsInColumns(,,NULL);
menu4->setPosition(,);
this->addChild(menu4);


CCLabelBMFont显示中文菜单
注意将.cpp源文件“高级保存选项”编码为“Unicode(UTF-8无签名)-代码页65001”
核心代码
//CCLabelBMFont显示中文菜单(注意“高级保存选项”编码为“Unicode(UTF-8无签名)-代码页65001”)
CCLabelBMFont* pLabelBMFFont1=CCLabelBMFont::labelWithString("国强", "fonts/YaHeiChinese.fnt", CCTextAlignmentRight, );
CCMenuItemLabel* menuItemLabel1=CCMenuItemLabel::itemWithLabel(pLabelBMFFont1,this,menu_selector(MenuTestLayer::menuItemLabel1Callback)); CCLabelBMFont* pLabelBMFFont2=CCLabelBMFont::labelWithString("菜单","fonts/YaHeiChinese.fnt");
CCMenuItemLabel* menuItemLabel2=CCMenuItemLabel::itemWithLabel(pLabelBMFFont2,this,menu_selector(MenuTestLayer::menuItemLabel2Callback)); CCMenu* menu5=CCMenu::menuWithItems(menuItemLabel1,menuItemLabel2,NULL);
menu5->alignItemsVertically();
menu5->setPosition(,);
this->addChild(menu5);

其他部分代码为菜单点击事件Callbac函数
完整代码
#ifndef _MENU_TEST_H_
#define _MENU_TEST_H_ #include "cocos2d.h" using namespace cocos2d; class MenuTestScene:public CCScene
{
public:
MenuTestScene();
~MenuTestScene();
virtual void onEnter();
}; class MenuTestLayer:public CCLayer
{
public: MenuTestLayer();
~MenuTestLayer(); public:
//CCMenuItemSprite
void btnAboutMenuCallback2(CCObject* pSender);
void btnPlayMenuCallback2(CCObject* pSender); //CCMenuItemImage
void btnAboutMenuCallback3(CCObject* pSender); //menuItemToggle1
void menuItemToggle1Callback(CCObject* pSender);
void menuItemToggle2Callback(CCObject* pSender); //CCMenuItemLabel
void menuItemLabel1Callback(CCObject* pSender);
void menuItemLabel2Callback(CCObject* pSender);
}; #endif
#include "pch.h"
#include "Classes\MenuTest.h" //---------------------------------------
//
//MenuTsetLayer
//
//---------------------------------------
MenuTestLayer::MenuTestLayer()
{
//CCMenuItemFont
CCMenuItemFont::setFontName("American Typewriter");//字体纹理
CCMenuItemFont::setFontSize();
CCMenuItemFont* menuItemFont1=CCMenuItemFont::itemFromString("START");
CCMenuItemFont* menuItemFont2=CCMenuItemFont::itemFromString("QUIT"); CCMenu* menu1=CCMenu::menuWithItems(menuItemFont1,menuItemFont2,NULL);
menu1->alignItemsVertically();//菜单垂直排列
menu1->setPosition(,);
this->addChild(menu1); //CCMenuItemSprite
CCSprite* pSpriteNormal1=CCSprite::spriteWithFile("btn-about-normal.png");
CCSprite* pSpriteSelected1=CCSprite::spriteWithFile("btn-about-selected.png");
CCMenuItemSprite* menuItemSprite1=CCMenuItemSprite::itemFromNormalSprite(pSpriteNormal1,pSpriteSelected1,this,menu_selector(MenuTestLayer::btnAboutMenuCallback2));
char imgMenuSprite[]="MenuSpritePlay.png";
CCSprite* pSpriteNormal2=CCSprite::spriteWithFile(imgMenuSprite,CCRectMake(,,,));
CCSprite* pSpriteSelected2=CCSprite::spriteWithFile(imgMenuSprite,CCRectMake(,,,));
CCMenuItemSprite* menuItemSprite2=CCMenuItemSprite::itemFromNormalSprite(pSpriteNormal2,pSpriteSelected2,this,menu_selector(MenuTestLayer::btnPlayMenuCallback2)); CCMenu* menu2=CCMenu::menuWithItems(menuItemSprite1,menuItemSprite2,NULL);
menu2->alignItemsHorizontally();//菜单水平排列
menu2->setPosition(,);
this->addChild(menu2); //CCMenuItemImage
CCMenuItemFont* title3=CCMenuItemFont::itemFromString("MenuItemImageTitle");//标题
title3->setIsEnabled(false);
CCMenuItemImage* pMenuItemImage1=CCMenuItemImage::itemFromNormalImage("btn-about-normal.png","btn-about-selected.png",this,menu_selector(MenuTestLayer::btnAboutMenuCallback3)); CCMenu* menu3=CCMenu::menuWithItems(title3,pMenuItemImage1,NULL);
menu3->alignItemsVertically();//菜单垂直排列
menu3->setPosition(,);
this->addChild(menu3); //CCMenuItemToggle
CCMenuItemFont::setFontName("American Typewriter");
CCMenuItemFont::setFontSize();
CCMenuItemFont* titleSound = CCMenuItemFont::itemFromString("Sound");
titleSound->setIsEnabled(false);
CCMenuItemToggle* menuItemToggle1=CCMenuItemToggle::itemWithTarget(this,
menu_selector(MenuTestLayer::menuItemToggle1Callback),
CCMenuItemFont::itemFromString("On"),
CCMenuItemFont::itemFromString("Off"),
NULL);
//图片Toggle
CCMenuItemFont* titleBackground = CCMenuItemFont::itemFromString("Background");
titleBackground->setIsEnabled(false);
CCMenuItemToggle* menuItemToggle2=CCMenuItemToggle::itemWithTarget(this,
menu_selector(MenuTestLayer::menuItemToggle2Callback),
CCMenuItemSprite::itemFromNormalSprite(CCSprite::spriteWithFile("bg_Sea1Mini.png"),CCSprite::spriteWithFile("bg_Sea1Mini.png")),
CCMenuItemSprite::itemFromNormalSprite(CCSprite::spriteWithFile("bg_Sea2Mini.jpg"),CCSprite::spriteWithFile("bg_Sea2Mini.jpg")),
NULL); CCMenu* menu4=CCMenu::menuWithItems(titleSound,menuItemToggle1,titleBackground,menuItemToggle2,NULL);
menu4->alignItemsInColumns(,,NULL);
menu4->setPosition(,);
this->addChild(menu4); //CCLabelBMFont显示中文菜单(注意“高级保存选项”编码为“Unicode(UTF-8无签名)-代码页65001”)
CCLabelBMFont* pLabelBMFFont1=CCLabelBMFont::labelWithString("国强", "fonts/YaHeiChinese.fnt", CCTextAlignmentRight, );
CCMenuItemLabel* menuItemLabel1=CCMenuItemLabel::itemWithLabel(pLabelBMFFont1,this,menu_selector(MenuTestLayer::menuItemLabel1Callback)); CCLabelBMFont* pLabelBMFFont2=CCLabelBMFont::labelWithString("菜单","fonts/YaHeiChinese.fnt");
CCMenuItemLabel* menuItemLabel2=CCMenuItemLabel::itemWithLabel(pLabelBMFFont2,this,menu_selector(MenuTestLayer::menuItemLabel2Callback)); CCMenu* menu5=CCMenu::menuWithItems(menuItemLabel1,menuItemLabel2,NULL);
menu5->alignItemsVertically();
menu5->setPosition(,);
this->addChild(menu5);
} MenuTestLayer::~MenuTestLayer()
{} //CCMenuItemSprite
void MenuTestLayer::btnAboutMenuCallback2(CCObject* sender)
{} void MenuTestLayer::btnPlayMenuCallback2(CCObject* sender)
{} //CCMenuItemImage
void MenuTestLayer::btnAboutMenuCallback3(CCObject* sender)
{} //CCMenuItemToggle
void MenuTestLayer::menuItemToggle1Callback(CCObject* sender)
{} void MenuTestLayer::menuItemToggle2Callback(CCObject* sender)
{} //CCMenuItemLabel
void MenuTestLayer::menuItemLabel1Callback(CCObject* sender)
{} void MenuTestLayer::menuItemLabel2Callback(CCObject* sender)
{} //---------------------------------------
//
//MenuTestScene
//
//---------------------------------------
MenuTestScene::MenuTestScene()
{} MenuTestScene::~MenuTestScene()
{} void MenuTestScene::onEnter()
{
CCScene::onEnter();
CCLayer* pMenuTestLayer=new MenuTestLayer();
this->addChild(pMenuTestLayer);
pMenuTestLayer->release();
}
完整代码运行效果

著作权声明:本文由http://www.cnblogs.com/suguoqiang 原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!
Learning Cocos2d-x for WP8(5)——详解Menu菜单的更多相关文章
- Deep Learning基础--机器翻译BLEU与Perplexity详解
前言 近年来,在自然语言研究领域中,评测问题越来越受到广泛的重视,可以说,评测是整个自然语言领域最核心和关键的部分.而机器翻译评价对于机器翻译的研究和发展具有重要意义:机器翻译系统的开发者可以通过评测 ...
- Video Target Tracking Based on Online Learning—TLD单目标跟踪算法详解
视频目标跟踪问题分析 视频跟踪技术的主要目的是从复杂多变的的背景环境中准确提取相关的目标特征,准确地识别出跟踪目标,并且对目标的位置和姿态等信息精确地定位,为后续目标物体行为分析提供足 ...
- cocos2d中的anchorPoint属性详解
原文地址:http://www.tuicool.com/articles/ANVjMj 1> anchorPoint对position的影响 anchorPoint的作用就是相当于确定在子节点的 ...
- RFC2544学习频率“Learning Frequency”详解—信而泰网络测试仪实操
在RFC2544中, 会有一个Learning Frequency的字段让我们选择, 其值有4个, 分别是learn once, learn Every Trial, Learn Every Fram ...
- Cocos2d-x win7 + vs2010 配置图文详解
Cocos2d-x win7 + vs2010 配置图文详解 下载最新版的cocos2d-x.打开浏览器,输入cocos2d-x.org,然后选择Download,本教程写作时最新版本为cocos2d ...
- Cocos2d-x 3.X手游开发实例详解
Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...
- [读书笔记]C#学习笔记八:StringBuilder与String详解及参数传递问题剖析
前言 上次在公司开会时有同事分享windebug的知识, 拿的是string字符串Concat拼接 然后用while(true){}死循环的Demo来讲解.其中有提及string操作大量字符串效率低下 ...
- cocos2dx-3.x 导出自定义类到 lua 过程详解
转载请注明出处:http://www.cnblogs.com/Ray1024 一.简介 最近正在学习cocos2d中的lua游戏开发,因为lua开发的热更新特性,大家开发游戏好像都会优先选择lua作为 ...
- 各大公司广泛使用的在线学习算法FTRL详解
各大公司广泛使用的在线学习算法FTRL详解 现在做在线学习和CTR常常会用到逻辑回归( Logistic Regression),而传统的批量(batch)算法无法有效地处理超大规模的数据集和在线数据 ...
随机推荐
- 棋盘问题 简单搜索DFS
Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...
- delphi指针简单入门
delphi指针简单入门: 看一个指针用法的例子: 1 var 2 X, Y: Integer; // ...
- eval 捕获dbi错误
[root@dr-mysql01 ~]# cat t2.pl use DBI; my $dbUser='zabbix'; my $user="root"; my $passwd=& ...
- Mfc资源消息的响应机制
Mfc消息的响应机制 Mfc中有很多资源,如图标资源,菜单资源,工具栏资源等等:那么,资源是如何进行消息响应和消息映射的呢? 它们的流程是: 某种资源——对应的ID号——消息映射——响应函数的声明与实 ...
- [置顶] MyEclipse显示中文界面,在线安装教程
准备工作 1,装好MyEclipse软件 2,可以上网 3,在线安装地址:http://download.eclipse.org/technology/babel/update-site/R0.11. ...
- MP3文件的结构与编程
有一个朋友喜欢听MP3,为了获取MP3,写了一个程序,专门从一家音乐网站上搜索下载mp3,一下子下载了有上千首.这时朋友又犯愁了,这些MP3的歌曲名字都是使用1,2,3,4,..等数字命名,挑选起来十 ...
- c++ try throw catch
c++ try throw catch 这三者联合使用 , try { statement list; } catch( typeA arg ) { statement list; } catch( ...
- 全民Scheme(0):lat的定义
接下来我会写一写Scheme的学习笔记.嗯,Scheme是属于小众的语言,但合适用来教学的. 什么是lat,就是遍历list里的每一个S-expression,假设发现当中某个不是atom的,则返回f ...
- vs2008编译QT开源项目三国杀(五篇文章)
请参看 http://tieba.baidu.com/f?kz=1508964881 按照上面的网址教程,下载三国杀源码,swig工具,并下载最新的QT4.8.2 for vs2008.我本机已经安装 ...
- linux时间方面的设置
例如以下一段代码能够借鉴: static void _sleep_response_timeout(modbus_t *ctx) { #ifdef _WIN32 /* usleep doesn't e ...