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

当前页面: 开发资料首页J2ME 专题使用JavaMagic进行游戏修改

使用JavaMagic进行游戏修改

摘要: 使用JavaMagic进行游戏修改
<tr><td>

[本文章最后由 rocks 在2006-06-16 00:48:24编辑过]

http:///tech/article2127.html
[转载于JavaMagic项目主页]

原文:http://ohfaint.3322.org/javamagic/Doc/Tutorial.html
作者:Returner

[]--------------------------------------------------------------------------------
 

  JavaMagic是一款为解决手机Java游戏某些兼容性问题而设计的软件。本文以JavaMagic 0.53为例,介绍如何用JavaMagic对不兼容的Java游戏进行处理,使之能较好地运行在您的手机上。

  目前一般手机(我是指非Nokia手机)与Java游戏的"主要矛盾"有一下几点:

  一,游戏不能全屏运行。例如,很多游戏是以128x128的分辨率为标准设计的。而有的手机,其屏幕分辨率虽然也为128x128,但在运行游戏时,由于游戏没有以全屏方式运行,画面一部分会被按键提示栏之类的物体遮挡,十分影响心情。当然,如果您的手机分辨率大于128x128,比如128x160,就不会存在这样的烦恼。但有的游戏被设计成能够自动适应屏幕分辩率,让这些游戏在128x160的手机上以非全屏的128x128尺寸运行,岂不是很委屈它们?所以,如果可以的话,全屏运行总是好的……

  二,游戏是Nokia专用的。目前很多游戏都是只有Nokia的版本,懒惰的厂商偶尔才会大发慈悲,发行对应其它手机的版本。由于Nokia的游戏一般都使用了Nokia专用的API,不能直接放在非Nokia手机上运行,直接导致我们对Nokia这厮又爱又恨。幸好劳动人民的智慧是无限的,某位我不知名的神仙写了一个Nokia API的模拟包,解决了这一难题。这就是在网上广为流传的那个俗称"com文件夹","com包"的物体。但是这个模拟包只是实现了一些最主要的基本功能,还不够完善,仍然存在一定兼容性问题。我知道除了我,还有人正在尝试去完善它。希望以后我们能看到更优秀的模拟包出现在网上。

  三,游戏按键不兼容。虽然只要游戏厂商愿意,他们可以做出在几乎任何一部手机上都不出现按键不兼容问题的游戏,但在残酷的现实中大量的游戏都是根据KeyCode(键值、键码)这种跟设备有关的东西来识别按键的。而不同品牌的手机,甚至相同品牌的不同系列的手机,除了数字键(包括[*]和[#]键)的KeyCode是一样的,其它按键比如左右软键、方向键,其对应的KeyCode几乎都是不同的。因此,在玩游戏时按了“右”,可能游戏会认为你按的是“下”;或者游戏需要你按“右软键”,可是你把所有键都按遍了游戏都不鸟你。已经有一些先进分子们(这些“手机游戏修改群”里的大大们十分活跃,相信不少人都见过)觉得这种情况难以忍受,于是研究出了解决方法——改游戏代码,把游戏里面使用到键值的地方通通改成我们自己手机的键值。无奈这种修改方法本质上是一种繁重的体力劳动,容易导致头晕眼花和一定程度的神经衰弱,所以我尝试了不到24小时就彻底地溃败了,转而研究其它的修改方法,并开始写JavaMagic这个软件。而且这种方式还有一定的局限性,更重要的是它不适合一般玩家。

  四,字体问题。这点国产游戏尤为突出。很多游戏大量使用小字体,十分抠门。然而我们的手机厂商更加抠门,直接把小字体的支持阉割掉了。阉割得比较有人性的,会统一用一种字体来代替大、小字体,这样至少在游戏里还能看到字。而阉割得比较彻底的,就干脆就什么都不显示了。这个问题也可以通过修改游戏代码解决,但同样比较麻烦。

  五,语言问题。呃……这个是游戏与游戏玩者的矛盾,不在本软件的讨论范围……

 

  如果您的手机支持MIDP 2.0,那么恭喜,您可以试一下JavaMagic,也许它能解决您的问题。其实那些Java游戏还是很好骗的,JavaMagic对它们使用了一些巧妙的小伎俩,使之能比较正常地在您的手机上运行。

  JavaMagic的界面比较简单:

540) this.width = 540'>
[]
  如果是第一次运行,应该先点击“设置”,针对您的手机重新设置JavaMagic

  这是设置画面(嗯,我承认它看起来是复杂了点,而且随着版本的更新变得越来越复杂……):

540) this.width = 540'>

 

  先讨论与全屏问题有关的设置。首先,您需要了解您手机的屏幕分辨率,并将其填入“分辨率指定”中。(如果您的手机分辨率是128x116, 128x128, 128x160中的一种,可以直接点击对应的按键来快速设定。)

  也许有的同学看到这里已经被“分辨率”这个反复出现的字眼折磨得失去继续往下看的勇气了……那么所谓的“分辨率”到底指的是一种什么样的东东呢?仔细观察一下您的手机屏幕,是不是能看到它是由一颗一颗小小的点排列起来组成的?……有人说看不出来……很好,说明此阶敌的手机屏幕非常好,没有颗粒感,或者此人眼神非常的不好,对于尺寸较小的物体会采用模糊化处理进行过滤,需要借助特殊光学仪器(如放大镜)才能看清屏幕上的点阵。总之,屏幕就是由规则排列的点阵组成的,我们说分辨率是128x160,就是水平方向数有128个点,垂直方向数有160个点,整个屏幕有128乘以160个点。欢迎怀疑论者去数一数自己的手机屏幕验证一下。您手机屏幕的分辨率一般都能在说明书或者一些手机网站的介绍手机参数的页面中查到,所以您如果到现在都还不知道自己的身高体重,不妨挪动一下您的手指翻翻说明书或者去问古狗大神,不要来问我……

  对于支持MIDP 2.0(很好,又有同学问这个MIDP又是啥米了……这个我不解释了,在说明书和手机网站上同样能查到您的手机支持MIDP 1.0还是MIDP 2.0)的手机,有两种显示模式——全屏和非全屏。在非全屏模式下,不是整个屏幕都是游戏画面,屏幕上还有软键指示栏,某些手机还有电池电量指示栏等东西。只有在全屏模式下游戏的画面才会充满整个屏幕。
