[cocos2dx笔记005]一个字符串管理配置类

在用vs开发cocos2dx过程中。要显示的中文,要求是UTF-8格式的才干正常显示出来。但VS通常是ANSI格式保存,这样,在代码中写入的中文字符串,执行后。显示的就是乱码。

为了正确显示中文。或支持多语言,我这里定义一个简单的字符串管理类,来满足上述要求。

这个类使用了我的开源码中的XAnsiString和XMap。TextIni这几个类。能够在我的开放代码找到下载。

以下是代码://字符串资源管理器

#ifndef _X_STRING_MANAGER_H_

#define _X_STRING_MANAGER_H_

#include <xstring.h>

#include <xini.h>

#include <xmap.h>

#include <xset.h>

#include <xsingleton.h>

namespace zdh

{

typedef XMap<XAnsiString, XAnsiString> TStringKeyValue;

typedef XMap<XAnsiString, TStringKeyValue> TStringSection;

class XStringMgr

{

public:

XStringMgr()

{}

~XStringMgr()

{

m_Map.Clear();

}

XInt Load(const XAnsiString & paramFileName, bool paramClear = true)

{

if (paramClear) m_Map.Clear();

XIniText stIni;

if (!stIni.Load(paramFileName)) return ERR_FAIL;

for (int i = 0; i < stIni.getSectionCount(); i++)

{

XIniText::TSection * pSection = stIni.getSection(i);

TStringKeyValue & stKeyValue = m_Map[pSection->getSectionName()];

for (int j = 0; j < pSection->getLength(); j++)

{

XIniText::TEntry * pEntry = pSection->getEntry(j);

if (isNULL(pEntry)) continue;

if (pEntry->getEntryType() != EIET_COMMON_ENTRY) continue;

XIniText::TEntryCommon * pCommonEntry = dynamic_cast<XIniText::TEntryCommon *>(pEntry);

if (isNULL(pCommonEntry)) continue;

stKeyValue[pCommonEntry->getKey().getField()] = pCommonEntry->getValue().getField();

}

}

return ERR_OK;

}

//取指定字符串对象。假设不存在,返回NULL

const XAnsiString * getStringEx(const XAnsiString & paramSection, const XAnsiString & paramKey)

{

int iSectionIndex = m_Map.getIndexBykey(paramSection);

if (!m_Map.isValidIndex(iSectionIndex)) return NULL;

const TStringKeyValue & stKeyValue = m_Map.getValue(iSectionIndex);

int iValueIndex = stKeyValue.getIndexBykey(paramKey);

if (!stKeyValue.isValidIndex(iValueIndex)) return NULL;

return &stKeyValue.getValue(iValueIndex);

}

//取指定的字符串,假设不存在,则返回空串

const char * getString(const XAnsiString & paramSection, const XAnsiString & paramKey)

{

const XAnsiString * pRet = getStringEx(paramSection, paramKey);

if (isNULL(pRet)) return "";

else return pRet->c_str();

}

const TStringSection & getMap() const

{

return m_Map;

}

private:

TStringSection m_Map;

};

}

#define STRING_MGR zdh::XSingletonSample<zdh::XStringMgr, 0>::getInstance()

#define STRING_SECTION_MAIN "main"

#define STRING_PLAY (STRING_MGR->getString(STRING_SECTION_MAIN, "play"))

#define STRING_FONT (STRING_MGR->getString(STRING_SECTION_MAIN, "font"))

#endif

使用样例

XAnsiString strStringMgrFileName("string_zh.ini");

if (zdh::isNotOK(STRING_MGR->Load(strStringMgrFileName)))

{

STREAM_INFO << "load "<<strStringMgrFileName << "Fail!";

return false;

}

else

{

STREAM_INFO << "Load String:" << STRING_PLAY;

}

时间: 2024-10-27 18:30:23

[cocos2dx笔记005]一个字符串管理配置类的相关文章

[cocos2dx笔记014]一个用于cocos2dx的对象智能指针模板

现在C++智能指针有无数个实现了,多一个也无所谓.哈. 这个智能指针是专门为cocos2dx 2.2.x定制的.主要是为了方便使用,同时又要遵循现有的cocos2dx的内存管理.特实现这样一个智能指针.在使用的时候不需要考虑retain或release操作,也不需要new或delete操作! 下面是实现代码 //在很多时候,类的成员是CCObject的子对象,为了保证对其正常使用,又要遵循cocos2dx的内存管理,特实现了这样的一个智能指针,方便使用. #ifndef _X_COCOS_PTR

