游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3385|回复: 2

“目标”软件 之游戏图片格式 xbm 和 资源库文件 之二

[复制链接]

17

主题

201

帖子

242

积分

中级会员

Rank: 3Rank: 3

积分
242
QQ
发表于 2004-5-11 17:38:00 | 显示全部楼层 |阅读模式
网站上的东西已经可以下载了。
复活图片察看器

全部是代码:
没有整理好,抱歉。
如果你要转载我的帖子,请著名( "作者:叶风(windlucid) qq:239302992")

剑侠系列图片相关贴子。

       第一篇:关于金山公司的剑侠情缘系列游戏的图片格式 之一

       第二篇:关于金山公司的剑侠情缘系列游戏的图片格式 之二
   
       第三篇:关于金山公司的剑侠情缘系列游戏的图片格式 之三
      
新贴:[em3]  [em3]  [em3]
       第一篇:“目标”软件 之游戏图片格式 xbm 和 资源库文件

       第二篇:“目标”软件 之游戏图片格式 xbm 和 资源库文件 之二

全代码:
      
       声明: 本文的程序经过调试,成功运行。
           我不会对本程序所带来的一切后果负责。
           感谢目标公司的美工(图片太美了)
           本文没有任何商业行为,纯属自娱自乐
     

            

       有人问我,为什么老是研究图片格式。
     我说:
         1。我没有美工,我只有自己,我不会画画。但是,我要精美的图片。
         2。我没有人询问,想知道成功游戏中的图片粘贴方法,地图的建立方法。。。所有游戏中不公开的方法,只有研究游戏运行时的内存。
         3。我自己写的引擎,太长,我也没办法抄到这里。只有发一点哗众取宠的贴子,来吸引你们的眼球。
         4。我还没想到,想到了,一定说。(好苦啊)


//第二个文件:xbmcode.cpp

//第二个文件:xbmcode.cpp

//
#include "stdio.h"
#include "math.h"
#include "xbmdefine.h"

int JieLib(const char *fname,const char *objectpath,const char *objectname)
{
        FILE *file1=NULL;
        //subfilecount
        int sfc=0;
        //subfile infomation
        LPSubFileInfo sfi=NULL;
        //now reading subfile No!
        int now_sf=0;
        int now_truesf=0;
       
        //open the lib file
        file1=fopen(fname,"rb");
        if(file1==NULL)
                return 1;
        //read flags
        char str1[16];
        char str2[16];
        memset(str1,0,16);
        memset(str2,0,16);
        fread(str1,1,16,flie1);
        if(strcmp(str1,"Lib 1.01"))
    {
                fclose(file1);return 1;
    }
        //read subfilecount
        fread(&sfc,1,4,file1);
        if(sfc==0)
        {fclose(file1);return 1;}
        //set new position
        fseek(file1,0x100,SEEK_SET);
        //create subfile infomation
        sfi=new SubFileInfo[sfc];
        //read subfilecount
        fread(sfi,sizeof(SubFileInfo),sfc,file1);
       
        //bmp文件名制作
        char bfname[128];
        char bfnamelen=0;
        char bfname2[16];
        char bfname1[16];
        memset(bfname,0,128);
        memset(bfname1,0,16);
        memset(bfname2,0,16);
        strcpy(bfname2,"00000%d");
        strcpy(bfname,objectpath);
        strcat(bfname,objectname);
        bfnamelen=strlen(bfname);
        strcat(bfname,"000000.bmp");
       
        //缓冲,要多大?
        char *dbuf=new char[1*1024*1024];
        char *dbuf1=new char[2*1024*1024];
        char *dbuf2=new char[3*1024*1024];
        //开始循环读取,保存xbm->bmp
        int result=0;
        while(now_sf<sfc)
        {
                //没有数据
                if(sfi[now_sf].address==0 || sfi[now_sf].length==0)
                        goto next;
                ///
                fseek(file1,sfi[now_si].address,SEEK_SET);
                //
                fread(dbuf,1,sfi[now_sf].length,file1);
                //制作bmpfjile name
                //format  :  path ,name ,No!(000000)
                sprintf(bfname1,bfname2,now_truesf);
                memcpy(bfname+bfnamelen,bfname1+strlen(bfname1)-6,6);
                //save
                result=savelibxbm(bfname,dbuf,dbuf1,dbuf2);
                if(result!=0)
                        goto next;
                //true count
                ++now_truesf;
next:   
                ++now_sf;
        }
        //
        fclose(file1);
        //
        delete dbuf2;
        delete dbuf1;
        delete dbur;
        delete sfi;
       
       
        return 0;
}

