Cocos2d-x之MenuItem

***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************

心情:唉,这几天做一个安卓APP界面有点头痛,纠结ING,第一次做啊,有点无从下手ING。。

正文:

上回说了Scene和Layer,这次来耍耍MenuItem,进行一下场景的切换。

还记得Scene的那张图片吗?

Scene一部分Layer另外一部分就是Menu了。

Menu就是菜单嘛,一个图层一个菜单,多符合我们观点啊,这个引擎还是挺人性化di~

Menu其实是一个容器,它装载着一些菜单,Menu不能作为菜单的一个按钮,

类似于:Menu就像一个篮子,里面可以装各种水果,但它本身不是水果。

对于,Menu,API上也有一个类继承图:

可以看到,其实Menu是Layer的一个子类。

也就是说,Menu也可以接受触屏事件,它的优先级为-128,优先级相当高!(值越小,优先级越高)

所以,一般它的触屏时间会优于一般Layer。

恩,接下来说 cocos2d-x的button,也就是MenuItem:

恩,MenuItem是Node类的子类,它有三个子类,分别是:

MenuItemLabel           字符标签菜单

MenuItemSprite          图片菜单

MenuItemToggle         开关菜单

恩,再来分别说一下。

①.MenuItemLabel    使用文字菜单创建的菜单项

API中解释:

一个"label"形式的标签菜单项项目的抽象类,任何支持LabelProtocol协议的节点都可以添加进来。

要注意一下,LabelProtocol有四个分支,其中第一个分支Label是cocos2d-x  3.0
新加进来的,

在2.x的系列中,有三种文本,分别是LabelTTF,LabelBMFont和LabelAtlas。其中3.0尤其提倡使用Lable代替LabelTTF和LabelBMFont,因为Label在渲染速度上较其快。

接下来,看看这四种:

1.Label::createWithTTF
 ---- 这是需要使用ttf格式字体文件的创建方式

来测试一下吧:

//获取屏幕的长宽
	Size visibleSize = Director::getInstance()->getVisibleSize();
    Point origin = Director::getInstance()->getVisibleOrigin();

	TTFConfig config("fonts/HelloKitty.ttf", 50);

	auto label1 = Label::createWithTTF(config, "Hello Cocos2d-x");
	label1->setPosition(Point(visibleSize.width/2, visibleSize.height*0.8));
	this->addChild(label1);

TTFConfig
 将字体类型导入,第一个参数表示存放位置,就是字体的ttf文件,我上网下载了一个HelloKitty版本的  = =~(粉粉哒~),第二个参数是大小。

然后下面创建Label,用自己做的config来展现我们所需要输出的内容。

接下来,两步,老样子,设置位置,然后加入到本层中,看一看我们做出来的吧~

这个字体....果真是HelloKitty啊
 O(∩_∩)O~

2.Label::createWithSystemFont ----- 这是使用系统自带的字体进行创建,和原来2.x中的TTF类似

调用系统自带的字体,代码是:

auto label2=Label::createWithSystemFont("Hello Cocos2d-x","Impact 常规",25);
	label2->setPosition(Point(visibleSize.width/2,visibleSize.height*0.7));
	this->addChild(label2);

当然,前面visibleSize 这个获取屏幕大小的不要忘了哟,这里就不重复写了。

这个方法就是可以调用系统自带的字体,三个必备参数,第一个
 输出内容,第二个  调用字体的名称,第三个  输出字体的大小。

如果不知道自己系统有什么字体:

Windows用户,可以在
C盘Windows文件夹下Fonts文件夹中查看。

另外,如我的样例,字体名称中包含中文是没有问题的

3.Label::createWithBMFont
----  通过静态字体文件创建文本的方式,生成fnt文件和对应的png图片

这个就是用自己创建的字体,.fnt和.png图片,.png是各个能输出字符的图片,.fnt存的是某个字符在Png中存放的位置,

具体关于制作fnt可以看这个
-> http://blog.csdn.net/qiurisuixiang/article/details/8984288

代码大概是这样的:

auto label3 = Label::createWithBMFont("fonts/myfont.fnt","Hello Cocos2d-x");
	label3->setPosition(Point(visibleSize.width/2,visibleSize.height*0.4));
	this->addChild(label3);

第一个参数是文件存放的位置(.fnt
和 .png),第二个参数就是要输出的内容。

4.Label::createWithCharMap
---- 这个是和2.x中Atlas形式创建对应的。不过这种有两种形式匹配图片中的文字,一种是直接设置每一块字体的宽高数值获取,另一种是通过fnt文件的方式,但原理都是一样的。

这种创建,需要有plist文件或者plist文件里面的值ItemHeight(每一个文字的高度)itemWidth(每个文字的宽度),startCharMap(文字起始ascii码)

一般这种的图只会用来装饰数字和字母。

所以,这种创建方式关键就是获得每个文字的高度,宽度,无论存于.png还是.plist就无所谓了。

这个样例就没有弄了。。。

大概代码形式是这样子的:

	// .plist
	auto label4 = Label::createWithCharMap(".plist文件存放位置");
	label4->setPosition(Point(visibleSize.width / 2, visibleSize.height*0.2));
	addChild(label4);
	label4->setString("Cocos2d-x");

	// .png
	auto label4 = Label::createWithCharMap("png存放位置", 每个字高度, 每个字宽度,起始的ASCII 码);
	label4->setPosition(Point(visibleSize.width / 2, visibleSize.height*0.2));
	addChild(label4);
	label4->setString("Cocos2d-x");

