【Cocos2d-x for WP8 学习整理】(5)文字显示全整理
学习 Cocos2d-x 有一阵了,现在要做个小东西,第一步就遇到了文字展示的问题,于是想把可能遇到的问题统统整理一下。这一部分也不局限于wp8,全平台应该都是一个解决方案。
先在脑袋里大致想了一下,大致也就分为两个部分,第一部分是普通文字如何展示,第二部分是老大难的中文展示问题。
文本显示控件
Cocos2d-x 中使用 Label 来展示文字,看 官方介绍 可以知道,一共有三种类型的Label ,分别是 CCLabelTTF 、CCLabelBMFont 、LabelAtlas ,下面逐个来介绍下:
CCLabelTTF
优势:
1、可以调整任意大小,支持间距调整
2、不需要额外的编辑器
劣势:
1、创建和更新很缓慢,因为每次修改都要重新贴图
使用实例:
//最基本的使用
CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", );
//指定水平、垂直对齐
pLabel = CCLabelTTF::create("Hello World", "Arial", , CCSizeMake(, ), kCCTextAlignmentCenter, kCCVerticalTextAlignmentTop);
//换行.
CCLabelTTF *center = CCLabelTTF::create("word wrap \n \"testing\" (bla0) bla1 'bla2' [bla3] (bla4) {bla5} {bla6} [bla7] (bla8) [bla9] 'bla0' \"bla1\"",
"Paint Boy",
32,
CCSizeMake(s.width,200),
kCCTextAlignmentCenter,
kCCVerticalTextAlignmentTop);
CCLabelBMFont
BMFont 即 Bitmap Font ,使用位图来表现字体,一般生成2个文件,一个是字体 *.fnt 文件,一个是图片 png文件。
创建过程可以参考 这篇文章
优势:
1、创建和更新十分的快
2、字体可以更加的个性化~
劣势:
1、 要依赖额外的工具来创建,比如 Windows 下可以用这个 BMFont
2、 调整尺寸的时候 显示效果可能变差
使用实例:
//基本使用,要求要显示的字符必须在字体图片里出现
CCLabelBMFont* pLable = CCLabelBMFont::create("中国", "fonts/bitmapFontChinese.fnt");
pLable->setPosition(ccp(size.width / , size.height /));
//BMFont的每一个元素可以转化为 CCSprite,单独做特效处理
CCLabelBMFont *label = CCLabelBMFont::create("Bitmap Font Atlas", "fonts/bitmapFontTest.fnt");
addChild(label);
CCSprite* BChar = (CCSprite*) label->getChildByTag(); //更新值. CCLabelBMFont *label1 = (CCLabelBMFont*) getChildByTag(kTagBitmapAtlas1);label1->setString(string);
CCLabelAtlas
优点:同CCLabelBMFont
缺点:字符是固定大小,如果不想要固定大小的,就要用CCLabelBMFont
这个应该是速度最快的了,可是已经不被推荐了,现在还出现只是为了向后兼容。
使用实例:
//基本用法,参数都封装在plist里
CCLabelAtlas* label1 = CCLabelAtlas::create("123 Test", "fonts/tuffy_bold_italic-charmap.plist");
addChild(label1, , kTagSprite1);
//另外一种初始化的方法,指定png,和单位的宽高.
CCLabelAtlas* label1 = CCLabelAtlas::create("123 Test", "fonts/tuffy_bold_italic-charmap.png", , , ' ');
//更新值.
CCLabelAtlas* label1 = (CCLabelAtlas*)getChildByTag(kTagSprite1);
label1->setString(string);
官方文档还提到了个 CharMapFile 的概念
CharMapFile 就是我们之前初始化 CCLabelAtlas 用到的图片,它有几个要求:
1、不能超过256个字符
2、单位的宽度就是字符的宽度,用像素表示
3、单位的高度就是字符的高度,同样用像素表示
CCLabelFont 和 CCLabelAtlas 效率要高的原因是,他们会把所有的元素都放在一张纹理上,这样,不管你创建多少个 Label 纹理还是一张,而 CCLabelTTF 不同,每个Label 都会单独有个纹理,所以性能就会下降很多,而且要占用更多的内存。
关于中文的显示
虽然游戏开发一般要面向国际,但是我们做东西要没有中文支持只有英文版本那就是舍本逐末了。如果我们什么处理都不做,直接在初始化Label的时候,输入中文,会发现无法正常显示,这是因为我们编码的字符集是GB2312,cocos2d-x的字符集是UTF-8,因此如果想要正常显示,我们可以采取如下几种方式。
1、转码,这个最简单,也最直接。
//GB2312 转 UTF-8
char* HelloWorld::G2U(const char* gb2312)
{
int len = MultiByteToWideChar(CP_ACP, , gb2312, -, NULL, );
wchar_t* wstr = new wchar_t[len+];
memset(wstr, , len+);
MultiByteToWideChar(CP_ACP, , gb2312, -, wstr, len);
len = WideCharToMultiByte(CP_UTF8, , wstr, -, NULL, , NULL, NULL);
char* str = new char[len+];
memset(str, , len+);
WideCharToMultiByte(CP_UTF8, , wstr, -, str, len, NULL, NULL);
if(wstr) delete[] wstr;
return str;
}
2、 采用xml的方式来读取,它的好处是修改起来更方便一些,而且很容易做多语言适配,testCpp里也有这个例子,代码如下。
/// BMFontUnicode
BMFontUnicode::BMFontUnicode()
{
CCDictionary *strings = CCDictionary::createWithContentsOfFile("fonts/strings.xml"); const char *chinese = ((CCString*)strings->objectForKey("chinese1"))->m_sString.c_str();
const char *japanese = ((CCString*)strings->objectForKey("japanese"))->m_sString.c_str();
const char *russian = ((CCString*)strings->objectForKey("russian"))->m_sString.c_str();
const char *spanish = ((CCString*)strings->objectForKey("spanish"))->m_sString.c_str(); CCSize s = CCDirector::sharedDirector()->getWinSize(); CCLabelBMFont *label1 = CCLabelBMFont::create(spanish, "fonts/arial-unicode-26.fnt", , kCCTextAlignmentLeft);
addChild(label1);
label1->setPosition(ccp(s.width/, s.height/*)); CCLabelBMFont *label2 = CCLabelBMFont::create(chinese, "fonts/arial-unicode-26.fnt");
addChild(label2);
label2->setPosition(ccp(s.width/, s.height/*)); CCLabelBMFont *label3 = CCLabelBMFont::create(russian, "fonts/arial-26-en-ru.fnt");
addChild(label3);
label3->setPosition(ccp(s.width/, s.height/*)); CCLabelBMFont *label4 = CCLabelBMFont::create(japanese, "fonts/arial-unicode-26.fnt");
addChild(label4);
label4->setPosition(ccp(s.width/, s.height/*));}
xml 内容,当然也要保存为 UTF-8格式的。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>chinese1</key>
<string>美好的一天</string>
<key>japanese</key>
<string>良い一日を</string>
<key>russian</key>
<string>Хорошего дня</string>
<key>spanish</key>
<string>Buen día</string>
</dict></plist>
3、修改cpp文件的编码
默认的编码是GB2312,这就是造成文字无法显示的问题,如果在win32平台下,改成 utf-8 编码就可以了,但是wp8上却不可以,不知道为什么,需要特意的改成utf-8 without signature,
但是这是一种最快速也最不安全的方法, 有可能会出现莫名其妙的无法编译通过,所以非常不建议。
好了,文字的部分基本也就这些了, 下一部分,应该考虑考虑如何做 多分辨率 适配了。
参考文章:
http://blog.csdn.net/zhy_cheng/article/details/9736973
http://cocos2d-x.org/wiki/Text_Labels?project_id=cocos2d-x
欢迎有兴趣的童鞋加入Cocos2d-x 开发群 qq: 264152376
【Cocos2d-x for WP8 学习整理】(5)文字显示全整理的更多相关文章
- libgdx学习记录2——文字显示BitmapFont
libgdx对中文支持不是太好,主要通过Hireo和ttf字库两种方式实现.本文简单介绍最基本的bitmapfont的用法. 代码如下: package com.fxb.newtest; import ...
- [Cocos2d-x for WP8学习笔记] HelloWorld结构分析
先来看一下目录结构: Assets:游戏资源文件,图片音频等,Resource文件夹也有类似功能 include:用于放置游戏头文件 Shaders:渲染器着色器文件(大雾) cocos2dorig. ...
- Learning Cocos2d-x for WP8(3)——文字篇
原文:Learning Cocos2d-x for WP8(3)--文字篇 C#兄弟篇Learning Cocos2d-x for XNA(3)——文字篇 文字,是人类文明的象征. 文字显示,可用字符 ...
- IOS开发-OC学习-常用功能代码片段整理
IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是 ...
- [Cocos2d-x for WP8学习笔记] HelloWorld
Cocos2d-x 是一个支持多平台的 2D 手机游戏引擎,使用 C++ 开发,基于OpenGL ES,基于Cocos2d-iphone,支持 WOPhone, iOS 4.1, Android 2. ...
- 原生JS研究:学习jquery源码,收集整理常用JS函数
原生JS研究:学习jquery源码,收集整理常用JS函数: 1. JS获取原生class(getElementsByClass) 转自:http://blog.csdn.net/kongjiea/ar ...
- td默认文字超出后显示..,点击tr时td文字显示完整
做项目时,产品提的需求,table表格里面,每一列限制文字超出宽度后显示省略号,等点击td时,文字显示完整,今天整理了一下代码,积累一下 备注:1.邮箱和网址,在td里面不会自动换行,需要增加word ...
- CSS控制文字显示一行,超出显示省略号
这几天在项目需求里面遇到了很多之前没做过的需求,也慢慢更加认识到了css的强大,是真的强大.以后会把自己技术调研的东西都写出来,哪怕只是一点点或者很小的点,重在学习. “CSS控制文字显示一行,超出显 ...
- cocos2d-x在IOS7下面文字显示异常的解决办法 CGBitmapContextCreate: unsupported parameter combination
首先定位到libs-->cocos2dx-->platform-->iOS-->CCImage.mm 找到这个文件. 打开CCImage.mm文件,定位到如下函数: [cp ...
随机推荐
- spring boot + swagger + mysql + maven
1.首先编写 yaml 文件,创建项目所需的接口,在swagger.io官网上生成 spring boot项目: 2.由于生成的spring boot项目是公共类的所以还需要修改成所需的项目名称,主要 ...
- async await
参考:https://blogs.msdn.microsoft.com/windowsappdev_cn/2012/04/30/winrt-await/
- LUA 学习笔记
1.C# 与 LUAC#调用LUA比较简单,但LUA调用C#,有两种方法,一种是直接反射调用,但这种方法有局限性,比如性能低,在IOS平台无法使用反射,因此一般使用WARP方法,即把C#代码注册到LU ...
- 转→js数组遍历 千万不要使用for...in...
看到一篇内容还不错,但是排版实在糟糕, 逼死强迫症患者啊,直接拉下去找原文连接,找到了,但是已经消失了···500错误... 第一次因为实在看不下去一篇博客的排版, 为了排版而转载... 转载地址:h ...
- 【转】PHP网站(nginx、php-fpm、mysql) 用户权限解析
这篇文章我们就特别来讲解下,nginx.php-fpm 以及 mysql 运行在各个用户下的配置. 先来做个说明:nginx本身不能处理PHP,它只是个web服务器.当接收到客户端请求后,如果是php ...
- (转载) 利用国内的镜像,加速PIP下载
国内源: 新版ubuntu要求使用https源,要注意. 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.c ...
- 用open_gapps安装google play
说明 一个开放源码脚本自动生成最新的谷歌应用程序包.对整个google play 程序框架的打包,包括一些google官方的程序.对于阉割了google ply用户来说是一个不错的选择. 使用 下载 ...
- vmare centos 6.8 minimal 无法上网
主机:win7 工具:vmare 11.0.0 系统:http://mirrors.163.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.i ...
- ScriptedSandbox64.exe 在写Winform程序Debug时不停提交数据
抓包时发现不停的在提交数据,导致抓包内容看不到. 取消方式:Tools -> Options -> Debugging -> General -> Enable Diagnos ...
- 设计模式--建造者模式Builder(创建型)
一.首先看建造者模式的UML图: 二.再来看一个建造者模式的例子 class Builder { public: virtual void BuildHead() {} virtual void Bu ...