int savalibxbm(const char *fname,char *xbmdata,char *bmp16,char *bmp24)
{
        static int result=0;
        XBMFILEHEADER *xbmfh=NULL;
        //
        xbmfh=(LPXBMFILEHEADER)xbmdata;
        if(strcmp(xbmfh->flags,"xbm"))
                return -1;
        //
        result=xbm216bmp(xbmfh,xbmdata+sizeof(XBMFILEHEADER),bmp16);
        if(result!=0)return 1;
        //
        result=xbm16to24(xbmfh,bmp16,bmp24);
        if(result!=0)return 1;
        //
        result=save24bmp(xbmfh,fname,bmp24);
        if(result!=0)return 1;
        return 0;
}
int save24bmp(LPXBMFILEHEADER lpxbm,const char *fname,char *bmp24)
{
        //save to bmp file
        FILE *bmpFile=NULL;
        BITMAPFILEHEADER bmpHeader;
        BITMAPINFO bmpInfo;
        char *tempData;
        int nPitch=0;
        nPitch=lpxbm->width*3+(lpxbm->width&0x3);
        int nlen=(lpxbm->width*3+(lpxbm->width&0x3))*lpxbm->height;
        tempData=bmp24+nlen-nPitch;
        bmpFile=fopen(fname,"w+b");
        if(bmpFile==NULL)
                return 1;
       
        //
        bmpHeader.bfOffBits=54;
        bmpHeader.bfSize=nlen+54;
        bmpHeader.bfType=19778;
        bmpHeader.bfReserved1=0;
        bmpHeader.bfReserved2=0;
       
        bmpInfo.bmiHeader.biSize=40;
        bmpInfo.bmiHeader.biWidth=lpxbm->width;
        bmpInfo.bmiHeader.biHeight=nHeight;
        bmpInfo.bmiHeader.biPlanes=1;
        bmpInfo.bmiHeader.biBitCount=24;
        bmpInfo.bmiHeader.biCompression=0;
        bmpInfo.bmiHeader.biSizeImage=nlen;
        bmpInfo.bmiHeader.biXPelsPerMeter=3780;
        bmpInfo.bmiHeader.biYPelsPerMeter=3780;
        bmpInfo.bmiHeader.biClrUsed=0;
        bmpInfo.bmiHeader.biClrImportant=0;
       
        fwrite(&bmpHader,1,sizeof(bmpHeader),bmpFile);
        fwrite(&bmpInfo,1,sizeof(bmpInfo),bmpFile);
       
        fseek(bmpFile,(-1)*sizeof(bmpInfo.bmiColors),SEEK_CUR);
        for(;nHeight>0;--nHeight)
        {
                fwrite(tempData,1,nPitch,bmpFile);
                tempData-=nPitch;
        }
        fclose(bmpFile);
        return 0;
}
int bmp16to24(LPXBMFILEHEADER lpxbm,char *bmp16,char *bmp24)
{
        BYTE b=0;
        BYTE g=0;
        BYTE r=0;
        short *bmp=(short *)bmp16;
        char *bmp2=bmp24;
        int c=0;
        int d=0;
       
        while(d<lpxbm->height)
        {
                c=0;
                while(c<lpxbm->width)
                {
                        r=((*bmp&0xf800)>>11)<<3;
                        g=((*bmp&0x7e0)>>6)<<3;
                        b=((*bmp&0x1f))<<3;
                        *bmp++=b;
                        *bmp++=g;
                        *bmp++=r;
                       
                        ++bmp; //指向下一点
                        ++c;
                }
                //
                memset(bmp2,0,lpxbm->width&0x3);
                bmp2+=(lpxbm->width&0x3);
                ++d;//下一行
               
        }
        return 0;
       
}
int xbm216bmp(LPXBMFILEHEADER lpxbm,char *xmbdata,char *bmp16)
{
        //a line a line
        int a=0;
        int b=0;
        int c=0;
        int d=0;
        int w=0;
        int h=0;
        char *bmp=NULL;
        int m=0;
        short *n=NULL;
        int pm=0;
        int istwoZero=0;
       
       
        h=lpxbm->height;
        w=lpxbm->width*2;
        n=(short*)(xbmdata+sizeof(int)*h);
        bmp=bmp16;
        while(a<h)
        {
                b=0;
                pm=0;
                istwoZero=0;
                wile(b<w)
                {
                        c=*n;
                        ++n;
                        if(c==0)
                        {
                                pm=1;
                                ++istwoZero;
                                if(istwoZero==2)
                                        return 1;
                               
                        }
                        else if(c<0)
                        {
                                return 1;
                        }
                        else
                        {
                                istwoZero=0;
                                if(pm==1)
                                {
                                        if((b+c)>w)
                                                return 1;
                                        memcpy(bmp,n,c);
                                        bmp+=c;
                                        n+=c/2;
                                        b+=c;
                                        pm=0;
                                }
                                else
                                {
                                        d=0;
                                        if((b+c)>w)
                                                return 1;
                                        while(d<c)
                                        {
                                                *bmp=0x1f;
                                                ++bmp;
                                                *bmp=0xf8;
                                                ++bmp;
                                                d+=2;
                                               
                                        }
                                        b+=c;
                                        pm=1;
                                }
                        }
                }
                ++a;
        }
        return 0;
}



好了,罗嗦到这里了.
   有空再续.
                                                                           作者  : 叶风 (WindLucid)
                                                                           qq    : 239302992
                                                                           email: windlucid@126.com

16

主题

158

帖子

168

积分

注册会员

Rank: 2

积分
168
发表于 2004-5-11 23:38:00 | 显示全部楼层

Re:“目标”软件 之游戏图片格式 xbm 和 资源库文件 之二

把exe文件和代码传上来吧,老掉人胃口,哈哈

3

主题

19

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2004-5-12 10:55:00 | 显示全部楼层

Re: “目标”软件 之游戏图片格式 xbm 和 资源库文件 之二

晕死,xbm216bmp这个函数有问题呀,运行后什么文件都不生成,你的代码真lj,到处都是错误。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-30 21:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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