原文: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. [ACM] 九度OJ 1553 时钟

    时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:1733 解决:656 题目描写叙述: 如图,给定随意时刻,求时针和分针的夹角(劣弧所相应的角). 输入: 输入包括多组測试数据.每组測试数 ...

  2. android JSON数据格式 解析

    一.   JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧.  Json建构于两种结构:  最后再加一种格式在文章的最后显示出来非常少有的格式   ...

  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. 基础知识(10)- 部署应用程序和applet

    10.1 JAR文件  10.1.1 清单文件  10.1.2 可运行JAR文件  10.1.3 资源  10.1.4 密封 10.2 Java Web Start  10.2.1 沙箱  10.2. ...

  5. SilkTest Q&A 8

    Q72.如何在一个testplan中运行所有的testcase? A72. 1.打开testplan 2.点击Run/Run All Tests菜单,SilkTest开始执行testplan中所有的t ...

  6. SRM 624 Building Heights DivI 解读

    几乎相同的一标题.欲了解更多请参阅:http://community.topcoder.com/stat?c=problem_statement&pm=13211&rd=15857 思 ...

  7. Java经典面试题及详解

    Java基础方面:   1.作用域public,private,protected,以及不写时的区别 答:区别如下:  作用域           当前类       同一package       ...

  8. HDU 1007 近期点对

    分治法求近期点对 递归将点不断分成小组.计算最短距离.此时的最短距离不过两点都属两块的某一块(这里的切割点是mid点). 还须要考虑两点分属两块的情况. 这时对于选点则把范围缩小到了以mid为中心. ...

  9. liGDX life_cycle (生命周期)

    本文章翻译自libGDX官方wiki,,转载请注明出处:http://blog.csdn.net/kent_todo/article/details/37940489 libGDX官方网址:http: ...

  10. lucene4.4 索引的增删改查

    package com.lucene.test; import java.io.File; import java.io.FileReader; import java.io.IOException; ...