Cocos2d-x 中简体繁体转换,我的曲折实现之旅-新闻详情

Cocos2d-x 中简体繁体转换,我的曲折实现之旅


发布时间:2016-11-29责任编辑:朱明 浏览:7791


接到公司新任务,要求游戏中加入简繁切换功能,因为自己之前没有这方面的技术储备,还有些许小兴奋。先在网上咨询了一些码友,大多给的意见就是准备两套资源,对于不同的文字加载不同的资源,对于这个结果还是有点小失望的。 简单一琢磨这个功能,觉得这是个不小的工作量,罗列一下方案:

  1. 修改引擎源代码,编写能简繁转换的函数。优点:工作量小,仅需修改部分代码就能做到且换简繁功能;缺点:技术难度高,目前网上找的资料都无法满足,界面上的所有文字均进行转化,运行效率会降低,主要可能体现在界面卡顿;

  2. 打一个包,集成切换简繁字体功能,包内备有两套UI资源,及两套含有文字的文件资源,切换简繁字体时,切换加载的界面。优点:方便实现;缺点:工作量巨大,牵扯到UI的编辑以及代码中所有界面的调用,包体较大;

  3.  打两个包,分别加载对应的简繁字体。优点:包体较小,方便实现;缺点:需要推出多个包,维护,推广等较麻烦;

    就以上三个方案,还是觉得方案1可行,虽然比较有挑战性,也不支持添加英文、日文等其他语言,但更符合现在的状况,于是开始研究方案1;

 

第一阶段:

考虑代码实现简体切换成繁体,很自然就想到了字符编码转换;

于是开始学习汉字编码,参考了好多网页,想了解自己去网上搜索,案例有很多,简单举例;

 VC----实现汉字简繁转换  地址:http://blog.csdn.net/yf210yf/article/details/7850472

实时切换big5/gb2312简繁体  地址:http://www.blueidea.com/tech/program/2003/103.asp

cocos2d中使用了UTF-8编码,需要转换成GB3212,再转化成Unicode,再转化成big5,再转化为UTF-8;好麻烦,尝试了多次,均已失败告终;

第二阶段

无意中发现了另外一种方法,就是用两个字库,一部分是简体,另一部分是一一对应的繁体;如下:

简体:“皑蔼碍爱翱袄奥坝罢摆败颁办绊帮绑”

繁体:“皚藹礙愛翺襖奧壩罷擺敗頒辦絆幫綁”

写入时遍历所有文字,一一去简体中对应找到位置,取繁体字库中对应的汉字再重新组起来,考虑可以实现功能,上代码:

在源代码CClabel.cpp中修改如下:

 

bool Label::b_isfan = true;//静态变量用于切换简体繁体

void Label::setString(const std::string& text)

{

    if (text.compare(_utf8Text))

    {

        if (Label::b_isfan)

        {

            _utf8Text = conver(text.c_str());

        }

        else

        {

            _utf8Text = text;

        }

        _contentDirty = true;

 

        std::u16string utf16String;

        if (StringUtils::UTF8ToUTF16(_utf8Text, utf16String))

        {

            _utf16Text  = utf16String;

        }

    }

}

 

 

std::string Label::conver(const char*str)

