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)算法无法有效地处理超大规模的数据集和在线数据 ...
随机推荐
- UVA它11292 - Dragon of Loowater
Problem C: The Dragon of Loowater Once upon a time, in the Kingdom of Loowater, a minor nuisance tur ...
- linux(readhat) yum源安装
在安装測试环境的时候遇到了一个问题,/etc/yum/repos.d中不存在文件或目录,无法更新yum源. 解决方法: (一.配置网络yum源) 1.首先在/etc/yum/repos.d/文件夹下创 ...
- BootStrap - FileUpload美化样式
效果: 代码: <div class="panel panel-default" style="border: 1px solid #ffd800;"&g ...
- Eclipse Maven 插件地址
http://download.eclipse.org/technology/m2e/releases maven 插件安装地址
- php 控制页面跳转
<?php class UserAction extends Action{ public function index(){ echo "你好!"; $m=M('user' ...
- uva 10129
主要是求能否形成联通的欧拉回路 并查集+ 欧拉回路判断 一开始用dfs判断联通,死活A不出来,Wa了好多次………哭…… 并查集一次就AC了 感觉还是并查集代码好写一点, 因为dfs还要判断入口在哪里… ...
- cocos2d-x lua 内存回收
使用cocos2d-x lua架构,游戏中存在两种内存回收方式. 1.cocos2d-x 本身内存回收 PS:假设在lua在创建一个类,继承cocos2d-x的一个类A,则该A也遵循cocos2d-x ...
- 【deep learning学习笔记】注释yusugomori的LR代码 --- 模型测试
测试部分代码: void test_lr() { srand(0); double learning_rate = 0.1; double n_epochs = 500; int train_N = ...
- 多线程——实现Callable接口
前两篇博客(多线程--继承Thread类.多线程--实现Runnable接口 )介绍了java使用线程的两种方法.这篇博客继续介绍第三种方法--实现Callable接口. 先说一下Runnable和C ...
- 模拟new实例化对象。
使用new和字面量的的方法是两种主流创建对象的方法,两种最终都能达到同样的实例化的对象,本章主要围绕new关键字来实例化一个对象并且讲一个不使用new但是完全与new实例化对象相同的例子. 在使用ne ...