设为首页收藏本站官方微博

【汉化资料】开源的图形渲染引擎OGRE(2) --让OGRE支持中文

[复制链接]
查看: 2035|回复: 0
打印 上一主题 下一主题

【汉化资料】开源的图形渲染引擎OGRE(2) --让OGRE支持中文

跳转到指定楼层
楼主
发表于 2008-10-22 16:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

【汉化资料】开源的图形渲染引擎OGRE(2) --让OGRE支持中文

如何修改字幕输出函数,也许这篇文章可以参考。
- P2 J! M1 Q$ l6 \; N% h
- |, a- P' D/ |: ~% ]6 `; o2 T# t/ b, j7 S/ V4 `: [$ h
让OGRE支持中文 (转贴)
4 y3 f8 x6 m1 |+ t6 H7 g! {
6 Y4 b6 r8 f/ D
0 p" Y6 }) Y5 F$ _9 o9 w  O0.前言:/ ]( ^# J: a2 @( Q6 p
本人非计算机专业,凭着爱好和一腔热血混入游戏开发大军候补小队,平面尚未钻透。为赶时髦,企图叛变到3D阵营,慌乱之中捡起“OGRE”。学到如今,亦可让正方体飞机等不明物体在三次元空间胡乱打转。但觉得本引擎不支持中文显示而感到不爽,便四处寻求高人指教,但大部分高人指点说:“自己写引擎算了。”衡量了一下自己份量,觉得“自己写”这件事十年内恐尚难做到。再后来找到3DCastle论坛,经过“bug王”以及“浪客☆龙猫” 两位前辈的指点,也通过高手“renwind”遗留下来的教程,误打误撞竟然自己改出了中文支持,兴奋之余便想写点东西留点纪念。1 ]3 a* ]$ V. b# P# i3 [/ y: A
1.准备工作
3 ]4 v* ]: Q( J! }“bug王”已经通过WINAPI实现了OGRE在Direct7.0下的中文支持,也有高手说这样效率不高,更因为本人基本上是不怎么熟悉WINAPI的,所以就放弃了这种方法。企图直接通过贴图来实现中文显示,毕竟OGRE本身文字输出也是用的这种办法,更好的是OGRE引擎除了普通的“ttf”字体外还支持位图字体(其实“ttf”在引擎中也被Ogre::Font::createTextureFromFont()转换成位图了),基本上就是做一个很大很大的图片,然后上面画满汉字,直接读进去就可以了,问题也就变成了——如何找这个大图片。
: o. p& ^' L' B4 b幸好GBA游戏的开发者们已经找到了很好的文字来源和取得方法,通过金山的16*16点阵字库得到接近9000个字模,然后通过程序读出并写到2048*2048的单色位图上,转换成“png”格式图片才221k。
0 j4 ~6 \$ }9 x' f* a1 W2.基本知识
/ v2 D, N& r7 I8 F2 v修改引擎之前,我们先要知道OGRE是如何显示字体的。OGRE本身面向对象的设计和自带文档都做得非常规范漂亮,很容易就能找到关于显示文字的类以及相关函数。在这里主要看一下关于位图字体是如何显示在画面上。(1)字体的读取。
& A" t- G  u' v' d和这项功能相关的有两个类,一个是Ogre::FontManager类,负责分析字体信息(*.fontdef)文件。然后用builder模式构建一个Ogre::Font类。在Font类中最重要的数据莫过于mTexCoords_u1、mTexCoords_u2、mTexCoords_v1、mTexCoords_v2这四个数组,他们分别用来储存不同文字对应在图片上的纹理坐标。 不过数组大小明显不够储存9000个汉字的,一会儿要改的。  e& ^& }' G# a9 V4 ^
(2)字体的显示。
6 P6 D8 A* j) x* b- q4 M好像字体显示中用得较多的是Ogre::TextAreaGuiElement类,不过好像还有其他的,我们在这里只看这个吧,估计其他的也大同小异。看了看好像唯一和显示字体有关的函数就是void TextAreaGuiElement::updateGeometry()了,基本上就是根据要写到屏幕上的字串,在Ogre::Font类中得到相应的贴图坐标和贴图,然后画上去,道理也不是很难。
! Q& e: A* b* Z. E! h3.动手术
, E3 D4 u$ K/ c# f* J4 r' H8 ?! W目标锁定到Ogre::Font,Ogre::FontManager,Ogre::TextAreaGuiElement三个类中,把所有文件备份一遍手术开始!, H8 D6 g5 k( S3 }3 U
(1) Ogre::Font类。
. E" ^; r7 k2 f, P  C/ R首先是储存文字贴图坐标的数组的大小不够,原来定义的是——宽字符集 (1024 - 32)、ASCII(256 - 32)。这点点大小怎么够我近9000字大军进入,索性都改成(9030 - 32)。还有就是set和get文字贴图的id都是char类型数据,256个id也不够分配给汉字,看来要都改成unsigned long形(其实大部分机器上int也是32位,不过long是固定32位的类型,感觉统用点)。
- C% {3 N0 y3 a+ ?(2) Ogre::FontManager类。' L: o0 x/ i3 R- V! z# }. u" z; J7 y
里面从脚本文件中解析贴图坐标的方法是根据单字符的方式,为支持汉字,改成同时可以分析int的。一个汉字对应数字是他的区位码+161(前160个留给了半角字)。
; ?& w% Z7 |9 q: @+ S4 m$ Q" m, H(3) Ogre::TextAreaGuiElement类。* b# v7 h- S$ k$ p/ F/ S6 x* y' A
这个是相对比较麻烦的,他要从字串中分辨出到半角字和中文。在这里增加一个std::vector<unsigned long> caption,用来储存分辨的结果。增加以下几行。3 S1 x: ~' u. s1 v8 X
std::vector<unsigned long> caption;
3 v2 w5 s1 k3 R* r. Runsigned char nTemp;
( A1 N7 e2 s. [; l& tString::iterator it=mCaption.begin();! R  e+ x# n  G3 ?
for(;it!=mCaption.end();++it)5 I: ^8 i% j2 R: v; I7 g/ e
{2 ?! k2 C; v0 E1 Q8 ~2 Q! u+ D
if(unsigned char(*it)<=160)//如果是半角% A' q  E4 [) J$ e' e# y! x
{
8 s& {7 a, c8 a& i1 K/ p+ W5 ?  B5 Acaption.push_back((unsigned char)*it);6 G3 d$ f+ B" P8 e+ v9 n1 [1 n
}; A% c4 X9 l& m$ n5 W% D: \% g$ C
else//处理全角字符' g( _" K4 V( z# e* C
{
" N, K# l- n8 J' X9 G; e+ m1 \nTemp=(unsigned char)(*it);
9 P" A: l- }0 o% x' K6 r++it;
; {" Y% z% T0 F5 n" b9 Lif(it==mCaption.end())
5 m& _# X+ y, _8 j, Gbreak;
; g9 S' x5 u  C//下面是得到区位码+161的公式。
0 {" V  }6 i6 F# y; j' V# {1 F# |caption.push_back((94*(nTemp-0xa0-1)+((unsigned char)(*it)-0xa0-1))+161);
- I! `) g5 w; V, `1 Z1 I, H$ H}
/ ~! w' q3 E1 a}: E7 A6 m$ Q5 O2 h
然后后面所有关于mCaption的地方都用caption代替就ok了。
# ^% y' l$ h$ o: d  Y4.结果。
1 H" m; i( S1 B7 c  r0 P! ~4 W# u在OpenGL和DX9.0中成功的支持了中文,但是DX7.0中竟然出现了运行错误,具体问题还不清楚,还望各位高手指教。. V. o5 `7 r. N' L
因为字体本身原因,文字很扁平的不好看,索性又改了改Ogre::Font,Ogre::FontManager两个类,实现脚本中支持修改文字纵横比例的系数的proportion,当这个值设置为0.8的时候比较好看了。, m7 V5 D: C. l7 p: g% q
$ Y4 J4 d1 L1 S" R# ~0 z
+ L% b7 F1 s% x% z2 ~% c
相关文件
/ W6 o0 D: S, e  Ochinese.fontdef//字体信息文件 放在资源文件加中  Q8 n7 ^1 U+ v: ?: B
font.png//字体图片 放在资源文件加中$ J1 m& Y/ O/ {. b

6 W, S. X( @# O8 a3 rOgreFont.cpp  y7 t" M* u" a& t9 h3 {8 u# V  H
OgreFont.h$ U" g+ ?0 u  m- X
OgreFontManager.cpp
8 p1 H: W' e0 \. A; s) K1 [OgreTextAreaGuiElement.cpp
& v0 \; Z' t. d7 ^//上面文件覆盖同名文件 就可以 先备份! |, x! F* \4 T3 Y5 u6 n1 {8 |
! N9 H: V; {. `7 l( g2 C2 ]
这个是在ogre-win32-v0-13-1基础上改的,请到
7 v3 l0 p/ V6 R% b6 Oogre-win32-v0-13-1.zip下载' r$ n  G. y* |2 j8 {1 L- h
) C( _6 H2 v9 u2 J7 {
中文字体名字就叫 Chinese,以后能做中文游戏了!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

快速回复 返回顶部 返回列表