冒险解谜游戏中文网 ChinaAVG

标题: 【汉化资料】【原创】基于图像比对和代理DLL的汉化新方法 [打印本页]

作者: shane007    时间: 2009-5-24 21:08
标题: 【汉化资料】【原创】基于图像比对和代理DLL的汉化新方法
对图片字库的汉化进行了一个阶段的研究,现在我提出一种基于图像比对和代理DLL的汉化新方法。
7 {# m. n5 q* R. t是否能最终实现心里还没有底,不过先写个初稿放在这里,希望各路高手指正。
9 q4 Q5 P. g& V+ z. u% ?
/ f2 m+ y6 L& D# o! f运用代理DLL技术,我们可以重写DirectX内部的所有成员函数。(对代理DLL技术不清楚的朋友可以参考我发的相关帖子)1 w9 I/ c$ e7 x6 [

5 D. D! y3 A1 h+ N* `8 d4 J在DirectX调用Present函数时,我们应该有办法取到前台表面和后台表面的内容。其中必有准备向屏幕显示的内容。我们可以实现修改字幕的内容,一般一个游戏的内容有几千句,我们可以用3-4位2进制数来表示。就是说,我们把字幕的内容修改为0000-FFFF。对话字幕一般在屏幕上的显示位置是固定的,都是在某个矩形区域内部。所以我们可以事先截取字幕显示后的样子的小型图片,也就是0000-FFFF用游戏字体所显示的样子。然后在Present函数中,对前台表面和后台表面的相应区域进行对比,可以进行异或操作,如果得到一个全0的字节数组应该就能说明这2块区域完全相同。同时就说明游戏要显示某句字幕,由于这3-4个字母的区域很小,所以比对应该会很快。然后我们可以把这句字幕相应的中文字幕显示到前台表面或后台表面。这样基本就完成了汉化的过程。. e# a% q" {( ?. T
3 Q0 I) D0 u/ h% j* @$ v  Q5 d
当然,这样的汉化方法有一定的局限性,比如,字幕显示的区域要相对固定。
! L5 s# p3 m) P! S如果字幕的显示位置是随机的,那这种方法就不太适用了。
作者: 妖妖梦    时间: 2009-8-25 05:37
你说的办法跟游侠汉化植物大战僵尸一样啊?
% z! i3 n, F& d& ^5 C
' w1 j' D0 v& Z, w用内挂DLL显示中文
作者: shane007    时间: 2009-8-25 06:10
你研究过植物大战僵尸?) r+ F' O3 G+ [* `- j
不妨仔细说说?
作者: 妖妖梦    时间: 2009-8-25 06:46
下载游侠发布植物大战僵尸汉化版分析一下就知道4 C4 ?: |! M4 ?. `' S5 E- ]4 j
http://game.ali213.net/thread-2789340-1-2.htmlu
, g; w* d( ?8 j4 \6 ]
0 T, g; l7 Q6 {) S, A很明显,采用了DLL内挂显示中文和 系统自带中文字体 关于细节游侠没有透露 不管怎么说,已经证明你的是对的,同时看到了小游戏的汉化希望
作者: 颂妖精    时间: 2009-8-29 14:39
楼上网址最末处多了个U- _: `4 x  y6 w/ h5 ^
3 F# I, B4 v! v; e: g
偶下到的直接打到一起了的版本
2 l7 n" w1 k7 h) X/ X  r# @$ }所以不知道E文版啥样子的……
# L6 T9 r# |/ T3 B
1 {: l/ y6 ?% t- ]& G: v在游戏目录下找到了GIF的字符库
% G' i. _7 S" h6 x同时还有各种字符的定义及宽度设定文件' h1 {+ j4 [  P, j5 L1 j
如果从这里着手
% L4 K! X6 F3 @3 G3 H) G9 s用UinCode来对应汉字表- l& S; \# h! m. s4 P/ u
应该也很容易做的
5 D/ [' W; j+ |! x) A6 S) C4 {  K* ?; p; [, p
汉化主要工作; Y( g" r% [9 A9 w
应该是制作图形界面
6 S2 W; F3 C' N/ E# t难点则在说明文字部分的显示
" v. O8 D1 a6 E8 W/ c) T  R9 [在主目录下可以看到GDI42.DLL
4 a: ]/ \- W8 |: U6 v估计是用来加载中文显示的% @! _2 v# k9 Y
自带了一个方正少儿体
4 Z1 m" T, R& F# A# w1 @& w9 e) p不过在偶这儿却没能正常加载
作者: solidji    时间: 2010-4-1 18:16
如果是2D游戏,对白输出都是通过固定API函数,很容易做. 看这个textout hook 项目
+ B: s+ J5 E/ k8 U0 hhttp://blgames.proboards.com/ind ... =250&page=1
1 i/ ~) R4 l; I& ?4 F' V) t
' L  [  T2 l8 h3 t" m! Q9 e" u D3D游戏的话,基于速度的考虑,一般是采用纹理方式输出,纹理又分动态静态,
4 ^/ ]" G2 P+ c# u# h游戏初始化时一次性创建,显示的时候填充
9 {: j. Y; [+ X6 e用到哪里创建哪,每句话根据码表单独创建一个纹理
- N0 X3 D0 c& G0 Z9 ^2 I- ?效率最低的方法是用GDI建立纹理数据,然后填充纹理,最后绘制
$ s- T( `  p& l" v& m效率最高的方法是直接存储每个字母的对应纹理坐标,使用固定纹理$ o5 j9 h9 Q  Y: r$ X; M
折中的方法是建立每个字母的图像数据,使用哪个字母就建立对应的纹理
4 r( Y; C, P5 F总之很多方法,首先要兼容这些不同的输出方式
2 y, _2 n8 D6 q$ @5 `
$ U6 u  `' L. F) ?0 a9 B另外一点主要是如何区分一般游戏纹理,与文字纹理,还有带文字的图片纹理,
* C, a8 J/ W& X  X0 K然后找到一个不影响效率的时机用自己的汉化后纹理来替换
" B# j5 m) ^- d/ B/ i$ R& r8 ]% T' T( L6 S, F3 s" P
LZ 比对图片二进制数据的方式不知能否区分出各类纹理
作者: shane007    时间: 2010-4-1 19:22
感谢楼上的发言,我提出的只是一个思路。
+ R. w3 K2 I2 Z. h4 N要实现的话真的是难度很大,我对directx的理解游戏。! i, _% x6 r# s+ ~7 j6 e6 K
直白地说,我提出的思路目前并无具体方法来实现它。




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