{

//==========下边这部分是初始化字库,建议放到外面初始化=======

    std::string _fan = "";

    std::string _jian = "";

 

    {

        ssize_t nSize = 0;

        char* pBuffer = (char*)CCFileUtils::getInstance()->getFileData("zikujian.txt", "rb", &nSize);

        string buff;

        buff.assign(pBuffer);

        _jian = buff;

    }

    {

        ssize_t nSize = 0;

        char* pBuffer = (char*)CCFileUtils::getInstance()->getFileData("zikufan.txt", "rb", &nSize);

        string buff;

        buff.assign(pBuffer);

        _fan = buff;

    }

//==================================

    std::string str_t = "";

 

    for (int i = 0; i < strlen(str);)

    {

        if (str[i]>0)//字母,符号

        {

            str_t += str[i];

            i++;

        }

        else{

            bool ishave = false;

            for (int j = 0; j < _jian.length(); j += 3)//cocos中存储汉字占用了三个位置

            {

                //对比字符

                if (str[i] == _jian[j] && str[i + 1] == _jian[j + 1] && str[i + 2] == _jian[j + 2])

                {

                    ishave = true;

                    str_t += _fan[j];

                    str_t += _fan[j + 1];

                    str_t += _fan[j + 2];

                    //赋值

                    break;

                }

            }

            if (!ishave)//若没找到则直接赋值

            {

                str_t += str[i];

                str_t += str[i + 1];

                str_t += str[i + 2];

            }

            i += 3;

        }

 

    }

    return str_t;

}

 

第三阶段:

功能实现后立马尝试,项目中所有的字体都变成了繁体,成功啦,哈哈;好激动;赶紧移植到自己的项目实验一下效率,于是开始了漫长的编译过程,编译成功后怀着激动的心情开始了游戏,我擦,怎么所有的繁体都不显示,这才意识到,damo中使用了cocos提供的 arial.ttf字体文件,而游戏中使用了自己的 ttf文件并不包含繁体字,且繁体和简体是分开的,想要实现还要考虑加载不同的字体文件,改吧:

 

void Label::setString(const std::string& text)

{

    if (text.compare(_utf8Text))

    {

        if (Label::b_isfan)

        {

            _fontConfig.fontFilePath = "cocos/Fonts/fanti.TTF";

            this->setTTFConfig(_fontConfig);

            //转化一下

            _utf8Text = conver(text.c_str());

        }

        else

        {

            _utf8Text = text;

        }

        _contentDirty = true;

 

        std::u16string utf16String;

        if (StringUtils::UTF8ToUTF16(_utf8Text, utf16String))

        {

            _utf16Text  = utf16String;

        }

    }

}



第四阶段:

又是漫长的编译,打开后令人崩溃的事情还是发生了,繁体依然没有显示,难道字体有问题?尝试用了一下繁体字体,可以显示,没问题;

Cocos2d-x 中简体繁体转换,我的曲折实现之旅1.png

等等,明明输入了简体中文,却显示了繁体,啊..啊..啊!!!幡然醒悟,蓝瘦、香菇!!!这个时候想到了一个网上较火的视频,大家可以看一下,和我的感觉是一样一样地:http://neihanshequ.com/p52052657264/

于是默默的该了下代码;

void Label::setString(const std::string& text)

{

    if (text.compare(_utf8Text))

    {

        if (Label::b_isfan)

        {

            _fontConfig.fontFilePath = "cocos/Fonts/fanti.TTF";

            this->setTTFConfig(_fontConfig);         

        }        

         _utf8Text = text;

        _contentDirty = true;

 

        std::u16string utf16String;

        if (StringUtils::UTF8ToUTF16(_utf8Text, utf16String))

        {

            _utf16Text  = utf16String;

        }

    }

}



漫长的编译...好了,一个简繁功能实现了。写了这么多没用的东西,是不是有点坑?好吧,我被坑了,也坑你们一把!哈哈



如果确实用到了这个简繁功能,我把字库直接贴在这,方便你们使用:

简体:

