站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2ME 专题手机游戏修改(6)switch之lookupswitch

手机游戏修改(6)switch之lookupswitch

摘要: 手机游戏修改(6)switch之lookupswitch
<tr><td>
http:///tech/article2124.html
[转载于纸墨聊斋]
原文:http://blog.xdnice.com/user1/151/index.shtml
作者:紫陌

[]昨天坐了一天的车,晚上八点多回到学校。经过一个晚上的休息,还是没有完全调整回来状态。回来的第一件事,就是接着这剩下的几篇心得写出来,算是了结自己的一桩心愿。前面的几篇可能写得有点罗嗦,以后,我会尽量简单地写,举些简单的例子就可以了。

我们知道,手机的键值可以从-23(可能更小)到57(可能更大)之间变化,用上篇中提到的tableswitch的方法来处理分支程序的话,就需要有七、八十个选项。如果在一个程序里面,我们只用-23和57这两个键值的话,用tableswitch 就有点大材小用了,而且还要多占用空间。所以我们这里介绍lookupswitch,lookupswitch与tableswitch比起来,显得更灵活。我们举个简单的例子来看一下它的结构:

比如源程序里的一段代码:

switch(i1)

{

case -1:

a.a();

case 49:

a.b();

}

这是一个简单的例子。这里我们还是假设,i1是keycode,这里只出现了-1和49,我们知道诺机和MOTO的这两个键值对应的按键是相同的。-1是上方向键,49是按键1的键值。这段程序的意思是,如果按下上方向键,执行a.a()这个函数,如果按下1的话,执行a.b()这个函数。

那么在bytecode里面,它可能对应着这样的一段代码:

AB 00 00 00 00 00 E8

00 00 00 02 FF FF FF FF 00 00 00 E7 00 00 00 31

00 00 00 E9

这里,红色的部分就是lookupswitch开关的意思,说明下面这一段二进制码是lookupswitch。
[]
蓝色的字,与tableswitch一样,也是个label。这两个地方两种switch结构是一样的。

下面的紫色部分就与tableswitch不一样,这里只是给出了分支的个数,而不像tableswitch 里面,给出的是两端的数值。

剩下的部分,每8个字节为一个单位,前4个字节,对应着case后面的那个数字,后4个字节是label,表示要转向这个label来执行相应的指令。比如:FF FF FF FF 00 00 00 E7 前四个字节“FFFFFFFF”是-1的十六进制,后4个字节00 00 00 E7是一个卷标。

这个应该很好理解吧,我们就不多解释了。

[]弄清了lookupswitch的原理,我们就可以进行修改了。比如我们要将case -1改成case -6,那么只需将FFFFFFFF 修改成FFFFFFFA就可以了。

不过,有一点是需要特别注意的,在lookupswitch这个表中,数字必须按照从小到大,从负到正的顺序来写。比如前面例子,如果换成下面的样子,就会出错了。

              AB 00 00 00 00 00 E8

00 00 00 02 00 00 00 31 00 00 00 E9 FF FF FF FF
[]
00 00 00 E7
http:///tech/article2124.html
</td></tr></table></td> </tr> <tr> <td background="/pic/split.gif" height=1></td> </tr> <tr> <td class="tdMargin1">
↑返回目录
前一篇: 手机游戏修改(7)文本和对话框的修改
后一篇: 手机游戏修改(5)Switch之tableswitch