`
vlinux
  • 浏览: 52383 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

《热血传奇》wix、wil文件解析Java实现

阅读更多

解析的教程在网络上一抓一大把,我都分不清那个是原创了。不过有一点肯定的是,目前都没有Java版本,恩恩:),处于好奇,我稍稍用Java写了一个以供消遣。

 

写的过程中发现,其实教程有部分是错误的。而且很多地方也描述的不够详细,让我在实现的过程中走了不少弯路。还好有TC256编程的功底HOHO。

 

Wix文件格式说明

传奇的wix文件是索引文件,里面指出了图片素材的起始位置。

byte[44]是固定的头文件,网络上的教程都一律写成40个字节,实际上应该是44个。

byte[4]图片数量,低位在前,我在CommonUtil.bytesToInt的方法中实现了低位高位的转换,并且转成Java的整数输出

byte[?][4]这是一个二维数组,里面存储了每张图片在对应的wil文件中的起始位置。

remeber:起始位置是在wix中定义的,别妄想直接在wil文件中按照顺序弄出来,会吃闭门羹的。

 

Wil文件格式说明

byte[44]固定头文件

byte[12]应该是控制Frame播放的速度、是否重复之类的信息的,和我们无关

byte[1024]BMP中最重要的调色板实际上应该是byte[256][4]

-------以上是Wil文件头的固定格式,从下边开始则是每张位图的数据,位图的开始是在Wix中定义的---------

byte[2]宽度

byte[2]高度

byte[4]位图数据起始标志

byte[?]位图数据,大小为width * height

 

原图是8BIT的位图数据。为了减轻在Android上的开发负担,我擅自决定:解析时将其作为为背景透明的PNG图片文件格式,不喜者可以注释掉相关代码。

 

				// ---------- 增加下面的代码使得背景透明 -----------------
				image = g2d.getDeviceConfiguration().createCompatibleImage(
						width, height, Transparency.TRANSLUCENT);
				g2d.dispose();
				g2d = image.createGraphics();
				// ---------- 背景透明代码结束 -----------------
 

 

主要的格式说明就这些,具体的请看代码。代码在附件中,与此同时,我还提供了《热血传奇》的wix和wil文件。

 

太困了,睡觉....

分享到:
评论
9 楼 langwenai 2017-11-26  
没学过Java
8 楼 langwenai 2017-11-26  
用什么工具执行这Mir2Tools  我不会用 能教下我吗
7 楼 大器晚成 2011-04-10  
楼主知道技能光效的半透明怎么处理吗 
6 楼 aolongxue 2011-01-09  
楼主的代码只能解析8位的wil,如npc.wil
但16位的如items.wil则会显示颜色错误,

貌似是调色板错误,格式没错
5 楼 aolongxue 2011-01-09  
楼主的代码只能解析8位的wil,如npc.wil
但16位的如items.wil则会显示颜色错误,

貌似是调色板错误,格式没错
4 楼 vlinux 2010-10-14  
大器晚成 写道
非常感谢  我也想做这样的游戏 不知你现在做的怎么样了

没再做了,毕竟精力太有限了
3 楼 大器晚成 2010-10-11  
非常感谢  我也想做这样的游戏 不知你现在做的怎么样了
2 楼 vlinux 2010-07-30  
res |= temp
就是将res和temp进行或操作,然后将结果赋给res

    /**
     * 二进制转换整数(支持倒序)
     * @param bytes
     * @param reverse
     * @return
     */
    public static int bytesToInt(byte[] bytes, boolean reverse) {

        if( reverse ) {
            //倒序
            byte[] revBytes = new byte[bytes.length];
            for( int i=0; i<bytes.length; i++ ) {
                revBytes[bytes.length-i-1] = bytes[i];
            }//for
            bytes = revBytes;
        }//if

        int mask = 0xff;
        int temp = 0;
        int res = 0;
        for (int i = 0; i < bytes.length; i++) {
            res <<= 8;
            temp = bytes[i] & mask;
            res |= temp;
        }//for
        return res;
    }


这个方法当时是胡乱写的,你就不要太纠结了。现在看过去满目的错误逻辑
1 楼 imshare 2010-07-30  
请问LZ这句代码是什么意思?"res |= temp;"

相关推荐

Global site tag (gtag.js) - Google Analytics