[]
  大多数游戏使用的分辨率都是128x128。如果您的手机屏幕分辨率为128x128或更小,建议在“全屏选项”中选择“强制全屏”,这样所有处理过的游戏都会在全屏方式下运行了。效果对比如图(注:所有游戏画面版权归原游戏厂商所有):

540) this.width = 540'> - 540) this.width = 540'>

540) this.width = 540'> - 540) this.width = 540'>

  如果您的手机屏幕分辨率大于128x128,例如是128x160,那么强制令游戏全屏运行未必是好事。如图:

540) this.width = 540'> - 540) this.width = 540'>

  可以看到,128x128的游戏在128x160下运行,屏幕会出现空白区域,比较不美观,还不如不全屏呢。“全屏选项”中的“仅当游戏可能能自动适应屏幕高度时全屏”选项就是针对大屏幕手机而设的。当JavaMagic检测到游戏可能能够自动适应屏幕尺寸,即无论在128x128还是128x160还是别的分辨率下,画面均正常,则将游戏设置成全屏运行(如下图)。如果游戏的分辨率固定在某个数值(如128x128),无法自动适应更大的分辨率,就让它乖乖地以非全屏方式运行。

540) this.width = 540'> - 540) this.width = 540'>
[]
  不过这个自动检测功能不一定100%准确,而且有的游戏只有一部分是能够自动适应分辨率的(如,某些游戏仅仅是标题画面能够自动适应,游戏中还是锁定分辨率的)。这时只能选择“不使用全屏方式”了。

  设置中的“屏幕分辨率指定”是与下面的“分辨率覆盖”一起使用的,一般指定为手机屏幕的分辨率即可。下面的三颗按键为快捷设置按键,点击即可将分辨率设为相应值。

  在“分辨率覆盖”里,选择“使用指定的分辨率”表示将分辨率指定为使用“屏幕分辨率指定”中设定的数值;选择“在游戏中自动检测”,则不将分辨率指定为上面设定的值,而是在游戏运行时自动检测最大分辨率。设置这一选项的初衷是为了让处理过的游戏能在分辨率不同的手机上都能正常运行,但显然这种想法太天真了……基本上这个选项是废的,不需要考虑。而“不覆盖全屏时分辨率”则表示不对分辨率做手脚,顺其自然,一般与“不使用全屏方式”一起使用。

  需要注意的是,“分辨率覆盖”只会影响到游戏中能自动适应屏幕分辨率的场合。如果游戏被JavaMagic检测为能够自动适应分辨率,但您选择了“不使用全屏方式”,这时还应该在“屏幕分辨率指定”里将分辨率指定为游戏所用的分辨率(您的手机在非全屏模式下的游戏画面分辨率),或者选择“不覆盖全屏时分辨率”,不然的话游戏画面会很恶心地超出您的屏幕显示范围;如果游戏被检测为不能自动适应屏幕分辨率,则这里设置的值不会对游戏产生任何影响。唯一的例外就是JavaMagic发生误判……

  如果用JavaMagic处理后您的游戏行为异常,可以试试另外一款也是干这种勾当的软件——俄罗斯人的FullJava( http://www.google.com/search?hl=zh-CN&newwindow=1&q=fulljava )。事实上JavaMagic的部分灵感也是来自FullJava这款软件。

 

  全屏下面是“字体替换”的设置。开启此功能后,无论大中小字体,一律用手机默认的字体代替。如果您受到无法显示小字体这一问题的困扰,不妨试试开启字体替换功能,也许会有所帮助哦~~~但这个功能只是对字体进行替换,在有的游戏中使用系统默认字体后还需要对文本的位置进行修正,这样画面看起来才比较美观。对于这一点,JavaMagic就无能为力了。以下是国产游戏《血案现场之谋杀山庄》的效果对比:

540) this.width = 540'> - 540) this.width = 540'>

 

  “键码转换”也是一项非常实用的功能,也是JavaMagic的一大特色。如果您的游戏采用的是Nokia的键位,而不幸您的手机的键位与Nokia的不一致,现在可以不必再为此郁闷,使用JavaMagic即可轻松搞定。不过之前需要做一个工作,就是知道自己手机的键码(KeyCode)。我在网上找到一款简单的按键测试程序,把它转载到了JavaMagic的主页上(jad jar)。在手机上运行,按下按键即可看到该键对应的KeyCode。如图:

