飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 9128|回复: 4

Funmobile公司游戏汉化浅谈——图片字库的汉化

[复制链接]
  • TA的每日心情
    开心
    2024-10-8 02:05
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2007-3-31 15:11:30 | 显示全部楼层 |阅读模式
    Funmobile公司游戏汉化浅谈——图片字库的汉化
    作者: kim1997 来源:迷你手游社区

    Funmobile公司游戏一般画面比较精美,可玩性也很强,但是,大部分都是英文的,而且都使用了图片字库,基本不能简单汉化。最近对该公司游戏的汉化做了一定研究,现将研究心得写一下,希望对扩展大家的汉化思路有所帮助,并能够多多交流,能够汉化更多的优秀游戏。
    首先看该公司的游戏代码,一般基本都含有以下几个类(以S60的幻想战争Fantasy Battle为例):
    主midlet类:GameMidlet.class,主入口类。
    游戏接口类:m.class,定义了常用的几个抽象方法,主要有:初始化操作,线程处理,按键按下处理,按键释放处理,音乐处理,绘图处理等
    主canvas类:b.class,主要定义了基本的画面和按键操作还有线程的建立。
    游戏canvas类:h.class,继承自b.class,主要建立了两个显示不同游戏状态的类:e.class,f.class的实例,另外建立接口m.class的系列实例。
    游戏菜单操作类:e.class,继承了m.class接口,主要是菜单显示及切换的操作。
    游戏画面类:f.class,继承了m.class接口,主要是主游戏画面的显示绘制及操作。
    图形类:k.class,定义了所有该游戏中使用到的所有绘图方法,以及图片载入方法。
    字体类:c.class,定义了字体的绘制方法。
    其他的类还有地图类事件类,就不一一作描述了。
    我们主要感兴趣的是字体类,它对应了一系列字母的绘制方法,它的构造函数为:
    public c(short word0, byte abyte0[], byte byte0, char ac[])
    通过查看,以上几个参数分别代表以下意思:
    short word0:字体对应的图片号
    byte abyte0[]:字体中每一个字符的宽度
    byte byte0:字体的高度
    char ac[]:字体中的字符
    游戏中用来表示字体的图片有两张,19.png和20.png,我们在a.class中发现了两个字体类的实例:
    e = new c((short)20, a, (byte)8, c);
    f = new c((short)19, b, (byte)8, d);
    而且,a.class中包括有:
    public static final byte a[]
    public static final byte b[]
    public static final char c[]
    public static final char d[]
    byte a[]和char c[]是一一对应的,也就是c在表示字体的图片中的宽度就是a,同理byte b[]和char d[]也是如此。
    在不反编译重新编译的情况下如果要实现汉化看起来几乎是不可能的,但是我们可以换个思路思考,可不可以通过对图片的修改来实现对字体类的修改。可能不好理解,这样解释:原来是“Enable sound?”的地方,

    我们把它改成字母A,而把图片对应的A的地方改成图片:“新的游戏”再把图片宽度对应的地方修改成“新的游戏”的宽度,这样,该处不就完成了汉化了吗?先实现一下看看:
    首先,我们用Hex Workshop软件打开e.class,Ctrl+F查找文本字串“Enable sound?”,

    把它修改成“A”,记住要把字节数同时修改掉。

    然后,我们需要把图片19.png

    中A字母的地方改掉:

    接下来把a.calss文件中的宽度和高度改掉:


      
    原来:f = new c((short)19, b, (byte)8, d);
    public static final byte b[] = {
            7, 7, 6, 7, 6, 6, 7, 6, 6, 6,
            6, 6, 7, 6, 7, 6, 7, 6, 6, 6,
            6, 6, 7, 7, 6, 5, 4, 4, 4, 4,
            4, 4, 4, 4, 2, 3, 4, 2, 8, 5,
            4, 4, 4, 4, 4, 3, 4, 4, 7, 4,
            4, 4, 6, 6, 6, 6, 6, 6, 6, 6,
            6, 6, 6, 6, 6, 6, 6, 6, 6, 5,
            6, 6, 6, 6
        };
    修改后:f = new c((short)19, b, (byte)11, d);
    public static final byte b[] = {
            80, 7, 6, 7, 6, 6, 7, 6, 6, 6,
            6, 6, 7, 6, 7, 6, 7, 6, 6, 6,
            6, 6, 7, 7, 6, 5, 4, 4, 4, 4,
            4, 4, 4, 4, 2, 3, 4, 2, 8, 5,
            4, 4, 4, 4, 4, 3, 4, 4, 7, 4,
            4, 4, 6, 6, 6, 6, 6, 6, 6, 6,
            6, 6, 6, 6, 6, 6, 6, 6, 6, 5,
            6, 6, 6, 6
        };
    接下来,把修改好的图片和类文件拖回到jar文件中,运行试试:

    坐标还有些问题,然后我们再把e.class文件中的坐标相应位置改掉:

    原来:
    s.a(k1, (c - 95) / 2, (d - 23) / 2 - 1, 95, 23);
    b.f.a(k1, c / 2, d / 2 - 4, "A", (byte)1);

    修改后:

    s.a(k1, (c - 95) / 2, (d - 23) / 2 - 1, 95, 27);
    b.f.a(k1, c / 2, d / 2 - 4, "A", (byte)1);
    拖回去看看:

    怎么样?一切OK了。接着其他地方也就一样处理了。这个方法就是比较麻烦,而且可能会出现字母不够用的情况,这里只是提供一种新的汉化思路,在文本不大的游戏和图片能够提取的情况下,还是值得考虑的。不过最好的汉化方法还是反编译,以后有时间会写一些其他方面的心得,希望大家支持!








































    责任编辑: 乾 .:|:. 标签(Tag): JAR 图片字库

    [ 本帖最后由 30903861 于 2007-3-31 15:13 编辑 ]
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2025-1-14 23:17
  • 签到天数: 2225 天

    [LV.Master]伴坛终老

    发表于 2007-4-17 11:14:58 | 显示全部楼层
    不错啊,又学到了一些汉化知识
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-4-17 14:55:38 | 显示全部楼层
    谢谢楼主分享,辛苦了。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-4-27 12:13:38 | 显示全部楼层
    谢谢楼主分享,辛苦了。/:03
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-5-10 09:22:59 | 显示全部楼层
    呵呵,老文章了 ~~
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表