你有没有碰到过,在WP8系统上,运用Cocos2dx来进行游戏开发之际,中文变为方块形状或者呈现乱码的那种令人糟心不已之事?这个问题让好些游戏程序员陷入了困境,不过解决它实际上是有一定规律可依的。
有那么一种跨平台游戏引擎,像Cocos2dx,它主要处理的是游戏逻辑方面的通用问题 ,它能帮你处理那些诸如场景该怎么去组织 ,图形该如何去渲染 ,物理碰撞该怎么去计算的核心功能。然而 ,要是你打算把游戏发布到Windows Phone 8这个特定的平台上时 ,那一该引擎的通用方案常常是不够用的。
每一个手机平台皆有着自身的脾性,WP8同样如此,它的文件系统,与安卓或者iOS不一样,其字体渲染机制,和安卓或iOS存在差异,它的字符编码方式,与安卓或iOS不一样,要是你仅仅懂得引擎却不了解平台,碰到中文显示出现异常这种状况就会毫无办法,这便要求每一个游戏程序员耗时间去知悉WP8的底层技术细节。

依据我于WP8之上所拥有的实际移植经历,中文呈现无法显示的状况主要存有两种展现形式。其一为中文演变成方块,一个个的小方框取代了本应予以显露的文字。其二是中文转变成为乱码,屏幕之上浮现出一堆毫无实际意义的符号以及字母。这两种情形的致病缘由全然不同,必须要分别进行对待。
更让人感到头疼不已的是,Cocos2dx所自带的TestCpp示例 项目,在WP8之上同样存在着相同的问题,这表明并非是你的代码出现了错误书写的情况,而是引擎于WP8平台上的适配的确存在着缺陷,在微软虚拟在线课堂的免费课程当中,我也专门提及过这个容易让人犯错的地方,许多开发者都曾在这里遭遇过挫折。
倘若你所碰到的情形是中文变为方块,那么问题源自字体文件。CCLabelTTF 所指定的 TTF 字体,在 WP8 环境下对中文并不予以支持,举例来说,像系统自身携带的 Marker Felt 或者 Arial 字体,均未涵盖中文字形。因为系统寻觅不到与之对应的汉字图形,所以只好拿方块来充当。
有一个简便的解决办法,那就是替换成能够支持中文的字体。我建议使用arialuni.ttf,也就是Arial Unicode MS,或者Cocos2dx自带的HKYuanMini.ttf。我已经将arialuni.ttf字库上传了,大家能够下载使用。要记得把字库文件放置到游戏工程的Resources\fonts目录下,并且要保证这个文件被打包进了XAP包里。
从这种角度来看,代码调用的方式是比较直接的,具体写成这样:auto label = LabelTTF::create("梅颖广研究Cocos2dx""fonts/arialuni.ttf",36);,只要字体文件路径是正确无误的,那么中文方块问题便能够得到解决。

倘若替换字体之后依旧展现为乱码,那么这便是字符编码出现问题了。这可不是仅仅通过更换字体便能够解决的,而是需要从起始源头展开检查。你首要去做的第一件事情便是确定输出的中文究竟是何种编码格式。
要是在Visual Studio里直接于代码中书写中文,如上述那个语句,那就得查看VS的编码设置。打开File菜单下的Advanced Save Option,会弹出一个对话框。通常存在三种编码选项:Unicode(UTF - 8 without signature)、Unicode(UTF - 8 with signature)以及Chinese Simplified (GB2312)。UTF8的那个signature,所指的便是BOM,也就是Byte Order Mark。
Cocos2dx对此要求处理这样一种 UTF8 编码的字符,一旦不符合就会出现乱码情况。另外,我还发现这样一种状况,当编码选得不够恰当的时候,中文字符会跟后面的标点产生冲突,进而导致出现奇怪的编译错误。经过测试得出,UTF8 no signature 这一形式虽然不需要进行转换,然而却会产生字符干涉方面的问题。所以由此我建议大家采用 GB2312 或者 UTF8 with signature,之后在使用 CCLabelTTF 之前进行 Unicode 到 UTF8 的转换。
在实现Unicode转化为UTF8的众多方式里,有一种是借助iconv库。然而,更为便捷的做法是直接运用Cocos2dx自身所带的转换函数CCUnicodeToUtf8,该函数被定义于CCWinRTUtils.h以及cpp文件之中。其调用的具体举措呈现为这般模样:借助auto label ,经由LabelTTF::create( CCUnicodeToUtf8(L"梅颖广研究Cocos2dx")"fonts/arialuni.ttf", 36)来施予操作。
点开CCUnicodeToUtf8函数,你会发觉,其实际上运用了Windows平台的WideCharToMultiByte函数。此函数仅能在Windows上运行,无法跨平台。要是你谋求代码的跨平台性,能够自行用纯C++编写一个转换函数。关于完美输出中文的函数示例,是这样的:auto label = LabelTTF::create( WStrToUTF8(L"梅颖广研究Cocos2dx")"fonts/arialuni.ttf", 36); ,而且连日文也能进行正确处理,情况是这样:auto label = LabelTTF::create( WStrToUTF8(L"よろしくお願い梅颖广研究")"fonts/arialuni.ttf", 36);。

最末一个平常问题是,在运用CCLabelTTF的自动换行功能之际,中文没办法换行。当你针对create函数给予了dimension参数,期望文字自行换行之时,会发觉中文始终处于同一行上,超出屏幕的那部分径直消失不见了。
根本原因在于,Cocos2dx实现换行功能有着特定方式,其是依靠空格来当做断行依据的。英文句子存在单词间的空格,借此能够正常换行,然而中文句子里字与字之间不存在空格,如此一来引擎便不清楚该于何处进行换行操作了。所以只要是呈现为一大段且不带空格的中文文本,就都会出现无法换行这般的情况。
关于这个问题而言,你得于代码里面手动去处理换行的逻辑,能够在恰当的位置插入换行符,或者自行编写一个依据字符数量来换行的函数,要是你的游戏文本数量不多,也能够直接借助多个LabelTTF去拼接成多行文本。
倘若你已读完这篇文章,那么请回想一下,在你自身项目里所遭遇的中文显示问题呢是不是呈现为方块状或者是出现乱码的情况?你有没有试着去替换字体抑或是对编码格式进行调整?诚挚欢迎你在评论区分享你所拥有的解决经验,麻烦点个赞以便让更多WP8开发者能够看到这篇实战指南。