zoukankan      html  css  js  c++  java
  • Torque2D MIT 学习笔记(23) 编写自己的多语言文本库

    前言

      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", "" );
          };
    

     效果

  • 相关阅读:
    这就是搜索引擎--读书笔记六--索引的查询
    这就是搜索引擎--读书笔记五--索引的建立与更新
    JavaWeb学习总结第四篇--Servlet开发
    算法帝国--读书笔记
    这就是搜索引擎--读书笔记四--索引基础
    这就是搜索引擎--读书笔记三
    Python学习总结之五 -- 入门函数式编程
    ASP.NET-FineUI开发实践-4(二)
    ASP.NET-FineUI开发实践-4
    ASP.NET-FineUI开发实践-3
  • 原文地址:https://www.cnblogs.com/KevinYuen/p/2987795.html
Copyright © 2011-2022 走看看