Cocos2d-x 学习笔记(18) Label
1. 简介
Label直接继承了Node LabelProtocol BlendProtocol,用于渲染文本,让文本呈现的效果丰富。
Label有4种类型,:
enum class LabelType {
TTF,
BMFONT,
CHARMAP,
STRING_TEXTURE
};
Label文本呈现的效果:
enum class LabelEffect {
NORMAL,
OUTLINE,
SHADOW,
GLOW,
ITALICS,
BOLD,
UNDERLINE,
STRIKETHROUGH,
ALL
};
针对Label大小范围与文本长度冲突时的4种操作,用枚举定义:
enum class Overflow
{
//In NONE mode, the dimensions is (0,0) and the content size will change dynamically to fit the label.
NONE,
/**
*In CLAMP mode, when label content goes out of the bounding box, it will be clipped.
*/
CLAMP,
/**
* In SHRINK mode, the font size will change dynamically to adapt the content size.
*/
SHRINK,
/**
*In RESIZE_HEIGHT mode, you can only change the width of label and the height is changed automatically.
*/
RESIZE_HEIGHT
};
1
2. 构造函数
从构造函数得知:
锚点(0.5,0.5)
调用reset()方法
LabelType默认STRING_TEXTURE
LabelEffect默认NORMAL
设置了默认字体和大小
label长宽大小默认0
对齐方式默认LEFT TOP
文本颜色默认白色,效果颜色默认黑色
Overflow默认NONE
3. create
create()
创建空的label对象和指针。
createWithSystemFont
Label* createWithSystemFont(const std::string& text, const std::string& font, float fontSize,
const Size& dimensions = Size::ZERO, TextHAlignment hAlignment = TextHAlignment::LEFT,
TextVAlignment vAlignment = TextVAlignment::TOP)
共6个参数:
- string& text 要显示的字符串
- string& font 字体,字体名/字体文件
- float fontSize 字体大小,必须大于0
- Size& dimensions = Size::ZERO label大小,默认Size(0, 0)
- TextHAlignment hAlignment = TextHAlignment::LEFT 水平对齐方式,默认左对齐
- TextVAlignment vAlignment = TextVAlignment::TOP 垂直对齐方式,默认顶部对齐
实现:
auto ret = new (std::nothrow) Label(hAlignment,vAlignment);
if (ret)
{
ret->setSystemFontName(font);
ret->setSystemFontSize(fontSize);
ret->setDimensions(dimensions.width, dimensions.height);
ret->setString(text); ret->autorelease(); return ret;
}
return nullptr;
通过set方法用参数进行set。
- setSystemFontName
_systemFont设为参数字体
_currentLabelType = LabelType::STRING_TEXTURE
_systemFontDirty = true - setSystemFontSize
_systemFontSize _originalFontSize 设为参数字体大小
_currentLabelType = LabelType::STRING_TEXTURE;
_systemFontDirty = true - setDimensions
如果Overflow为RESIZE_HEIGHT类型,先将参数height设0_labelWidth = width;
_labelHeight = height;
_labelDimensions.width = width;
_labelDimensions.height = height;
_maxLineWidth = width; //最大文本宽度_contentDirty = true;
如果Overflow是SHRINK类型,
if (_originalFontSize > 0) {
this->restoreFontSize();
} - setString
_utf8Text _utf32Text 都存储了set的字符串
createWithTTF
有2种重载方法:
- 方法1:参数中用string& fontFilePath指定字符串字体文件.ttf路径
Label * createWithTTF(const std::string& text, const std::string& fontFilePath, float fontSize,
const Size& dimensions = Size::ZERO, TextHAlignment hAlignment = TextHAlignment::LEFT,
TextVAlignment vAlignment = TextVAlignment::TOP)参数中没有ttf,利用参数生成对应的ttf,之后调用了setTTFConfig(ttfConfig)
还调用了setDimensions(dimensions.width, dimensions.height); setString(text); - 方法2:参数中用TTFConfig设置字体,maxLineWidth值为最大文本行宽(默认为0, 表示不设置)
Label* createWithTTF(const TTFConfig& ttfConfig, const std::string& text,
TextHAlignment hAlignment = TextHAlignment::LEFT, int maxLineWidth = )
对参数ttfConfig调用了setTTFConfig(ttfConfig),之后执行setMaxLineWidth(maxLineWidth); setString(text);
字体配置TTFConfig是一个结构体:
typedef struct _ttfConfig
{
std::string fontFilePath; //字体文件路径,默认空
float fontSize; //字体大小,默认12 GlyphCollection glyphs; //字符集,默认DYNAMIC
const char *customGlyphs; //自定义字符集, 默认无 bool distanceFieldEnabled; //是否字体紧凑,默认false
int outlineSize; //字体轮廓大小,默认0 bool italics; //是否斜体,默认false
bool bold; //是否粗体,默认false
bool underline; //是否有下划线,默认false
bool strikethrough; //是否有删除线,默认false _ttfConfig(..........)
: fontFilePath(filePath)
, fontSize(size)
, glyphs(glyphCollection)
, customGlyphs(customGlyphCollection)
, distanceFieldEnabled(useDistanceField)
, outlineSize(outline)
, italics(useItalics)
, bold(useBold)
, underline(useUnderline)
, strikethrough(useStrikethrough)
{
if(outline > )
{
distanceFieldEnabled = false;
}
}
} TTFConfig;
setTTFConfig(ttfConfig)
先执行_originalFontSize = ttfConfig.fontSize
再调用setTTFConfigInternal(ttfConfig)
_currentLabelType = LabelType::TTF
createWithBMFont
参数中包括BMFont软件生成的.fnt文件路径和显示的文本。字符串必须和.fnt文件定义的文本一致,否则多余的不显示。
Label* createWithBMFont(const std::string& bmfontPath, const std::string& text,
const TextHAlignment& hAlignment = TextHAlignment::LEFT, int maxLineWidth = ,
const Vec2& imageOffset = Vec2::ZERO)
调用了setBMFontFilePath(bmfontFilePath,imageOffset),_currentLabelType = LabelType::BMFONT
调用了setMaxLineWidth(maxLineWidth) setString(text);
我们使用BMFont能生成自定义字体,软件导出.fnt字体信息文件和.png字体图片文件,两文件放在同一目录被Cocos2dx使用。
createWithCharMap
有三种重载方法:
Label * createWithCharMap(const std::string& charMapFile, int itemWidth, int itemHeight, int startCharMap)
Label * createWithCharMap(Texture2D* texture, int itemWidth, int itemHeight, int startCharMap)
Label * createWithCharMap(const std::string& plistFile)
创建方式分为三种:
- 通过.png图片文件
- 通过Texture2D纹理
- 通过.plist文件
前两种方式要在参数中设置表示字符的每个小图的长宽、起始的下标值startCharMap(ASCII,用'0'代替48)。.plist则已经包含了这些参数。
每种重载都调用了对应的setCharMap,其中调用了对应的FontAtlasCache::getFontAtlasCharMap生成newAtlas,再执行
_currentLabelType = LabelType::CHARMAP
setFontAtlas(newAtlas)
- TTF BMFont CharMap
TTF统一配置字体属性,对label中所有文本都有效。
BMFont需要.fnt .png文件,使用时仅需要.fnt路径,.fnt类似于.plist,通过文本内容选择大图.png中对应的字符。
CharMap可以看作BMFont的简化版,通过ASCII读取大图里不同的字符。
4. 渲染特效
Label提供了三种字体特效:
- Shadow 阴影
- Outline 描边
- Glow 发光
三种特效设置方式:
enableShadow(const Color4B& shadowColor = Color4B::BLACK,const Size &offset = Size(,-), int blurRadius = )
enableOutline(const Color4B& outlineColor,int outlineSize = -)
enableGlow(const Color4B& glowColor)
描边Outline和发光Glow只支持createWithTTF创建的label。且两者同时使用时,仅后设置的显示。
阴影Shadow的Size是以label的左上角为基准点设置阴影的位置的。
5. 对齐方式
Label默认的对齐方式是LEFT+TOP。
分为水平方向和竖直方向,对应Label两个成员:
TextHAlignment _hAlignment; //水平
TextVAlignment _vAlignment; //竖直
定义两个枚举:
enum class CC_DLL TextVAlignment
{
TOP,
CENTER,
BOTTOM
}; enum class CC_DLL TextHAlignment
{
LEFT,
CENTER,
RIGHT
};
相关set get方法:
void setAlignment(TextHAlignment hAlignment) { setAlignment(hAlignment,_vAlignment);}
TextHAlignment getTextAlignment() const { return _hAlignment;}
void setAlignment(TextHAlignment hAlignment,TextVAlignment vAlignment);
void setHorizontalAlignment(TextHAlignment hAlignment) { setAlignment(hAlignment,_vAlignment); }
TextHAlignment getHorizontalAlignment() const { return _hAlignment; }
void setVerticalAlignment(TextVAlignment vAlignment) { setAlignment(_hAlignment,vAlignment); }
TextVAlignment getVerticalAlignment() const { return _vAlignment; }
6. 范围大小
label所处的文本框大小,涉及变量:
Size _labelDimensions;
float _labelWidth;
float _labelHeight;
相关get set方法:
void setWidth(float width) { setDimensions(width,_labelHeight);}
float getWidth() const { return _labelWidth; }
void setHeight(float height){ setDimensions(_labelWidth, height); }
float getHeight() const { return _labelHeight; }
void setDimensions(float width, float height);
const Size& getDimensions() const{ return _labelDimensions;}
设置尺寸使用setDimensions,而不是Node的setContentSize。setDimensions主要逻辑:
_labelWidth = width;
_labelHeight = height;
_labelDimensions.width = width;
_labelDimensions.height = height;
_maxLineWidth = width;
-
7. 文本 字体 大小 颜色
virtual void setSystemFontName(const std::string& font);
virtual const std::string& getSystemFontName() const { return _systemFont;} virtual void setSystemFontSize(float fontSize);
virtual float getSystemFontSize() const { return _systemFontSize;} virtual void setString(const std::string& text) override;
virtual const std::string& getString() const override { return _utf8Text; }
//仅ttf systemfont
virtual void setTextColor(const Color4B &color);
const Color4B& getTextColor() const { return _textColor;}
-
8. 自动换行 行间距
- void setLineBreakWithoutSpace(bool breakWithoutSpace)
是否开启换行功能,设置了属性_lineBreakWithoutSpaces。
- void setMaxLineWidth(float maxLineWidth)
设置最大行宽,需要_labelWidth为0时才能继续设置,否则我们仅通过_labelWidth就能实现自动换行。设置了属性_maxLineWidth。
- label尺寸相关
涉及到_labelDimensions _labelWidth _labelHeight。
void setWidth(float width) { setDimensions(width,_labelHeight);}
float getWidth() const { return _labelWidth; }
void setHeight(float height){ setDimensions(_labelWidth, height); }
float getHeight() const { return _labelHeight; }
void setDimensions(float width, float height);
const Size& getDimensions() const{ return _labelDimensions;}
- void setLineHeight(float height) / float getLineHeight()
直接修改属性_lineHeight。行间距不支持System Font。
- void setAdditionalKerning(float space) / float getAdditionalKerning()
字符间距修改属性_additionalKerning,不支持System Font。
-
Cocos2d-x 学习笔记(18) Label的更多相关文章
- Ext.Net学习笔记18:Ext.Net 可编辑的GridPanel
Ext.Net学习笔记18:Ext.Net 可编辑的GridPanel Ext.Net GridPanel 有两种编辑模式:编辑单元格和编辑行. 单元格编辑: 行编辑: 可以看出,单元格编辑的时候,只 ...
- SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题
目标:减少SQL查询数据,避免使用一条SQL语句解决复杂问题 反模式:视图使用一步操作,单个SQL语句解决复杂问题 使用一个查询来获得所有结果的最常见后果就是产生了一个笛卡尔积.导致查询性能降低. 如 ...
- golang学习笔记18 用go语言编写移动端sdk和app开发gomobile
golang学习笔记18 用go语言编写移动端sdk和app开发gomobile gomobile的使用-用go语言编写移动端sdk和app开发https://blog.csdn.net/u01249 ...
- springmvc学习笔记(18)-json数据交互
springmvc学习笔记(18)-json数据交互 标签: springmvc springmvc学习笔记18-json数据交互 springmvc进行json交互 环境准备 加入json转换的依赖 ...
- cocos2d-x学习笔记(18)--游戏打包(windows平台)
cocos2d-x学习笔记(18)--游戏打包(windows平台) 之前做好的游戏,都是在vs2008下编译执行的.假设说想把游戏公布到网上或者和其它人一起分享游戏,那就得对游戏 ...
- Hadoop学习笔记—18.Sqoop框架学习
一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易.Apache Sqoop正在加 ...
- [原创]java WEB学习笔记18:java EE 中的MVC 设计模式(理论)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- C语言实例解析精粹学习笔记——18
<C语言实例解析精粹>中编译环境采用的是Turbo C 2.0.但是这个编译器年代久远,较新的编译器对书中的某些例子支持不好,在学习的时候同时做一些笔记. 实例18:将一个无符号整数转换为 ...
- NodeJS学习笔记 (18)基础调试-console(ok)
模块概览 console模块提供了基础的调试功能.使用很简单,常用的API主要有 console.log().console.error(). 此外,可以基于Console类,方便的扩展出自己的con ...
随机推荐
- Winform中对ZedGraph的RadioGroup进行数据源绑定,即通过代码添加选项
场景 在寻找设置RadioGroup的选项时没有找到相关博客,在DevExpress的官网找到 怎样给其添加选项. DevExpress官网教程: https://documentation.deve ...
- 浅谈PHP反序列化漏洞原理
序列化与反序列化 序列化用途:方便于对象在网络中的传输和存储 0x01 php反序列化漏洞 在PHP应用中,序列化和反序列化一般用做缓存,比如session缓存,cookie等. 常见的序列化格式: ...
- 【Python爬虫】第四课(查询照片拍摄地址)
首先,要能够查询到照片地址,查询的照片必须要开GPS拍,且上传时用原图…… 查询图片的exif信息,使用exifread包 import exifread img = exifread.process ...
- Android进程的优先级说明
引言 Android系统尽可能长时间地保持应用程序进程,但为了新建或者运行更加重要的进程,总是需要清除一些进程来回收内存.为了决定保留或终止哪个进程,根据进程内运行的组件及这些组件的状态,系统把每个进 ...
- vue中事件修饰符详解(stop, prevent, self, once, capture, passive)
==.stop== 是阻止冒泡行为,不让当前元素的事件继续往外触发,如阻止点击div内部事件,触发div事件 ==.prevent== 是阻止事件本身行为,如阻止超链接的点击跳转,form表单的点击提 ...
- 【带着canvas去流浪(14)】Three.js中凹浮雕模型的生成方式
目录 一. 方案1:ThreeBSP.js或ThreeCSG.js扩展库 二. 方案2:平面镂空模型拉伸 三. 方案3:Cinema 4D建模后输出模型文件 示例代码托管在:http://www.gi ...
- 基于vue实现搜索高亮关键字
有一个需求是在已有列表中搜索关键词,然后在列表中展示含有相关关键字的数据项并且对关键字进行高亮显示,所以该需求需要解决的就两个问题: 1.搜索关键词过滤列表数据 2.每个列表高亮关键字 ps: 此问题 ...
- 暑期——第四周总结(Ubuntu系统安装新版eclipse双击无法打开问题 【已解决】)
所花时间:7天 代码行:200(python)+3000(java) 博客量:1篇 了解到知识点 : Ubuntu安装新eclipse 在通过软件中心安装好eclipse之后,发现各种东西都不顺眼,不 ...
- 23种设计模式之原型模式(Prototype Pattern)
原型模式 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象 分析: 孙悟空:根据自己的形状复制(克隆)出多个身外身 软件开发:通过复制一个原型对象得到多个与原型对象一模一样的新对象 ...
- 使用Espresso测试记录
准备工作 建立测试项目 添加测试依赖 编写Espresso测试 运行测试并检查测试结果 建立测试项目 使用Android Studio建立测试项目,Activity模版使用 LoginActivity ...