在很多游戏里都采用UV坐标来保存每个字符的坐标,如果字体定义文件是一个单独的文件, - j) r: M) `5 J1 p7 w0 I9 b0 ~1 o' |% @
分析起来还是比较容易的,比如神秘岛4和福尔摩斯觉醒等等。但是如果字体定义是以数组的
$ H; l, a7 S2 l/ F. X! g形式编译到exe文件或存在于其他数据文件里面的话,寻找起来就比较麻烦了。
% O' x6 H6 W q9 x% {: l
# q9 e o9 q# a- B1 t, Q8 B( V' x- l本工具就是我设计的暴力扫描文件里的疑似UV坐标的工具。 . B, d& d2 n3 u4 r$ H
我们假设有一张256X256大小的图片,如果字库定义采用UV坐标的话,
- G( T( P# O$ C" U# g9 m在字库定义文件中肯定会存在1/256-256/256这样的UV坐标。 9 j3 S/ {& D7 G# D; C7 H4 D; V
(当然,都是以4个字节的16进制数的形式存在的) 8 ?' u% i; }" ^2 \# V
我们的工具就是来个256次的循环扫描在文件中寻找是否存在1/256-256/256的16进制数。
) n: [8 V( ?! n如果找到的话,就在画面上表示出来。 & ~0 w5 S$ {& O6 j* D/ J( w
表现形式是这样的在屏幕上画一个很长的矩形,代表一个文件,扫描到疑似UV坐标的话,
7 ^/ c9 _, w, L3 e7 K2 `就在相应的位置画上一条纵向的竖线。
1 P |( `3 m1 a9 f5 m1 b6 O1 @& }( k9 h如果这个文件里存在图片字库的UV坐标的话,将会在某一个区域集中且均匀地画上很多竖线。
; d$ i% e" e2 G5 l! \用肉眼就可以很直观地看出来。当然,我们可能会扫描到一些其实并不是UV坐标的数据,但是
; L# m) h2 L: o& U2 y `; ^5 P由于这些数据是分散,非均匀分布的所以可以很直观地排除。 ; Z* ]0 [( n% S" @( q
这个工具主要是针对exe和其他数据文件的,但是基本上来说,可以扫描任意文件。 ( W: F0 y" N+ d, \& f
有了这个工具,可以大大加快寻找图片字库定义的过程。
( @: W5 M! A- I7 z: A2 {另外,不是所有图片字库都使用UV坐标的,有个小技巧,如果在游戏中发现使用不同大小的同一种字体,但是找到的图片字库只有1种大小的话,就很可能是使用了UV坐标。 ' j7 U/ X- \+ H! Y9 ~) g8 }; G
对于非UV坐标图片字库,我以后会设计另一个暴力扫描工具。 0 ]4 h) E4 m4 o5 Z3 H
8 x$ B5 }7 T2 |9 a$ C# h. i% b不知道有没有懂技术的热心朋友来完成这个工具? , ~5 b7 ]/ V! J& g
: ]* U: \0 i5 d5 `4 r, k0 s% w b
----------------------------------------------------------
# }: P6 e! `) M2010.4.15 更新 u. J, h+ z' q# I$ R! }
scgame,你好,想把这个任务安排给你来作。
; D! w( E6 K3 L8 n7 L最近如果事情比较多的话,可以等有空的时候再做,不着急。
Y q& ]% r( f. l: { w我把工具的设计再修改一下,就是依次扫描字体定义文件,步长1个字节,如果每4个字节转化为浮点数再乘以2048是一个整数的话。 就输出1行log,要求有这四个字节的第1个字节的offset,和乘以2048后的结果。 / Y! K. J3 [8 b# G h. v
有不懂的话,请提问。
6 N5 Z6 q- G ?0 |/ F- q. c( B0 l
4 ~! g' n: i' x6 ~9 B W |