小概率事件是不可能频繁发生的,将20修改为00.将08修改为00.保存。再用DJ打开,发现已经改过来了:
a_javax_microedition_lcdui_Font_static_fld= Font.getFont(0, 0, 8);
怀着兴奋,激昂的心情,进入HALO,编译,打包,运行——傻眼了,还是那样!出什么问题了么?
4.2 第二次尝试:修改字体代码表
经过一番分析,我初步得出结论:可能还存在其他类有使用Font。于是再次查找可能的类。结果果然在DCTuxedo.class中一个叫void D()的函数中找到了getFont: …..
if(i1 == 30) {
f.a(0x30003);
a_javax_microedition_lcdui_Font_array1d_static_fld = new Font[3]; a_javax_microedition_lcdui_Font_array1d_static_fld[0] = Font.getFont(a_int_array2d_static_fld[0][0],a_int_array2d_static_fld[0][1], a_int_array2d_static_fld[0][2]);
a_javax_microedition_lcdui_Font_array1d_static_fld[1] = Font.getFont(a_int_array2d_static_fld[1][0],a_int_array2d_static_fld[1][1], a_int_array2d_static_fld[1][2]);
a_javax_microedition_lcdui_Font_array1d_static_fld[2] = Font.getFont(a_int_array2d_static_fld[2][0],a_int_array2d_static_fld[2][1], a_int_array2d_static_fld[2][2]); } else{……
这是一个字体表,具体是什么用途的什么无法知道,可能在游戏中有几个不同的字体需要显示。静态字段a_javax_microedition_lcdui_Font_array1d_static_fld被常量表a_int_array2d_static_fld初始化。接着查找a_int_array2d_static_fld,在静态数据段中找到了初始化项:
private static final int a_int_array2d_static_fld[][] = { { 32, 0, 16}, { 32, 0, 0}, {32, 0, 8} };
OK!看来把它修改了就可以了。切换到Bytecode模式,再最后的数据段中找到这个: 46 70:iconst_3
//47 71:anewarray int[][] //48 74:dup //49 75:iconst_0
//50 76:iconst_3
//51 77:newarray int[] //52 79:dup //53 80:iconst_0 //54 81:bipush 32 //55 83:iastore //56 84:dup //57 85:iconst_1 //58 86:iconst_0 //59 87:iastore //60 88:dup //61 89:iconst_2 //62 90:bipush 16 //63 92:iastore //64 93:aastore //65 94:dup //66 95:iconst_1 //67 96:iconst_3
//68 97:newarray int[] //69 99:dup
//70 100:iconst_0 //71 101:bipush 32 //72 103:iastore //73 104:dup //74 105:iconst_1 //75 106:iconst_0 //76 107:iastore //77 108:dup //78 109:iconst_2 //79 110:iconst_0 //80 111:iastore //81 112:aastore //82 113:dup //83 114:iconst_2 //84 115:iconst_3
//85 116:newarray int[] //86 118:dup //87 119:iconst_0 //88 120:bipush 32 //89 122:iastore //90 123:dup //91 124:iconst_1 //92 125: iconst_0 //93 126:iastore
//94 127:dup //95 128:iconst_2 //96 129:bipush 8 //97 131:iastore //98 132:aastore
这么长一段代码就完成了刚才的一句初始化行为。我们只要把3个32改成0就好。用打开UE,依次查找16进制:0x 03 10 20 4f 59
下载 (19.52 KB) 2007-10-25 00:40
将20统统修改为00后,又对其他类进行确认是否有调用getFont。发现已经没有了!很好,这下子终于和谐了!怀着更激动的心情打开HALO,编译,打包——Orz…结果还是满屏幕的―口口‖。接近崩溃的边缘,百思不得其解。
4.3 修改调用图片字体
思考良久,没办法。只好求助MasterBB。当我说明情况后,他劈头就问:―你懂J2ME么?‖我承认,在这方面我还完全不会。于是在他的指点下,我查找了关于绘制Image的一些资料。原来是这样的:由于游戏用了图片字体,导致即使修改了Font,也无效,系统发现找不到图片字体中的文字,只好用―口口‖代替!通过HALO的提取资源功能,找到了罪魁祸首:
下载 (9.61 KB) 2007-10-25 00:40
难怪字体这么好看!这个就是经验的宝贵了,Master一样就能看出这是使用了图片字体。绘制文字的时候首先查看图片字体,如果存在则使用drawImage绘制之。如果没有,可能游戏会使用drawString代替,要是没有drawString呢?Master言:自己写一个或者做点阵!学海无涯啊!要分割这幅图片,首先就要调用setClip,分割完后再把屏幕设置回去。沿着这个线索下去,我决定查找setClip。
在c.class中,我找到了2个我感兴趣的函数,第一个是: void a(Graphics g, String s, int i, int j, int k){
if(a_javax_microedition_lcdui_Image_fld != null) //1 {
//繁琐的判断逻辑 ………………………
for(int i2 = 0; i2 < s.length(); i2++){ //对每个s的字符,使用图//片字 ……………………….
g.setClip(i3, j3, k3 - i3, l3 - j3);
g.drawImage(a_javax_microedition_lcdui_Image_fld,
i - (a_byte_array1d_fld[j2]& 0xff), j - a_short_array1d_fld[j2] - byte1, 20); }
i += byte0 + c_int_fld; }
g.setClip(l, j1, k1,l1); return; }//
g.setFont(a_javax_microedition_lcdui_Font_fld); …………………. g.setColor(a_int_fld); g.drawString(s, i, j, k); g.setColor(i1); }
以及:
public final void a(Graphicsg, char c1, int i, int j, int k) {
if(a_javax_microedition_lcdui_Image_fld !=null) //2 {
//……………………冗长的逻辑 if(c1 != ' ') {
g.setClip(l, j1, k1, l1); return; }

