Overlay中文显示

来源:互联网 发布:看股票走势的软件 编辑:程序博客网 时间:2024/06/06 07:50
如何在Ogre中使用中文? 有一种方法是借助CEGUI可以显示中文,具体可以在这儿看到:http://hghhe.blog.163.com/blog/static/32377568200968102726571。 在本篇文章中所要说的是直接使用Ogre显示中文,一般Ogre中的Overlay来显示(当然还有可能会在公告板中用到)。

  在自Ogre1.4版本后,在Ogre中就增加了一个DisplayString用于在字符串中使用unicode字符,这样在程序中就可以使用汉字了。在http://www.cnblogs.com/gogoplayer/archive/2008/11/21/1189874.html这里,我们可以找到一种解决方法,通过在字体脚本中添加中文unicode来显示中文。 下面让我们先从程序开始吧!!

  在Ogre中还有一个类是用于字体的,它就是“Font”了。下面我们来加载一个中文字体:

  1. 创建一个Font(用new来创建当然不是一个好的方法):FontPtr tempFont = FontManager::getSingleton().create("TempFont","General");            -------第一个参数是字体名、第二个参数是字体要加入的资源组
  2. tempFont ->setSource("simhei.ttf");         -------设置字体源(字体文件名,这里加载华文楷体)
  3. tempFont ->setType(FT_TRUETYPE);    -------设置字体类型(这里是"truetype"类型,Ogre支持二种类型,另一种"image"类型可以看这里:http://hghhe.blog.163.com/blog/static/32377568200962484620536)
  4. tempFont ->setTrueTypeSize( 18 );            --------设置字体大小(这里不是显示汉字的大小,而是生成纹理的大小,也就是说如果值越大生成纹理所花的时间也就越多)
  5. tempFont ->setTrueTypeResolution( 96 );  --------设置字体的打印分辨率,一般为96
  6. tempFont ->addCodePointRange(Font::CodePointRange(19968,40869)); --------添加纹理生成范围。19969转成16进制就是0x4E00,这个是汉字'一'对应的unicode编码。40869是unicode编码中最后一个汉字,这个汉字我的输入法没法打出来......   更多关于汉字的unicode编码请看:http://www.chi2ko.com/tool/CJK.htm      如果我们这样指定的话,Ogre就会生成这些汉字纹理,也就是说我们可以在程序中使用所有基本的汉字了。 当然我们还不能使用英文字母,添加:tempFont ->addCodePointRange(Font::CodePointRange(33,255)); 就可以使用英文了。 在实际的应用中还应该加入半角和全角符号的unicode编码范围!!!
  7. 最后一步,tempFont ->load();

   是不是有点麻烦呢? 那就用脚本吧:

SimHei
{
  type truetype
  source simhei.ttf
  size 18
  resolution 96
  code_points 19968-40869 33-255
}   这样我们用脚本的方式实现了上面相同的功能,在Overlay中指定字体就可以了。 如果你把这个脚本放在Ogre的示例框架资源中,你会发现你运行一个小程序,你的程序启动速度也是很慢的!   因为Ogre启动时就把脚本中的字体生成了。。。    我曾因此找了半天原因,冏~~~

   让我们来显示中文吧。可以在overlay脚本中定义TextAreaOverlayElement或在程序中生成(你可能需要添加头文件OgreTextAreaOverlayElement.h),这里假设textElement就是一个TextAreaOverlayElement类型的指针(可以用OverlayManager::getOverlayElement方法获取)。 显示汉字方法如下:textElement->setFontName("TempFont");(用脚本的话就无需这步设置字体了)    DisplayString chaText = L"使用Overlay显示汉字!!";  textElement->setCaption( chaText ); 这样就可以了。

   效率问题...... 为中文生成纹理是一个很慢的过程,特别是生成很多汉字的纹理,unicode汉字编码本来就存在这个问题。在我的电脑上(CPU为AMD4200++,显卡为集成GF 7025),加载这么多汉字用了13秒左右的时间,如果在setTrueTypeSize()中设置值为36的话,就需要25秒多的时间,差别还是有点大哈!! 不过还能接受吧,对帧率的影响也不是很大!

   在程序中我们就可以直接在Overlay中显示自定义汉字了。我们这样做Ogre会先把纹理创建好,而不是在显示汉字的时候才去创建纹理。例如:我们按下一个键,显示另外的一些汉字,它们之间的切换是很迅速的。

   下面发二张我测试时截的图片(空白的地方是标点符号(没有添加标点符号的unicode编码段)或从那里进行的跳行(在String中'\n'是同样有效的)):

在Overlay中显示中文 - 独轮之月 - 听雨阁显示了几百个汉字

在Overlay中显示中文 - 独轮之月 - 听雨阁按下Pause键后显示另一段汉字

 

转载自:http://hghhe.blog.163.com/blog/static/3237756820097192512944/

原创粉丝点击