前言
Torque2D对于汉字的支持可以说目前很差,虽然支持Freetype,但是内部的字符串编码是UTF系列,基本没有Ascii,Unicode这种Win32常用的编码格式.
如果你想让你的程序支持汉字输入,那就要改不少东西,但是如果是显示,那就另当别论了,你可以使用它们提供的LangTable来实现(本人看的吃力,貌似不支持关键字查找,只能索引序列,而且不是按行读取的,不知道它是怎么操作的,难道有什么工具先编译,反正Torque3D有个编译的函数,2D里没有.)
作者们最近忙文件格式和Leap,问了好多次什么时候修好多语言输出输入,都没有给出具体的日程安排.所以还是自己动手,毕竟是MIT的,不能全靠人家.
目标
1: 使用UTF8文本配置一个TextLib,格式为Key=TextContent,一行一个
2: 写一个类,加载和查询文本,从而越过ASCII到UTF8的转换.
3: 在一个控件上测试通过
代码
// ------------------------------------------------------- // 文件名: textbin.h // 描 述: // 日 期: 28/3/2013 // 作 者: KevinYuen // 版 权: Copyright (C) 2011 - All Rights Reserved // 备 注: // ------------------------------------------------------- #include "sim/simBase.h" #include <string> #include <map> #ifndef _TEXTBIN_H_ #define _TEXTBIN_H_ class TextBin : public SimObject { typedef SimObject Parent; public: DECLARE_CONOBJECT( TextBin ); public: TextBin(); virtual ~TextBin(); public: // 设置当前文本库 bool setTextBin( const UTF8* filename ); // 获取文本 const UTF8* getText( const UTF8* id, const UTF8* params ); protected: // 添加文本 void AddCombinText( const U8* text ); protected: typedef std::map<std::string,std::string> TextMap; TextMap mTextMap; }; #endif // ------------------------------------------------------- // 文件名: textbin.cpp // 描 述: // 日 期: 28/3/2013 // 作 者: KevinYuen // 版 权: Copyright (C) 2011 - All Rights Reserved // 备 注: // ------------------------------------------------------- #include "platform/platform.h" #include "io/stream.h" #include "io/fileStream.h" #include "io/resource/resourceManager.h" #include "console/console.h" #include "console/consoleInternal.h" #include "console/ast.h" #include "console/compiler.h" #include "textbin.h" IMPLEMENT_CONOBJECT( TextBin ); TextBin::TextBin() { } TextBin::~TextBin() { } // 设置当前文本库 bool TextBin::setTextBin( const UTF8* filename ) { // 文件读取 Stream* pS = ResourceManager->openStream( (const char*)filename ); if( !pS ) return false; // 历史文本清空 mTextMap.clear(); // 逐行读取 while( pS->getStatus() != Stream::EOS ) { static U8 Buffer[512]; memset( (void*)Buffer, 0, 512 ); pS->readLine( Buffer, 512 ); // 解析 AddCombinText( Buffer ); } return true; } // 获取文本 const UTF8* TextBin::getText( const UTF8* id, const UTF8* params ) { if( !id || id == '\0' ) return ""; TextMap::iterator iter = mTextMap.find( id ); if( iter == mTextMap.end() ) return ""; // 参数后期增加 return iter->second.c_str(); } // 添加文本 void TextBin::AddCombinText( const U8* text ) { std::string CombineStr = text ? (const char*)text : ""; if( CombineStr.empty() ) return; U32 nPos = CombineStr.find( "=" ); if( nPos == std::string::npos ) return; std::string Key = CombineStr.substr( 0, nPos ); std::string Value = CombineStr.substr( nPos+1, CombineStr.size() - 1 ); mTextMap[Key] = Value; } ConsoleMethod( TextBin, setTextBin, bool, 3, 3, "(string) ") { UTF8 scriptFilenameBuffer[1024]; Con::expandPath((char*)scriptFilenameBuffer, sizeof(scriptFilenameBuffer), argv[2]); return object->setTextBin( scriptFilenameBuffer ); } ConsoleMethod( TextBin, getText, const char *, 4, 4, "(string) ") { return (const char*)object->getText( argv[2], argv[3] ); //char *ret; //const char *str; //if( str = (const char*)object->getText( argv[2], argv[3] ) ) //{ // ret = Con::getReturnBuffer(dStrlen(str) + 1); // dStrcpy(ret, str); // return ret; //} //return ""; }
文本
Start=开始 End=结束
测试
function LaunchStage::Language( %this ) { new TextBin( GameText ); GameText.setTextBin( "^Game/assets/languages/text_CN.txt" ); } %startbtn = new GuiButtonCtrl() { canSaveDynamicFields = "0"; HorizSizing = "relative"; class = "LoginStart"; VertSizing = "relative"; isContainer = "0"; Profile = "BlueButtonProfile"; Position = "0 0"; Extent = "300 80"; Visible = "1"; isContainer = "0"; Active = "1"; groupNum = "-1"; buttonType = "PushButton"; useMouseEvents = "0"; text = GameText.getText( "Start", "" ); };