540) this.width = 540'>

[]  记下手机上所有按键的KeyCode。注意,如果你按下某个键没反应,不必担心,因为并非每个按键都会有KeyCode。

  回到JavaMagic,点击“键码设置”:
[]
540) this.width = 540'>

  由于数字键、[*]、[#]键的KeyCode在每台手机上都是一样的,因此这里只提供了"上" "下" "左" "右" "选择/确认" "左软键" "右软键"等键的转换。在这里填入您手机上对应键的KeyCode即可。如图,假如我的手机的"上" "下" "左" "右" "选择/确认"几个键的KeyCode分别是1, 6, 2, 5, 20,将它们填到相应位置里,而手机上的左右软键是没有KeyCode的(真的存在这么变态的手机,不骗你),想用[*]和[#]代替左右软键,则应将[*]和[#]的KeyCode(42, 35)分别填入Left-Softkey和Right-Softkey的框中。填好后按确认即可。

  为方便他人,希望大家能把自己测试得到的键值保存为文件,并点击“下载/上传键值文件”将键值放到网上共享。

  点击“默认值”可以将键值回复到默认的值。这个默认值也是可以自行指定的,只需要将键值以 "KeyDefault.xml"为文件名保存,并与JavaMagic.exe放在同一文件夹下即可。

  在“键码转换”中,还可以指定"选择/确认"键的功能。比如某些游戏中这个键本身是没有功能的,用上下左右移动后,还要把手指伸到左软键上按确认。如果你像我一样懒,可以将"选择/确认"键定义为左软键,这一在游戏中操作起来就方便多了。

  注意,出于软件易用性考虑,JavaMagic只提供其它手机键位->Nokia式键位的转换。如果您要处理的游戏本身使用的键位不是Nokia式的,建议您将游戏交与专业人士处理。当然,自行处理的方法还是有的,但涉及Java编程,因此不在此讨论。

 

  “Manifest与Jad选项”可能也会让某些人感到迷惑。其实这里的选项也与兼容性有关。

  先说说Manifest是什么。在每个jar文件中,都会有一个meta-inf目录。在meta-inf目录下,都有一个manifest.mf文件。这跟从前有座山山里有座庙庙里有个叫manifest.mf的和尚的原理是一样的。这个和尚满脸字符,是一个文本文件,可以用记事本打开看看它具体长成啥样。文件包含了一些属性信息,它每行的格式基本上都是xxxx: xxxxxxxx,冒号前面的字符串为属性的名字,后面为属性的值。例如 "MIDlet-Name: Golf"就表示MIDlet-Name这个属性的值为Golf。

[]  嗯,其实我们不需要知道这么详细,只需要了解一个事实就可以了。那就是,如果manifest.mf里某些属性的值写得比较不好看,或者用了中文和一些奇怪的符号,会直接导致某些软件和手机拒绝承认它所在的jar文件是一个正常的java包。因此,就有了“Manifest过滤”一说。过滤选项就是用于设定是否对manifest.mf文件及生成的jad文件内容进行过滤,当开启过滤功能就能把多余的属性和可能不兼容的字符过滤掉。

  至于jad文件,它一般都是与jar文件一起出现的,其内容与manifest.mf文件差不多。对于某些手机和软件来说,它不是必须的,只要有jar文件就够了,但对于大多数手机和软件,没它jar文件就活不下去,所以这个世界上才会出现那个叫jadgen的小程序。比如我的这款手机,单独传入jar文件时也能跑,但就是不能保存进度。即使传入jad文件,如果里面的某些属性是中文,看起来也没啥问题,但仍然还是不能保存进度。一定要同时传入一个相貌平凡的jad文件它才能正常保存进度,十分恶心。所以,针对这些恶心的手机,JavaMagic中设计了这些跟manifest和jad有关的功能:

  “过滤Manifest中的属性”就是用来对manifest.mf文件中的属性项进行过滤的。它有三种设置状态(不选,选择和半选择):不选表示不进行任何过滤;选择表示仅保留最基本的几个属性,并将多余的属性过滤掉,同时替换掉某些属性("MicroEdition-Configuration", "MIDlet-Version", "MicroEdition-Profile"及"Manifest-Version")的值,以避免这些值写得不标准造成jar无法载入的错误;半选择状态则表示仅对那些属性的值进行替换,不过滤任何属性。一般建议置于半选择状态,因为那些“多余”的属性,往往会在游戏中使用到,有的游戏运行时需要manifest.mf中特定的属性,过滤后可能会造成部分游戏无法运行。(如一款叫wax的游戏。) 。只有jar无法识别或载入时才应尝试进行完全过滤。

  “对Manifest中的属性值进行字符过滤”则是针对属性的具体值进行过滤。某些属性的值如果含有特殊的符号(如"*", "\"等)或中文符号(有的手机和软件不支持含有中文字符的manifest文件),同样会造成jar无法识别或者别的兼容性问题。这个选项也有三种设置状态:不选表示不进行任何过滤;选择表示对所有属性的值都进行字符过滤;半选择表示仅对基本的几个属性("MIDlet-1", "MIDlet-Name", "MIDlet-Vendor")的值进行字符过滤。如果您的手机很健壮,对于那些特殊字符和中文字符不会有不良反应,就不必选择此项;如果您的手机只对于某些属性的值比较敏感,就请将其设置为半选择状态;如果您的手机对中文支持较差,请设置为选择状态。至于怎么设置比较适合您,就要靠经验了。

  需要注意的是,虽然经过数次改进,这个过滤功能目前仍然十分不完善,可能会在某些情况下出现异常。

  另外,无论是否开启了过滤功能,JavaMagic都会自动加上MIDlet-Icon 属性。因为有的手机需要该属性才能在程序管理器中正确显示Java游戏的图标。

  “生成主jad文件”用于生成一个与处理后的jar文件同名的jad文件,省去了另外找工具生成jad文件的麻烦。如果您的手机不需要jad文件,可以不选此项。

  “生成第二jad文件”用于生成一个jad文件的副本,这个文件的文件名中会含有游戏名等附加信息。这个功能可以帮助用户识别不同的游戏。例如,我们在网上下载的游戏可能是 "20040605225854.jar"这种文件名,从文件名上完全看不出是什么游戏。使用“生成第二jad文件”功能,转换后除了生成"20040605225854_new.jad",还会生成一个 "20040605225854[游戏名]_new.jad"这种文件名格式的jad文件。如果同时开启了jar自动改名功能,还可能在"[游戏名]"后加上"[原文件名]"。此外,还会加上[ArFnNx]之类的标志,其具体含义可以查看该选项的注释。例如有"N"标志的表示这是一个Nokia游戏;有"Nx"标志的表示这是一个运行起来可能慢得像幻灯片的Nokia游戏:)

  用户可以选择只保留主jad文件,只保留第二jad文件,或者两个jad文件都保留,或者两个jad文件都干掉。由于第二jad文件文件名中可能包含中文字符,且于jar文件文件名不一致,并不是所有的软件和设备都支持这种文件名的jad文件,所以进行了这样的设置。用户可根据实际情况和需要进行设置。

 

[]  “jar大小警告”可以提示您生成的jar文件是否超过您的手机所允许的最大长度。在“jar文件最大大小(字节数)”旁边的编辑框输出以字节为单位的最大文件长度,当生成的jar文件超过此长度时候就会在讯息框给出一个警告。如果您不需要此功能,或者您不知道您的手机最大支持多大的jar文件,可在此填入0。

  “超过此大小时放弃处理”选项则表示当填入了非0值时,生成的jar文件的大小如果超过了这个值,不但会给出警告,还会放弃处理该文件,将其视为“处理失败”。使用此功能可帮您“过滤”掉体积过大的jar文件,以节省您的宝贵时间。

 

  “其它”一栏中可以对JavaMagic的行为进行一些设置:

  “仅显示摘要”用于设定是否显示详细的分析过程。
[]
  “输出到子文件夹”用于设定输出文件与源文件处于同一文件夹还是放在子文件夹中。

  “jar中文文件名自动改名”同样是为解决中文字符的兼容问题而设置的。很多软件及设备对中文文件名兼容性不好,使用中文文件名的jar文件可能会识别不了。但有时我们在网上下载的jar文件会使用中文文件名,这时这个选项就比较有用了。启用该选项后,文件名中的中文字符会被自动转换为拼音声母,例如对于文件 "foo测试bar.jar",转换后生成的文件名文件名将为 "fooCSbar_new.jar"。

  “用WinRAR压缩jar”用于解决默认压缩引擎带来的小问题。JavaMagic采用了压缩率较高的kzip对游戏重新压缩,因此新生成的文件可能比原文件小。但在测试过程中我发现极少数的游戏会出现异常(如EonTheDragon的几个版本,Quest Craft等游戏),在设置中选择“用WinRAR压缩jar”,重新对游戏进行处理,一般都能解决问题。但对于大多数游戏,JavaMagic应该都是能正常工作的。

  如果系统中正确安装了WinRAR,JavaMagic能够自动定位winrar.exe的位置。将鼠标悬停在“WinRAR位置”按键上即可看到当前设置的winrar.exe位置。如果不对,请点击该按键自行指定。当使用WinRAR压缩时,采用的是最高压缩比的设置,以尽量减少生成的jar文件的体积。

  “转换结束后提示”用于设置在完成转换后是否发出提示音及在任务栏闪烁窗口标题以提示用户。

  “窗口一直置于前方”让JavaMagic的窗口置于所有窗口最前方(On top),以方便操作。

  “将设置保存到文件而不是注册表”可以选择将JavaMagic的设置保存保存在哪里。默认是将设置保存在注册表。如果想保存注册表干净,请选择此项;但如果觉得JavaMagic.cfg这个文件看着碍眼,那么请不要选择此项。

  其中“仅显示摘要”、“输出到子文件夹”及“过滤Manifest属性及字符”“jar中文文件名自动改名”有三种设置状态(不选,选择和半选)。当设置于第三态时,“仅显示摘要”表示转换单个游戏时显示详细分析过程,转换多个游戏时仅显示摘要;“输出到子文件夹”表示转换单个游戏时输出文件与原游戏在统一文件夹下,转换多个游戏时才输出到子文件夹。

  根据您的需要设置好JavaMagic后,点击“保存”,现在您可以使用它对您的游戏进行处理了。您可以点击“处理jar”选择要处理的游戏,或者将游戏直接拖放到JavaMagic主窗口上。此外,在没启动JavaMagic的时候,您也可以像使用jadgen那样,将游戏直接拖到JavaMagic的图标上进行转换。不必担心把其它类型的文件拖了进去,JavaMagic会自动识别,只对jar文件进行处理。

540) this.width = 540'>

  在处理过程中可以在信息框中看到分析和转换结果,下面是正在处理的文件和当前进度。转换过程中无法退出,需要先点击“中止”或按[Esc]键中断处理过程(会在当前游戏转换结束后,下一个游戏开始转换前提示是否中止)。虽然JavaMagic的处理上限是每次1024个文件,但因为处理速度比较慢,一般不建议一次处理过多的文件,以免使您精神焦虑和烦躁。每个游戏顺利处理完毕后会有