[cocos2dx笔记007]一个自定义场景切换的实例

cocos2dx框架已经提供了很多场景切换的类,但是一些自定义的场景切换,只有自己实现了.下面是实现的类.这里设计的分辨率是750*500.请根据实际的要求调整. 头文件 #ifndef _TRANSITION_GAME_H_ #define _TRANSITION_GAME_H_ #include <cocos2d.h> namespace cocos2d { class CCTransitionGame : public CCTransitionScene { public: CCTran

毕向东Java视频学习笔记【Day15 字符串+StringBuffer+StringBuilder类基础】

.01 string类特点 String类的特点: 字符串对象一旦被初始化就不可以被改变. 面试题 String s = "abc"; String s1 = NEW String ("abc"); System.out.println(s==s1); 输出false表示这两个字符串地址是不是相等的,为什么? 答:第一个是在字符串常量池中创建了abc字符串并且赋给了引用型变量s 第二个是在堆内存中用new的方式创建了string对象 并且在new的时候接受了一个字符

[cocos2dx笔记013]一个使用CCRenderTexture创建动态纹理显示数字的类

用CCLabelTTF显示的数字不好看.于是就想到用图片来代理.眼下网上的实现都是把每一个数字做一个CCSprite组合的方式. 可是我想.动态生成纹理的方式.没有就仅仅好自己手动写一个. 头文件 #ifndef _X_NUMBER_H_ #define _X_NUMBER_H_ #include <cocos2d.h> #include <xtype.h> namespace cocos2d { //基于图片显示的数字 /* 这个类不是用一个一个数字拼起来,而是渲染成一个独立的纹

struts2学习笔记——第一个struts2应用配置

说实在的,随着Java学习的不断深入,特别是Java web框架部分,调bug让人很心累,但是每征服一个bug,内心的成就感也是难以言说的.第一个struts2应用的配置,我昨天折腾了快2个小时,最后还是放弃了,今天在摸索之下,终于打通了第一个struts2的任督二脉,下来就把我个人的配置过程写下来,希望后面学习的java友少走的弯路. 一.创建web工程(eclipse k kepler版本): 直接上图: 二.导入struts2关键包 1.需要导入的关键包,不导入这些包会导致报错,我就知bu

[cocos2dx笔记012]一定简易的UI配置类

使用cocostudio可以装载编辑好的UI,但是过于复杂.特别是在加截UI后,发现触屏事件有些问题.如果直接使用程序写死加载UI又过于麻烦.花点时间,增加了一个基于ini的UI配置类,目前只实现了CCSprite和plist的加载.其它的可以后面慢慢加 头文件 #ifndef _X_UI_H_ #define _X_UI_H_ #include <cocos2d.h> namespace zdh { USING_NS_CC; void CreateByXUI(CCNode * paramPa

[cocos2dx笔记008]cocos2d 用luabridge手动绑定类

基于cocos2dx 2.2.2版本.这几天使用了cocostudio实现了,动画,骨骼动画,UI编辑,粒子效果,虽然有些不足,但已经算是非常好了.今天尝试用lua,这个非常简单,创建的时候,设置语言为lua,那就可以创建lua工程. 在cocos2d-x-2.2.2\tools\project-creator下运行: python create_project.py -project test_lua -package com.android.zdhsoft -language lua xco

[cocos2dx笔记010]用于UI的事件管理器

cocos2dx有一个编辑器:cocostudio,目前来说,已经是比较好用了,只要加载导出的资源,就可以用上了.省去手动搭建面的麻烦.但是,很多需要事件的地方,操作比较麻烦,所以这里提供一个事件管理器来集中和简化管理事件.对于C++事件委托方面,我这里使用了是FastDelegate(注:一个牛人写的).下面是具体实现的代理,不多. /* UI触摸事件管理器. 原有cocos2dx带的触摸事件,每次监听要操作的步骤比较多,为此增加了一个事件管理器,来集中和简化管理 */ #ifndef _X_

通用字符串管理类

1 import java.text.NumberFormat; 2 3 /** 4 * Created by Charlie on 2016/12/6. 5 * 通用字符串管理类 6 */ 7 public class StringUtils { 8 9 /** 10 * 将double转为数值,并最多保留num位小数.例如当num为2时,1.268为1.27,1.2仍为1.2:1仍为1,而非1.00;100.00则返回100. 11 * 12 * @param d 13 * @param n