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)算法无法有效地处理超大规模的数据集和在线数据 ...
随机推荐
- 优化Java堆大小5温馨提示
总结:Java没有足够的堆大小可能会导致性能非常大的影响,这无疑将给予必要的程序,并不能带来麻烦.本文总结了影响Java居前五位的能力不足,并整齐地叠优化? 笔者Pierre有一个10高级系统架构师有 ...
- android 使用Scroller实现缓慢移动
在Launcher中的Workspace中实现了左右屏幕切换效果,里面就用到了Scroller记录滑动轨迹,实现一种缓慢地向左或向右移动的效果,这里我对这种效果进行总结: 我们先看一个例子:点击按钮时 ...
- 美国企业人事喜欢考的3道.Net经典笔试题
1..求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m 答: int Num = this.TextBox1.Text.ToString() ; int Sum = 0 ; ...
- underscore.js 源码
underscore.js 源码 underscore]JavaScript 中如何判断两个元素是否 "相同" Why underscore 最近开始看 underscore.js ...
- 【ASP.NET Web API教程】2.3.7 创建首页
原文:[ASP.NET Web API教程]2.3.7 创建首页 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. Part 7: Crea ...
- 《Windows核心编程》第一讲 对程序错误的处理
一个Windows函数通常都有一个有意义的返回值类型,它标志着这个函数的运行状态,即函数运行成功与否.windows常用的函数类型如下图: 从系统内部来讲,当一个Windows函数检测到一个错误时,它 ...
- Webserver管理系列:11、注意默认的隐含共享
安装完Windows Server 2008之后默认的c/d/e...磁盘是共享的. 我们能够通过取消"Microsoft网络的文件和打印机共享"服务来阻止别人訪问我们的共享文件:
- Trufun云端建模平台之云端UML工具发布
Trufun云端建模平台包括云端UML工具,云端BPMN工具,云端思维导图工具. 云端UML工具是目前最先进的基于HTML5的UML2.x建模工具,所有代码基于JAVA开发,支持类图.用例图.活动图. ...
- HDU 1254 推箱子游戏(搞了一下午。。。)
中文题目:http://acm.hdu.edu.cn/showproblem.php?pid=1254 一开始常规的人用来做主导,想着想着不对劲,其实是箱子为主导,人只是箱子能否推进的一个判断. 可以 ...
- Codeforces Round #249 (Div. 2) A B
C好像就是个模拟.D 是个编码复杂度大的,可是好像也就是枚举三角形,我这会儿准备区域赛,尽量找点思维难度大的,所以昨晚A B 还是去做区域赛题吧..... B 也有点意思 贪心 题意:交换相邻两个位的 ...