Virtools显示中文

virtools中能显示中文的bb只有textdisplay,但很多时候并不能满足我们的需求。一般显示文字用的bb是2D Text和3D Text,这2个bb的源代码位于Sdk\Samples\Behaviors\Interface下的Interface项目中。

现在来分析2D Text和3D Text是怎么显示字符的。

在使用2D Text和3D Text前需要使用Create System Font这个bb来创建一个Font。创建的步骤是:

1、用CKFontManager::CreateTextureFromFont方法创建一个字体图片CKTexture对象,该texture包含了一张每个字符用某种字体显示的图片。具体实现方法是使用DrawText这个windows api函数将字符画在texture图片上。具体处理方法是以每个字符占用相同的区域依次排列画在一张图片上的。

2、用CKFontManager::CreateTextureFont方法根据刚才创建的CKTexture对象来创建一个CKTextureFont对象并对其初始化,使用CKTextureFont::CreateCKFont方法来初始化,初始化的过程中将记录每个字符在前面创建的字体图片CKTexture的位置和宽高,这些信息保存在CKTextureFont的CharacterTextureCoordinates数组m_FontCoordinates中。

至此Create System Font执行完成,它创建了一个保存了字符显示图片的字体图片CKTexture和一个保存了各个字符在字体图片CKTexture中的位置和宽高的CKTextureFont。

下面到使用2D Text和3D Text来显示字符了。

2D Text和3D Text是调用CKTextureFont::DrawCKText方法来显示文字的。该方法又会调用CKTextureFont::DrawString或CKTextureFont::DrawStringShadowed来显示字符,具体的显示方法是,创建一个VxDrawPrimitiveData对象,再获取每个字符的CharacterTextureCoordinates对象,将这些字符的位置和宽高信息写入VxDrawPrimitiveData对象,最后调用CKRenderContext::DrawPrimitive来显示。

这样字符就显示出来了。

显示方法就是将所有字符画在一张图片上,并记录每个字符在图片的区域,再使用vt的Render来显示。

理清了流程就可以发现,只要在生成字体图片CKTexture时生成包含中文的texture,并在CKTextureFont保存每个字符在texture中的位置,最后在显示的时候能取到每个字符在texture中对应的区域,就可以显示汉字了。还需要从逻辑上保证字体图片字符与CharacterTextureCoordinates和显示时字符编码三者之间的对应关系,一种处理方法是字体图片按照字符编码(如:gb2312)表从左到右,从上到下依次画字符,CharacterTextureCoordinates数组也按照字符编码表从左到右,从上到下依次保存每个字符,这样在显示时就可以按照字符的编码根据字符编码表算出该字符在字符编码表中按从左到右,从上到下的顺序的序号了,根据这个序号就可以获取CharacterTextureCoordinates了。

posted on 2010-12-31 15:45  漫步人生  阅读(1206)  评论(0编辑  收藏  举报