冒险解谜游戏中文网 ChinaAVG

标题: 【汉化资料】开源的图形渲染引擎OGRE(2) --让OGRE支持中文 [打印本页]

作者: shane007    时间: 2008-10-22 16:02
标题: 【汉化资料】开源的图形渲染引擎OGRE(2) --让OGRE支持中文
如何修改字幕输出函数,也许这篇文章可以参考。" _$ G( v( S# X, I  j

9 M+ l, G/ d3 ~
( S6 ]  J0 j$ @; C让OGRE支持中文 (转贴)  I. G( L/ H! E: t

+ i  X# ~$ u5 b( A, p9 g( f$ {1 o* P. t9 P, d+ j
0.前言:. V: S( W4 L0 j: z1 ], h
本人非计算机专业,凭着爱好和一腔热血混入游戏开发大军候补小队,平面尚未钻透。为赶时髦,企图叛变到3D阵营,慌乱之中捡起“OGRE”。学到如今,亦可让正方体飞机等不明物体在三次元空间胡乱打转。但觉得本引擎不支持中文显示而感到不爽,便四处寻求高人指教,但大部分高人指点说:“自己写引擎算了。”衡量了一下自己份量,觉得“自己写”这件事十年内恐尚难做到。再后来找到3DCastle论坛,经过“bug王”以及“浪客☆龙猫” 两位前辈的指点,也通过高手“renwind”遗留下来的教程,误打误撞竟然自己改出了中文支持,兴奋之余便想写点东西留点纪念。! _0 {( C" N2 Y# a0 a
1.准备工作; ]6 N+ D( A+ f" r, u
“bug王”已经通过WINAPI实现了OGRE在Direct7.0下的中文支持,也有高手说这样效率不高,更因为本人基本上是不怎么熟悉WINAPI的,所以就放弃了这种方法。企图直接通过贴图来实现中文显示,毕竟OGRE本身文字输出也是用的这种办法,更好的是OGRE引擎除了普通的“ttf”字体外还支持位图字体(其实“ttf”在引擎中也被Ogre::Font::createTextureFromFont()转换成位图了),基本上就是做一个很大很大的图片,然后上面画满汉字,直接读进去就可以了,问题也就变成了——如何找这个大图片。
; Z5 K- w: O  L6 {( t' G+ j. t  B幸好GBA游戏的开发者们已经找到了很好的文字来源和取得方法,通过金山的16*16点阵字库得到接近9000个字模,然后通过程序读出并写到2048*2048的单色位图上,转换成“png”格式图片才221k。$ p% Q6 {( Z7 H, Z! @, Q' P
2.基本知识4 H4 k7 M+ h. X# ?3 y5 _: v  @2 @
修改引擎之前,我们先要知道OGRE是如何显示字体的。OGRE本身面向对象的设计和自带文档都做得非常规范漂亮,很容易就能找到关于显示文字的类以及相关函数。在这里主要看一下关于位图字体是如何显示在画面上。(1)字体的读取。# O9 p' N  n4 b  D" Q
和这项功能相关的有两个类,一个是Ogre::FontManager类,负责分析字体信息(*.fontdef)文件。然后用builder模式构建一个Ogre::Font类。在Font类中最重要的数据莫过于mTexCoords_u1、mTexCoords_u2、mTexCoords_v1、mTexCoords_v2这四个数组,他们分别用来储存不同文字对应在图片上的纹理坐标。 不过数组大小明显不够储存9000个汉字的,一会儿要改的。+ P  z  K1 W8 B! q+ S6 q4 A3 y
(2)字体的显示。
0 o$ h$ c! C" n3 P4 S" f好像字体显示中用得较多的是Ogre::TextAreaGuiElement类,不过好像还有其他的,我们在这里只看这个吧,估计其他的也大同小异。看了看好像唯一和显示字体有关的函数就是void TextAreaGuiElement::updateGeometry()了,基本上就是根据要写到屏幕上的字串,在Ogre::Font类中得到相应的贴图坐标和贴图,然后画上去,道理也不是很难。* d8 n! y5 I+ Q
3.动手术5 B0 x( S  z. ~8 D+ s. ?$ q
目标锁定到Ogre::Font,Ogre::FontManager,Ogre::TextAreaGuiElement三个类中,把所有文件备份一遍手术开始!7 `9 Z8 E1 A, w2 H
(1) Ogre::Font类。
: q# ]8 `4 Z5 y" {首先是储存文字贴图坐标的数组的大小不够,原来定义的是——宽字符集 (1024 - 32)、ASCII(256 - 32)。这点点大小怎么够我近9000字大军进入,索性都改成(9030 - 32)。还有就是set和get文字贴图的id都是char类型数据,256个id也不够分配给汉字,看来要都改成unsigned long形(其实大部分机器上int也是32位,不过long是固定32位的类型,感觉统用点)。
7 I" k; G$ ^- S. q! c(2) Ogre::FontManager类。
4 F  k: j; O+ J7 X0 @里面从脚本文件中解析贴图坐标的方法是根据单字符的方式,为支持汉字,改成同时可以分析int的。一个汉字对应数字是他的区位码+161(前160个留给了半角字)。
( S* e; O0 P6 N" s7 ~9 {, C# M(3) Ogre::TextAreaGuiElement类。* d/ \0 U) M& N5 O
这个是相对比较麻烦的,他要从字串中分辨出到半角字和中文。在这里增加一个std::vector<unsigned long> caption,用来储存分辨的结果。增加以下几行。
, M2 [  `  F( m5 N- W9 ]( D9 R; nstd::vector<unsigned long> caption;
6 n) t% u. u8 w  G# X  Yunsigned char nTemp;" f! y- d6 Y; n4 Z  F% x& ~
String::iterator it=mCaption.begin();
) s$ \. H7 r/ j: E& H  y0 ~8 Xfor(;it!=mCaption.end();++it)
. v1 p, f1 M# B+ e& E0 P& z{, K3 u, L. T! t% z
if(unsigned char(*it)<=160)//如果是半角  P$ Z/ Z- ^1 C
{
9 n2 B) h- T/ j/ l1 D' jcaption.push_back((unsigned char)*it);' M& n5 ]0 y6 Q9 r8 a  k
}+ V4 m* W- N3 V. B; ^" ]6 S! s
else//处理全角字符8 E7 n! `/ o4 ?" S
{
( V% o- l; Z8 dnTemp=(unsigned char)(*it);6 C2 M- a' D! R, B8 ^' ~: O. {
++it;
6 L. k3 N  G4 _2 a9 s' {5 W  q2 L( l9 Tif(it==mCaption.end())
1 H* ~1 S9 I/ T# C( k5 Cbreak;" T7 b8 A7 S2 E2 x  ?6 Z
//下面是得到区位码+161的公式。
6 r/ ^. i& q1 }( C; x4 kcaption.push_back((94*(nTemp-0xa0-1)+((unsigned char)(*it)-0xa0-1))+161);! }$ a) n4 e2 p9 w, E1 z- \
}3 H$ q' l! D; @2 ?
}' Z9 h- F# T& S5 f, i& n/ D
然后后面所有关于mCaption的地方都用caption代替就ok了。
( Y  Y" w, R- r" O4.结果。- m% c4 @$ O+ A1 r
在OpenGL和DX9.0中成功的支持了中文,但是DX7.0中竟然出现了运行错误,具体问题还不清楚,还望各位高手指教。
1 {' N" z6 X  L! i$ |- R因为字体本身原因,文字很扁平的不好看,索性又改了改Ogre::Font,Ogre::FontManager两个类,实现脚本中支持修改文字纵横比例的系数的proportion,当这个值设置为0.8的时候比较好看了。% A5 \  j# j! n6 Z/ ~. ~6 j5 B' W
. R% W* c6 t- R, U% s) u( M
' @4 h5 e5 M4 w& o4 a* ^2 `% y
相关文件
+ W5 ]1 O. h/ U- a- u% j4 tchinese.fontdef//字体信息文件 放在资源文件加中" e6 S% p( ~# t) y" q5 e* y" }$ k
font.png//字体图片 放在资源文件加中: j9 d6 q+ _- J  f
, Y) P( o$ s2 f4 @2 g( @6 F+ H
OgreFont.cpp! p3 |1 q6 c1 b  }3 p# T
OgreFont.h$ Z, S& h, ~5 b- J6 f
OgreFontManager.cpp
  {- c1 z+ W9 E* cOgreTextAreaGuiElement.cpp' |" E: d% }2 h# b* v) I
//上面文件覆盖同名文件 就可以 先备份
. p3 X/ V" E' D5 F, ]
* a/ z4 |- _0 i* X, E& ]这个是在ogre-win32-v0-13-1基础上改的,请到
$ i# `; b, W+ w& t3 L+ a4 J/ logre-win32-v0-13-1.zip下载' l0 H5 a! a, c+ l
; Y( q; l% i" U: A* z( Z
中文字体名字就叫 Chinese,以后能做中文游戏了!




欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2