每个的最后一行就是要显示的内容了。

恩,这次就到这里了,讲了下MenuItem的一些东东。

***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************

时间: 2024-08-02 07:01:45

Cocos2d-x之MenuItem的相关文章

Cocos2d-x学习笔记(七)菜单

文本菜单示例: #include "HelloWorldScene.h" USING_NS_CC; Scene* HelloWorld::createScene() { auto scene = Scene::create(); auto layer = HelloWorld::create(); scene->addChild(layer); return scene; } bool HelloWorld::init() { if ( !Layer::init() ) { re

Cocos2d-x学习笔记(十一)瞬时动作

动作类Action是一切动作的祖先类.它有三个直接继承子类: FiniteTimeAction受时间限制的动作: Follow精灵跟随精灵的动作: Speed运动速度控制: 而FiniteTimeAction又有两个直接子类:分别是ActionInstant和ActionInterval,顾类名而思意. 瞬时动作即立即执行动作,下边是其使用示例: void MyAction::goMenu(cocos2d::Ref *pSender) { log("Tag = %i", this-&g

cocos2D 虚拟摇杆Joystick功能实现

@implementation InputLayer        - (id)init    {        if(self = [super init])        {            winSize = [[CCDirector sharedDirector] winSize];            [self addJoystick];            [self addFireButton];            [self scheduleUpdate];   

cocos2d 游戏选关界面 附源码

1. 选关效果图 每页15个,总共45个,每行5个.这些都可以改.源码基于Cocos2d 3.3. 2.实现原理 反正有源码这里就少讲点了.我看下cocos2d 的 Menu的实现,是一个Layer, 然后里面添加很多MenuItem,如果用它默认的添加方式,这种几行几列的很难搞,所以我们只需要创建一个空的Menu,然后以我们的方式一个一个添加MenuItem即可. [cpp] view plaincopy void LevelSelectContent::initAllLevels(int p

Cocos2d中的Menu使用

学习cocos2d-x中的菜单主要需要了解:菜单(CCMenu)和菜单项(CCMenuItem)以及CCMenuItem的具体子类. a. 下面来学习一下相关的类. 1. CCMenu 菜单,是CCLayer的子类,是一个层(容器),可以往里面添加菜单项.下面是它的类结构图: CCMenu默认接受触屏事件的优先级是-128(优先级很高,因为值越小,响应触屏事件的优先级越高),可以通过继承它实现自定义的效果,创建CCMenu对象的函数: static CCMenu* menuWithItems(C

cocos2d::Vector

v3.0 beta加入 定义在"COCOS2DX_ROOT/cocos/base"的"CCVector.h"头文件中. template<class T>class CC_DLL Vector; cocos2d::Vector<T>是一个封装好的能动态增长顺序访问的容器. cocos2d::Vector<T>中的元素是按序存取的,它的低层实现数据结构是标准模版库中的标准顺序容器std::vector. 在Cocos2d-x v3.

Cocos2D中Action的进阶使用技巧(一)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 假设认为写的不好请多提意见,假设认为不错请多多支持点赞.谢谢! hopy ;) 大家对Cocos2d中动作的使用大概都非常清楚了,事实上本身action的概念也不复杂. 可是在某些情况下,一般的动作不能满足我们需求的时候,我们就必须使用更高级的Action方法来解决这个问题. 比方,串行化(不是序列化哦,这是两个全然不同的概念)不同Action的执行-有些童鞋可能会说非常easy,直接用CCActionSequence不就结了,可是等等我

Cocos2d入门--3-- 向量的应用

 Cocos2d入门--3-- 向量的应用 小球向一个方向持续运动的Demo HelloWorldScene.h ...... //设置一个protected的属性 protected: cocos2d::Vec2 _vec; ...... HelloWorldScene.cpp //这个是通过随机数设置向量的方向 _vec.set(random(-0.1f, 1.0f), random(-1.0f, 1.0f)); //通过normalize这个标准化函数,能够使得向量的大小为1 _vec.n

Cocos2d入门--1-- 初涉相关属性或代码

 Cocos2d入门--1-- 初涉相关属性或代码 Cocos2d vision:  cocos2d-x-3.8.1 万丈高楼,起于累土.对于一个游戏框架的学习,其实在于框架功能的使用积累,学会了如何在cocos2d游戏引擎的基础上使用它提供的各种功能,并灵活运用, 以及学会查阅Cocos2d官方提供的API文档.相信自己也能开发出自己喜爱或者让别人羡慕的游戏. 目录: 1>认识origin和visibleSize以及cocos2d的基础绘画类DrawNode的简单实用 2>认识 CCLOG(

UITableViewController 滚动引起的cocos2d动画暂停问题的解决

UITableViewController 滚动引起的cocos2d动画暂停问题的解决 之前在使用UITableViewController进行滚动时,cocos2d的动画会暂停,直至滚动完毕才会继续动画. 后来发现可以这样解决,想要了解更多,请查阅NSRunLoop相关知识. // .h NSTimer* m_timer; // .m- (void)updateCCDirector { [[CCDirector sharedDirector] drawScene]; if (!self.tab