|
网站上的东西已经可以下载了。
复活图片察看器
全部是代码:
没有整理好,抱歉。
如果你要转载我的帖子,请著名( "作者:叶风(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 |
|