皑蔼碍爱翱袄奥坝罢摆败颁办绊帮绑镑谤剥饱宝报鲍辈贝钡狈备惫绷笔毕毙币闭边编贬变辩辫标鳖别瘪濒滨宾摈饼并拨钵铂驳卜补财参蚕残惭惨灿苍舱仓沧厕侧册测层诧搀掺蝉馋谗缠铲产阐颤场尝长偿肠厂畅钞车彻尘沉陈衬撑称惩诚骋痴迟驰耻齿炽冲冲虫宠畴踌筹绸丑橱厨锄雏础储触处传疮闯创锤纯绰辞词赐聪葱囱从丛凑蹿窜错达带贷担单郸掸胆惮诞弹当挡党荡档捣岛祷导盗灯邓敌涤递缔颠点垫电淀钓调迭谍叠钉顶锭订丢东动栋冻斗犊独读赌镀锻断缎兑队对吨顿钝夺堕鹅额讹恶饿儿尔饵贰发罚阀珐矾钒烦范贩饭访纺飞诽废费纷坟奋愤粪丰枫锋风疯冯缝讽凤肤辐抚辅赋复负讣妇缚该钙盖干赶秆赣冈刚钢纲岗皋镐搁鸽阁铬个给龚宫巩贡钩沟构购够蛊顾剐关观馆惯贯广规硅归龟闺轨诡柜贵刽辊滚锅国过骇韩汉号阂鹤贺横轰鸿红后壶护沪户哗华画划话怀坏欢环还缓换唤痪焕涣黄谎挥辉毁贿秽会烩汇讳诲绘荤浑伙获货祸击机积饥讥鸡绩缉极辑级挤几蓟剂济计记际继纪夹荚颊贾钾价驾歼监坚笺间艰缄茧检碱硷拣捡简俭减荐槛鉴践贱见键舰剑饯渐溅涧将浆蒋桨奖讲酱胶浇骄娇搅铰矫侥脚饺缴绞轿较秸阶节茎鲸惊经颈静镜径痉竞净纠厩旧驹举据锯惧剧鹃绢杰洁结诫届紧锦仅谨进晋烬尽劲荆觉决诀绝钧军骏开凯颗壳课垦恳抠库裤夸块侩宽矿旷况亏岿窥馈溃扩阔蜡腊莱来赖蓝栏拦篮阑兰澜谰揽览懒缆烂滥捞劳涝乐镭垒类泪篱离里鲤礼丽厉励砾历沥隶俩联莲连镰怜涟帘敛脸链恋炼练粮凉两辆谅疗辽镣猎临邻鳞凛赁龄铃凌灵岭领馏刘龙聋咙笼垄拢陇楼娄搂篓芦卢颅庐炉掳卤虏鲁赂禄录陆驴吕铝侣屡缕虑滤绿峦挛孪滦乱抡轮伦仑沦纶论萝罗逻锣箩骡骆络妈玛码蚂马骂吗买麦卖迈脉瞒馒蛮满谩猫锚铆贸么霉没镁门闷们锰梦谜弥觅幂绵缅庙灭悯闽鸣铭谬谋亩钠纳难挠脑恼闹馁内拟腻撵捻酿鸟聂啮镊镍柠狞宁拧泞钮纽脓浓农疟诺欧鸥殴呕沤盘庞赔喷鹏骗飘频贫苹凭评泼颇扑铺朴谱栖凄脐齐骑岂启气弃讫牵扦钎铅迁签谦钱钳潜浅谴堑枪呛墙蔷强抢锹桥乔侨翘窍窃钦亲寝轻氢倾顷请庆琼穷趋区躯驱龋颧权劝却鹊确让饶扰绕热韧认纫荣绒软锐闰润洒萨鳃赛叁伞丧骚扫涩杀纱筛晒删闪陕赡缮伤赏烧绍赊摄慑设绅审婶肾渗声绳胜圣师狮湿诗尸时蚀实识驶势适释饰视试寿兽枢输书赎属术树竖数帅双谁税顺说硕烁丝饲耸怂颂讼诵擞苏诉肃虽随绥岁孙损笋缩琐锁獭挞抬态摊贪瘫滩坛谭谈叹汤烫涛绦讨腾誊锑题体屉条贴铁厅听烃铜统头秃图涂团颓蜕脱鸵驮驼椭洼袜弯湾顽万网韦违围为潍维苇伟伪纬喂谓卫温闻纹稳问瓮挝蜗涡窝卧呜钨乌污诬无芜吴坞雾务误锡牺袭习铣戏细虾辖峡侠狭厦吓锨鲜纤咸贤衔闲显险现献县馅羡宪线厢镶乡详响项萧嚣销晓啸蝎协挟携胁谐写泻谢锌衅兴汹锈绣虚嘘须许叙绪续轩悬选癣绚学勋询寻驯训讯逊压鸦鸭哑亚讶阉烟盐严颜阎艳厌砚彦谚验鸯杨扬疡阳痒养样瑶摇尧遥窑谣药爷页业叶医铱颐遗仪彝蚁艺亿忆义诣议谊译异绎荫阴银饮隐樱婴鹰应缨莹萤营荧蝇赢颖哟拥佣痈踊咏涌优忧邮铀犹游诱舆鱼渔娱与屿语吁御狱誉预驭鸳渊辕园员圆缘远愿约跃钥岳粤悦阅云郧匀陨运蕴酝晕韵杂灾载攒暂赞赃脏凿枣灶责择则泽贼赠扎札轧铡闸栅诈斋债毡盏斩辗崭栈战绽张涨帐账胀赵蛰辙锗这贞针侦诊镇阵挣睁狰争帧郑证织职执纸挚掷帜质滞钟终种肿众诌轴皱昼骤猪诸诛烛瞩嘱贮铸筑驻专砖转赚桩庄装妆壮状锥赘坠缀谆着浊兹资渍踪综总纵邹诅组钻