转换完成。请使用以下文件:
[] D:\Java\foo\JavaMagic_out\bar_new.jar

这样的提示,并会自动生成对应的jad文件。现在您可以将新生成的游戏传入您的手机中进行测试了。有条件的话最好先用模拟器测试,如果发现有问题可能需要修改JavaMagic的相关设置重新进行处理。

  正如上面所说,同样的设置不是对所有的游戏都适用。很多时候都需要针对个别游戏修改设置,重新对游戏进行处理。比如,我的手机屏幕是128x160的,全屏选项那里用的是“仅当游戏可能能自动适应屏幕高度时全屏”,但有的游戏只是在部分场合会适应全屏分辨率,大多数情况下都是只用到128x128的区域。这时我就要将设置改为为“不强制使用全屏模式”,“不对分辨率进行指定”,重新对游戏进行处理。

  还有,如果游戏经过处理后不能正常工作,可以尝试用FullJava处理,如果FullJava处理过的游戏正常,则很可能是JavaMagic的某些设置造成游戏不正常。您可以尝试选择“用WinRAR压缩jar”,并修改“Manifest与Jad选项”中两个过滤选项的设置,重新对游戏进行处理。如果仍然有问题,欢迎向我报告。

  目前JavaMagic仍然不够完善,也没进行太多的测试。而且我使用的测试环境主要是Alcatel的Java模拟器,其行为可能会与其它品牌手机的Java虚拟机不一致。如果您在使用过程中发现了什么问题,欢迎通过JavaMagic主页的留言簿或E-mail告诉我。JavaMagic的主页是:

[]http://ohfaint.3322.org/javamagic
[]
  最后,感谢“手机游戏修改群”里的朋友们的支持与鼓励!


--------------------------------------------------------------------------------

本文档更新历史:

[]Rev 1.0: 09/21/2005 - 第一版

Rev 1.1: 09/29/2005 - 针对JavaMagic 0.52 beta进行修正

Rev 1.2: 10/09/2005 - 修改了“分辨率”部分的内容;针对JavaMagic 0.53 beta进行修正

  
http:///tech/article2127.html
</td></tr></table></td> </tr> <tr> <td background="/pic/split.gif" height=1></td> </tr> <tr> <td class="tdMargin1">
↑返回目录
前一篇: PngMate使用教程
后一篇: 手机游戏修改(2)工具