cocos2dx的控件
http://blog.csdn.net/yongyu_it/article/details/44963371
cocos2dx提供了一套易于使用的控件库来满足开发者的GUI需求。cocos2dx控件大致可分为两种,第一种是非继承自Widget类的早期控件库;第二类是新的继承自Widget类的控件库。
先介绍早期的非继承自Widget的控件库
1、标签(Label)
由于Label是SpriteBatchCode的子类,所以每个Label都具有精灵的特性,可以旋转、缩放、着色、改变锚点等等。
Label用于创建TTF、BMFont、SystemFount文本。
a、BMFont标签
BMFont是使用位图字体的标签类型。位图字体不可伸缩,每个字的每个特定尺寸需要一个单独图片资源。
创建一个BMFront标签需要两类资源:一个.fnt描述文件,每个字符对应的png格式图片集。
auto myLabel = Label::createWithBMFont("myFount.fnt","My Text"); //注意,第二个参数字符串内的所有字符必须在fnt文件中有说明,并能找到其对应的png图片,否则将不会被显示。
b、TTF标签
TTF标签是实际运用中使用得最多的标签。
使用TTF标签时需要提供字体库文件(.ttf文件)。TTF标签可以改变字体显示大小,无需提供单个字体(.png格式的图片文件)。
auto myLabel = Labe::createWithTTF("songti.ttf","My Text",16); //第三个参数是指定文字大小
虽然TTF标签比BMFount更加灵活,但是它的效率比较底下。
可以通过创建TTFConfig对象来管理和设置TTF标签的属性。
TTFConfig config;
config.fontFilePath="./songti.ttf";
config.fontSize=16;
auto myLanel = Label::createWithTTF(config,"My Text");
另外,TTF标签还可以显示中日韩字符
c、SystemFont标签
SystemFont是一一种系统默认的字体,字体属性不能随意改动。
2、菜单和菜单项(Menu、MenuItem)
a、Menu是游戏选项的导航,Menu不能单独起作用,Menu需包含至少一个菜单项,菜单项通常以可点击的按钮的形式显示。
MenuItem通常有一个被正常状态,一个被选中状态,一个点击回调组成。
auto item= MenuItemImage::create("Normal.png", "Selected.png", CC_CALLBACK_1(HelloWorld::menuCallback, this)); //注意HelloWorld::menuCallback实际上是函数指针
auto menu = Menu::create(Item, NULL);
this->addChild(menu, 1); //this指的是场景或者场景中的Layer或者其他容器
菜单还可以通过泛型容器来创建
Vector<MenuItem*> MenuItems;
auto Item = MenuItemImage::create("Normal.png", "Selected.png",CC_CALLBACK_1(HelloWorld::menuCallback, this));
MenuItems.pushBack(Item);
auto menu = Menu::createWithArray(MenuItems);
this->addChild(menu, 1);
b、使用Lambda函数作为菜单回调
Lambda是指可以在源代码中编写内联函数的函数。cocos2dx中可以直接使用Lambda函数,但是更常见的是将Lambda函数作为回调函数,比如菜单项的回调函数。
一个简单的Lambda函数
auto func = [] () { cout << "Hello world"; };
func(); // now call the function
使用lambda作为Action函数
auto action1 = CallFunc::create([&](){
std::cout << "using a Lambda callback" << std::endl;
});
使用lambda创建一个std::function:
std::function<void()> myFunction = []()
{
std::cout << "From myFunction()" << std::endl;
};
auto action2 = CallFunc::create(myFunction);
使用lambda作为MenuItem回调:
auto closeItem = MenuItemImage::create("CloseNormal.png", "CloseSelected.png",
[&](Ref* sender){
// 回调代码
});
下面是新补充的控件库,这里的控件都是继承自widget。这些控件分为两类,第一类是容器类控件;第二类是非容器类的普通控件
3、布局(Layout,容器类控件)
Layout是众多容器类的父类,Layout及其子类主要用于陈列子控件和裁剪。
LayoutManager、LayoutParameter、Margin类用于陈列控件
HBox、VBox、RelativeBox可以很方便地将控件水平、垂直、相对地陈列
ScrollView、ListView和PageView是针对某些应用场景使用的指定容器
4、非容器类控件
a、Button(按钮)
Button用于捕捉触摸事件,点击按钮将会调用一个预定义的回调函数。Button类允许设置按钮的标题、图像及其他属性,每个按钮都有一个正常状态和选中状态。
b、CheckBox(复选框)
c、LoadingBar(进度条)
d、Slider(滑动条)
......
/////////////////////
http://blog.csdn.net/samrtian/article/details/43369807
/////////////////////
综述
Cocos2d-x提供了一套易于使用的UI API来满足你的GUI需求,其中包括:Label、Menu、MenuItems、Buttons和Views。
Label(标签)
Cocos2d-x中提供了Label(标签)对象来创建TTF、BMFont和SystemFont文本。
Label BMFont(BMFont标签)
BMFont是使用位图字体的标签类型。位图字体是由点或像素矩阵所组成,这些点和像素代表了字符图形的外形和大小。位图字体的使用很方便也很容易,但它不可伸缩,其每个尺寸都需要一个单独的字体。
Label
类是SpriteBatchNode
的子类,所以Label
的每个字符都可以看作一个Sprite
(精灵),都具有旋转、缩放、着色,改变锚点以及其他继承自Node
对象的属性。
创建一个BMFont
文本需要两个文件:一个.fnt文件和一个显示每一个对象的.png格式的图片。利用像Glyph Designer这样的工具可以自动创建该类型的文件。
创建一个BMFont文本:
1
|
auto myLabel = Label::createWithBMFont( "myFont.fnt" , "My Label Text" );
|
字符串内所有的字符都要包含在MyFont.fnt文件中,否则它们将不会被渲染。假设渲染一个缺少字符的Label
,那么就要确保它们都在你的MyFont.fnt文件中。
Label TTF(TTF标签)
TTF是一个 True Type Font 的标签类型。创建TTF标签你需要指定一个.ttf格式的字体文件名、文本字符串以及字体大小。与BMFont不同,TTF可以改变字体的显示大小,无需单独的字体。
创建一个TTF标签:
1
|
auto myLabel = Label::createWithTTF( "myFont.ttf" , "My Label Text" , 16);
|
尽管TTF标签比BMFont更灵活,但它的效率是更低的,并且修改如字形和大小等属性都是一个复杂的操作。如下为使用TTF创建Label的示例:
如果你需要一些具有相同属性的TTF
标签,你可以通过创建一个TTFConfig
对象来管理它们。TTFConfig
允许你为所有的TTF
标签设置共同的属性。如下:
1
2
3
4
5
6
7
8
9
10
11
|
// create a TTFConfig files for labels to share
TTFConfig labelConfig;
labelConfig.fontFilePath = "myFont.ttf" ;
labelConfig.fontSize = 16;
labelConfig.glyphs = GlyphCollection::DYNAMIC;
labelConfig.outlineSize = 0;
labelConfig.customGlyphs = nullptr.
labelConfig.distanceFieldEnabled = false ;
// create a TTF Label from the TTFConfig file;
auto myLabel = Label::createWithTTF(labelConfig, "My Label Text" );
|
TTFConfig还可以用于显示中文、日文和韩文字符。
Label SystemFont(系统字体标签)
SystemFont是一个使用系统默认的字体和尺寸的标签类型。意思就是说我们不能修改字体的属性,你可以理解为是一种系统字体,系统规则。创建一个SystemFont
标签:
1
|
auto myLabel = Label::createWithSystemFont( "My Label Text" , "Arial" , 16);
|
标签效果和排版
标签效果
Label
对象有一些实话它们的特效效果。当然,不是所有的标签类型都支持所有的特效。这些特效包括阴影、轮廓和光晕效果。
1
2
|
// shadow effect is supported by all Label types
myLabel->enableShadow();
|
1
2
|
// outline effect is TTF only, specify the outline color desired
label->enableOutline(Color4B(100, 50, 100, 100));
|
1
2
|
// glow effect is TTF only, specify the glow color desired.
label->enableGlow(Color4B(100, 50, 100, 100));
|
菜单和菜单项
Menu
是游戏选项的导航。菜单通常包含如播放、退出、设置和关于等选项。通常以可点击的按钮形式显示。
菜单由什么组成
Menu
是一个特殊的Node
对象,下列代码创建一个空Menu:
1
|
auto myMenu = Menu::create();
|
菜单选项和添加到菜单
MenuItems
是Menu
的核心。菜单选项通常有一个正常状态、一个被选择的状态以及一个回调。回调通常发生在MenuItems
被选择的时候。
1
2
3
4
5
6
7
|
// creating a menu with a single item
// create a menu item
auto closeItem = MenuItemImage::create( "CloseNormal.png" , "CloseSelected.png" , CC_CALLBACK_1(HelloWorld::menuCloseCallback, this ));
auto menu = Menu::create(closeItem, NULL);
this ->addChild(menu, 1);
|
菜单还可以使用MenuItem
对象的Vector
创建:
1
2
3
4
5
6
7
8
9
10
11
12
|
// creating a Menu from a Vector of items
Vector<MenuItem*> MenuItems;
auto closeItem = MenuItemImage::create( "CloseNormal.png" , "CloseSelected.png" ,
CC_CALLBACK_1(HelloWorld::menuCloseCallback, this ));
MenuItems.pushBack(closeItem);
/* repeat for as many menu items as needed */
auto menu = Menu::createWithArray(MenuItems);
this ->addChild(menu, 1);
|
Lambda作为菜单回调
lambda 函数是指可以在源代码中编写内联函数的函数。Cocos2d-x中可以使用 lambda 函数,你甚至可以将 lambda 函数作为回调函数。除了Menu
回调, lambda 函数可用作多种函数。
一个简单的lambda函数:
1
2
|
auto func = [] () { cout << "Hello world" ; };
func(); // now call the function
|
使用lambda作为Action函数:
1
2
3
|
auto action1 = CallFunc::create([&](){
std::cout << "using a Lambda callback" << std::endl;
});
|
使用lambda创建一个std::function:
1
2
3
4
5
|
std::function< void ()> myFunction = []()
{
std::cout << "From myFunction()" << std::endl;
};
auto action2 = CallFunc::create(myFunction);
|
使用lambda作为MenuItem回调:
1
2
3
4
|
auto closeItem = MenuItemImage::create( "CloseNormal.png" , "CloseSelected.png" ,
[&](Ref* sender){
// your code here
});
|
GUI控件和容器
综述
新的GUI模块是基于GUI控件的框架,最开始设计是用于cocos Studio中。新的GUI模块的父类是继承自ProtectedNode的ui::Widget。当从ProtectedNode中添加或者移除子节点时,ProtectedNode用于控制内部Node列表。内部节点列表不会被触发,对于保持模块内部渲染组件很安全。我们可以将GUI分成两部分: Widget (控件)和 Containers (容器)。
Layout(布局)
Layout类是所有容器的父类,它继承自Widget。Layout类主要用于陈列子控件和剪裁。
LayoutManager、LayoutParameter和Margin类用于陈列元素。HBox、VBox和RelativeBox可以很方便地将子控件水平地、垂直地、相对地陈列子控件。
ScrolView、ListView和PageView是针对某些场景使用的指定容器。我们将在另一章节中详细讲解。
Widgets(组件)
Widgets
(组件)是GUI对象,使用组件可以很容易地创建用户界面。下面我们来一起讨论下你可能会用到的一些常用组件:
Buttons(按钮)
按钮用来拦截触摸事件,点击按钮会调用一个预定义的回调函数。它继承自ui::Widget,这个类提供了设置按钮标题、图像以及其他属相的方法。每个按钮都有一个正常状态和一个被选择的状态。Button的外观根据状态而改变。创建一个Button很简单:
1
2
3
4
5
6
|
auto button = Button::create( "animationbuttonnormal.png" ,
"animationbuttonpressed.png" );
button->setTitleText( "Text Button" );
button->setPosition(Vec2(0,0));
button->addTouchEventListener(CC_CALLBACK_2(UIButtonTest::touchEvent, this ));
this ->addChild(button);
|
CheckBox(复选框)
CheckBox允许用户可以做多重选择。CheckBox可以有正常、被选择、不可选三种状态。创建一个CheckBox很简单:
1
2
3
4
5
6
7
8
9
|
auto checkBox = CheckBox::create( "check_box_normal.png" ,
"check_box_normal_press.png" ,
"check_box_active.png" ,
"check_box_normal_disable.png" ,
"check_box_active_disable.png" );
checkBox->setPosition(Vec2(0,0));
checkBox->addEventListener(CC_CALLBACK_2(UICheckBoxTest::selectedEvent, this ));
this ->addChild(checkBox);
|
LoadingBar(进度条)
LoadingBar可用于显示操作的进程,例如下载、文件传输等,也可以称其为状态条。创建一个LaodingBar:
1
2
3
4
|
auto loadingBar = LoadingBar::create( "sliderProgress.png" );
loadingBar->setDirection(LoadingBar::Direction::RIGHT);
loadingBar->setPosition(Vec2(0,0));
this ->addChild(loadingBar);
|
Slider(滑动条)
滑动条允许用户通过移动一个指标来设定值。创建一个Slider:
1
2
3
4
5
6
7
|
auto slider = Slider::create();
slider->loadBarTexture( "sliderTrack.png" );
slider->loadSlidBallTextures( "sliderThumb.png" , "sliderThumb.png" , "" );
slider->loadProgressBarTexture( "sliderProgress.png" );
slider->setPosition(Vec2(0,0));
slider->addEventListener(CC_CALLBACK_2(UISliderTest::sliderEvent, this ));
this ->addChild(slider);
|
ImageView(图像显示控件 )
ImageView是一个展示图片的占位符。支持触摸事件、对焦、百分比定位和内容大小百分比。创建一个ImageView:
1
2
3
|
auto imageView = ImageView::create( "ccicon.png" );
imageView->setPosition(Vec2(0,0));
this ->addChild(imageView);
|
还可以通过SpriteFrame创建一个ImageView:
1
2
3
4
|
auto imageView = ImageView::create( "ccicon.png" ,
TextureResType::PLIST);
imageView->setPosition(Vec2(0,0));
this ->addChild(imageView);
|
Text(文本)
Text控件用于展示文本。还可以将其用作一个写了字的按钮。Text支持系统默认字体和TTF字体。创建一个Text控件:
1
2
3
|
auto text = Text::create( "Text" , "fonts/MyTTF.ttf" ,30);
text->setPosition(Vec2(0,0));
this ->addChild(text);
|
与其他Label对象一样,你可以给文本添加阴影、光晕、轮廓等特效。
TextBMFont
TextBMFont控件用于显示BMFont文本。支持触摸事件、对焦、百分比定位和内容大小百分比。创建一个TextBMFont与创建Text控件一样:
1
2
3
|
auto textBMFont = TextBMFont::create( "BMFont" , "bitmapFontTest2.fnt" );
textBMFont->setPosition(Vec2(0,0));
this ->addChild(textBMFont);
|
TextAtlas
TextAtlas控件用于将文本显示为Atlas字体。支持触摸事件、对焦、百分比定位和内容大小百分比。
1
2
3
|
auto textAtlas = TextAtlas::create( "1234567890" , "labelatlas.png" , 17, 22, "0" );
textAtlas->setPosition(Vec2(0,0));
this ->addChild(textAtlas);
|
RichText(富文本)
RichText控件用于显示文本、图像和常用节点。支持触摸事件、对焦、百分比定位和内容大小百分比。当接收到一个触摸事件时,整个RichText控件都接收这个事件。创建一个Richtext控件:
1
2
3
4
5
6
7
8
9
10
|
auto richText = RichText::create();
richText->ignoreContentAdaptWithSize( false );
richText->setContentSize(Size(100, 100));
auto re1 = RichElementText::create(1, Color3B::WHITE, 255, str1, "Marker Felt" , 10);
richText->pushBackElement(re1);
richText->setPosition(Vec2(0,0));
richText->setLocalZOrder(10);
this ->addChild(_richText);
|
TextField
TextField控件用于输入文本。支持触摸事件、对焦、百分比定位和内容大小百分比。创建一个TextField控件:
1
2
3
4
|
auto textField = TextField::create( "input words here" , "Arial" ,30);
textField->setPosition(Vec2(0,0));
textField->addEventListener(CC_CALLBACK_2(UITextFieldTest::textFieldEvent, this ));
this ->addChild(textField);
|
cocos2dx的控件相关推荐
- cocos2dX UI控件之CCEditBox
刚刚看了看以前写的博客, 我们已经学了CCLabelTTF, CCLabelBMFont, CCLAbelAtlas, CCSprite, CCMenu这些基础控件了, 基础控件也没有多少了, 我们今 ...
- cocos2d-x 学习笔记(2)cocos2d-x重要概念,项目结构及 CCDirector 导演控件
cocos2d-x 学习笔记(2)cocos2d-x重要概念及项目结构 在cocos2d引擎中,有几个概念,分别是导演,场景,布景和人物角色. 导演(CCDirector)在cocos2d-x引擎中, ...
- Cocos2dx中Scrollview控件滑动与其子控件监听冲突的解决方案(不改底层、最优)
语言环境: Cocos2dx 3.6 Lua 5.1 UI编辑器:Cocos Studio v2.0.6 问题:Scrollview控件滑动与其子控件监听发生冲突. 在点击子控件时,若在子控件上进行移 ...
- Cocos2dx 菜单项控件-Menu
除了标签以外,按钮也是很重要的UI控件,在游戏菜单中,按钮是必不可少的控件,它可以对游戏画面进行操作,例如游戏开始菜单项.暂停菜单项和退出菜单项等. 在对菜单项进行学习时,有必要先对MenuItem类 ...
- 1cocos2dx扩展库UI控件,CCControlSlider,CCScale9Sprite(九妹图),CCControlSwitch,CCControlButton
UI控件来自cocos2dx的扩展库,完善了UI方面的元素,使cocos2dx更加丰富多彩.使用扩展库需包含: #include "cocos-ext.h" USING_NS ...
- Android-UI 开源控件
第一部分 个性化控件(View) 主要介绍那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.Pro ...
- 《Cocos Creator游戏实战》实现下拉框按钮ComboBox控件
实现下拉框按钮ComboBox控件 创建节点 编写脚本 该功能已收录在Many Widgets插件中,使用Cocos Creator 3.x版本的小伙伴可以用该插件快速生成下拉框ComboBox控件. ...
- IOS 笔记大全 (UI控件到网络协议)
1 MVC模式:(model+view+controller):是一种帮你把代码功能和显示划分出来的设计模式: 2 model:较为底层的数据引擎,负责管理实体中所继承的数据: 3 view:和用户交 ...
- Android-UI 超级优良超级多超级强大开源控件源码demo
第一部分 个性化控件(View) 主要介绍那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.Pro ...
最新文章
- 重置SQLSERVER表的自增列,让自增列重新计数
- linux shell 删除两个文件相同部分
- java spring cloud版b2b2c社交电商spring cloud分布式微服务:分布式配置中心
- 信息学奥赛一本通 1011:甲流疫情死亡率 | OpenJudge NOI 1.3 06
- Mosquito的优化——订阅树优化(八)
- Instruments性能优化-Core Animation
- cookie 以及session 的使用
- iOS - OC NSTimeZone		时区
- 济南大学Oj系统c语言,“浪潮杯”第十届山东省大学生ACM程序设计竞赛在济南大学举行...
- 从软件开发到 AI 领域工程师:模型训练篇
- mysql导出表文件_mysql导出表数据到文件的几种方法
- 【毕业论文】分享当年使用过的一些好用网站,包括论文去重,翻译,作图神器,免费文献查找 | 第 1 期
- Mac-删除自带 ABC 输入法的方法
- php实现鼠标悬停显示下拉菜单,jquery实现鼠标滑过显示二级下拉菜单效果
- 【原创】关于2013、2014款Macbook Air安装Windows的那点事
- python helper方法_Python io_utils.ImportHelper方法代碼示例
- vscode 前端常用插件推荐
- Golang学习笔记汇总
- 面试高级算法梳理笔记
- 用Defraggler打造自己的免费自动磁盘整理工具