繁体:

皚藹礙愛翺襖奧壩罷擺敗頒辦絆幫綁鎊謗剝飽寶報鮑輩貝鋇狽備憊繃筆畢斃幣閉邊編貶變辯辮標鼈別癟瀕濱賓擯餅並撥缽鉑駁蔔補財參蠶殘慚慘燦蒼艙倉滄廁側冊測層詫攙摻蟬饞讒纏鏟産闡顫場嘗長償腸廠暢鈔車徹塵沈陳襯撐稱懲誠騁癡遲馳恥齒熾衝沖蟲寵疇躊籌綢醜櫥廚鋤雛礎儲觸處傳瘡闖創錘純綽辭詞賜聰蔥囪從叢湊躥竄錯達帶貸擔單鄲撣膽憚誕彈當擋黨蕩檔搗島禱導盜燈鄧敵滌遞締顛點墊電澱釣調叠諜疊釘頂錠訂丟東動棟凍鬥犢獨讀賭鍍鍛斷緞兌隊對噸頓鈍奪墮鵝額訛惡餓兒爾餌貳發罰閥琺礬釩煩範販飯訪紡飛誹廢費紛墳奮憤糞豐楓鋒風瘋馮縫諷鳳膚輻撫輔賦複負訃婦縛該鈣蓋幹趕稈贛岡剛鋼綱崗臯鎬擱鴿閣鉻個給龔宮鞏貢鈎溝構購夠蠱顧剮關觀館慣貫廣規矽歸龜閨軌詭櫃貴劊輥滾鍋國過駭韓漢號閡鶴賀橫轟鴻紅後壺護滬戶嘩華畫劃話懷壞歡環還緩換喚瘓煥渙黃謊揮輝毀賄穢會燴彙諱誨繪葷渾夥獲貨禍擊機積饑譏雞績緝極輯級擠幾薊劑濟計記際繼紀夾莢頰賈鉀價駕殲監堅箋間艱緘繭檢堿鹼揀撿簡儉減薦檻鑒踐賤見鍵艦劍餞漸濺澗將漿蔣槳獎講醬膠澆驕嬌攪鉸矯僥腳餃繳絞轎較稭階節莖鯨驚經頸靜鏡徑痙競淨糾廄舊駒舉據鋸懼劇鵑絹傑潔結誡屆緊錦僅謹進晉燼盡勁荊覺決訣絕鈞軍駿開凱顆殼課墾懇摳庫褲誇塊儈寬礦曠況虧巋窺饋潰擴闊蠟臘萊來賴藍欄攔籃闌蘭瀾讕攬覽懶纜爛濫撈勞澇樂鐳壘類淚籬離裏鯉禮麗厲勵礫曆瀝隸倆聯蓮連鐮憐漣簾斂臉鏈戀煉練糧涼兩輛諒療遼鐐獵臨鄰鱗凜賃齡鈴淩靈嶺領餾劉龍聾嚨籠壟攏隴樓婁摟簍蘆盧顱廬爐擄鹵虜魯賂祿錄陸驢呂鋁侶屢縷慮濾綠巒攣孿灤亂掄輪倫侖淪綸論蘿羅邏鑼籮騾駱絡媽瑪碼螞馬罵嗎買麥賣邁脈瞞饅蠻滿謾貓錨鉚貿麽黴沒鎂門悶們錳夢謎彌覓冪綿緬廟滅憫閩鳴銘謬謀畝鈉納難撓腦惱鬧餒內擬膩攆撚釀鳥聶齧鑷鎳檸獰甯擰濘鈕紐膿濃農瘧諾歐鷗毆嘔漚盤龐賠噴鵬騙飄頻貧蘋憑評潑頗撲鋪樸譜棲淒臍齊騎豈啓氣棄訖牽扡釺鉛遷簽謙錢鉗潛淺譴塹槍嗆牆薔強搶鍬橋喬僑翹竅竊欽親寢輕氫傾頃請慶瓊窮趨區軀驅齲顴權勸卻鵲確讓饒擾繞熱韌認紉榮絨軟銳閏潤灑薩鰓賽三傘喪騷掃澀殺紗篩曬刪閃陝贍繕傷賞燒紹賒攝懾設紳審嬸腎滲聲繩勝聖師獅濕詩屍時蝕實識駛勢適釋飾視試壽獸樞輸書贖屬術樹豎數帥雙誰稅順說碩爍絲飼聳慫頌訟誦擻蘇訴肅雖隨綏歲孫損筍縮瑣鎖獺撻擡態攤貪癱灘壇譚談歎湯燙濤縧討騰謄銻題體屜條貼鐵廳聽烴銅統頭禿圖塗團頹蛻脫鴕馱駝橢窪襪彎灣頑萬網韋違圍爲濰維葦偉僞緯餵謂衛溫聞紋穩問甕撾蝸渦窩臥嗚鎢烏汙誣無蕪吳塢霧務誤錫犧襲習銑戲細蝦轄峽俠狹廈嚇鍁鮮纖鹹賢銜閑顯險現獻縣餡羨憲線廂鑲鄉詳響項蕭囂銷曉嘯蠍協挾攜脅諧寫瀉謝鋅釁興洶鏽繡虛噓須許敘緒續軒懸選癬絢學勳詢尋馴訓訊遜壓鴉鴨啞亞訝閹煙鹽嚴顔閻豔厭硯彥諺驗鴦楊揚瘍陽癢養樣瑤搖堯遙窯謠藥爺頁業葉醫銥頤遺儀彜蟻藝億憶義詣議誼譯異繹蔭陰銀飲隱櫻嬰鷹應纓瑩螢營熒蠅贏穎喲擁傭癰踴詠湧優憂郵鈾猶遊誘輿魚漁娛與嶼語籲禦獄譽預馭鴛淵轅園員圓緣遠願約躍鑰嶽粵悅閱雲鄖勻隕運蘊醞暈韻雜災載攢暫贊贓髒鑿棗竈責擇則澤賊贈紮劄軋鍘閘柵詐齋債氈盞斬輾嶄棧戰綻張漲帳賬脹趙蟄轍鍺這貞針偵診鎮陣掙睜猙爭幀鄭證織職執紙摯擲幟質滯鍾終種腫衆謅軸皺晝驟豬諸誅燭矚囑貯鑄築駐專磚轉賺樁莊裝妝壯狀錐贅墜綴諄著濁茲資漬蹤綜總縱鄒詛組鑽

 

春秋工作室   供稿