原文: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函数

完整代码

MenuTest.h

 #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
MenuTest.cpp

 #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菜单的更多相关文章

  1. Deep Learning基础--机器翻译BLEU与Perplexity详解

    前言 近年来,在自然语言研究领域中,评测问题越来越受到广泛的重视,可以说,评测是整个自然语言领域最核心和关键的部分.而机器翻译评价对于机器翻译的研究和发展具有重要意义:机器翻译系统的开发者可以通过评测 ...

  2. Video Target Tracking Based on Online Learning—TLD单目标跟踪算法详解

    视频目标跟踪问题分析         视频跟踪技术的主要目的是从复杂多变的的背景环境中准确提取相关的目标特征,准确地识别出跟踪目标,并且对目标的位置和姿态等信息精确地定位,为后续目标物体行为分析提供足 ...

  3. cocos2d中的anchorPoint属性详解

    原文地址:http://www.tuicool.com/articles/ANVjMj 1> anchorPoint对position的影响 anchorPoint的作用就是相当于确定在子节点的 ...

  4. RFC2544学习频率“Learning Frequency”详解—信而泰网络测试仪实操

    在RFC2544中, 会有一个Learning Frequency的字段让我们选择, 其值有4个, 分别是learn once, learn Every Trial, Learn Every Fram ...

  5. Cocos2d-x win7 + vs2010 配置图文详解

    Cocos2d-x win7 + vs2010 配置图文详解 下载最新版的cocos2d-x.打开浏览器,输入cocos2d-x.org,然后选择Download,本教程写作时最新版本为cocos2d ...

  6. Cocos2d-x 3.X手游开发实例详解

    Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...

  7. [读书笔记]C#学习笔记八:StringBuilder与String详解及参数传递问题剖析

    前言 上次在公司开会时有同事分享windebug的知识, 拿的是string字符串Concat拼接 然后用while(true){}死循环的Demo来讲解.其中有提及string操作大量字符串效率低下 ...

  8. cocos2dx-3.x 导出自定义类到 lua 过程详解

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.简介 最近正在学习cocos2d中的lua游戏开发,因为lua开发的热更新特性,大家开发游戏好像都会优先选择lua作为 ...

  9. 各大公司广泛使用的在线学习算法FTRL详解

    各大公司广泛使用的在线学习算法FTRL详解 现在做在线学习和CTR常常会用到逻辑回归( Logistic Regression),而传统的批量(batch)算法无法有效地处理超大规模的数据集和在线数据 ...

随机推荐

  1. 初识Dubbo 系列之4-Dubbo 依赖

    依赖 必需依赖 JDK1.5+ 理论上Dubbo能够仅仅依赖JDK,不依赖于不论什么三方库执行,仅仅需配置使用JDK相关实现策略. 缺省依赖 通过mvn dependency:tree > de ...

  2. 浅谈C#中的泛型

    1.什么是泛型? 泛型是程序设计语言的一种特性.允许程序员在强类型程序设计语言中编写 代码时定义一些可变部分,那些部分在使用前必须作出指明.各种程序设计语言和其编译器.运行环境对泛型的支持均不一样.将 ...

  3. 模拟产生CBC LATCH与buffer busy wait等待事件

    数据库版本:11.2.0.4.0 1.查出表TEST相关信息 select rowid, dbms_rowid.rowid_row_number(rowid) rowid_rownum, dbms_r ...

  4. 使用 PyCrypto 进行 AES/ECB/PKCS#5(7) 加密

    东篱 使用 PyCrypto 进行 AES/ECB/PKCS#5(7) 加密 2013/06/05 · tech PyCrypto 是流行的 Python 加密/解密库.但是其 AES 的 ECB 模 ...

  5. android 多媒体数据库详解

    主要分为几节: 1. Android的媒体文件内部是如何存储的? 2. Andoid的媒体文件如何获取? 3. 在使用媒体文件的一些小技巧. 1. Android的多媒体如何存储的? Android的 ...

  6. 暂停和屏蔽右键网页中的Flash

    如何暂停网页中的Flash?原理很简单,就是屏蔽Flash的消息即可.屏蔽右键也可以通过此方法 直接贴代码吧,加了注释,很容易就能懂了 新建工程,加一个WebBrowser,再加两个按钮.Flash ...

  7. Android 特殊符号的转码大全

    项目中要在string.xml 中显示特殊符号,如@号冒号等,直接写肯定不行啦..只能考虑使用ASCII码进行显示: @号 @ :号 : 空格   以下为常见的ASCII十进制交换编码: --> ...

  8. Android代码混淆和项目宣布步骤记录器

    原本放在一起Android项目与发布的文件相混淆.我突然想到,为什么不写博客,分享.有这篇文章的情况下,. Android代码混淆及项目公布步骤记录 一.清理代码中的调试信息,如Log.System. ...

  9. Android studio ElasticDownloadView

    找到个开源项目,地址:https://github.com/Tibolte/ElasticDownload 下载进度效果: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkb ...

  10. All consistent reads within the same transaction read the snapshot established by the first read.

    Session 1: Session 2: mysql> show variables like '%tx_isolation%'; +---------------+------------- ...