例如伏魔記
(資料是可以用c直接讀取的)
0x0 :lib
0x3 伏魔記 00 0
0x0e 全域性色彩位元組數: 2或4,建議選擇4
0x0f 非零有壓縮,0無壓縮,建議選擇有壓縮1
0x10開始 三位元組索引(與lib一致索引)(unsigned char restype ,unsigned char type ,unsigned char index) ...;
0x2000 開始 四位元組位址(相對檔案頭偏移) (unsigned int mdataoffset)...
typedef struct gmcheadstru gmchead; //16位元組資訊頭
gmchead mygmchead;
typedef struct gmcindexstrugmcindex;
gmcindex allgmcindex[2726]; //與lib一致的索引,0x10開始, (0x2000-16)的索引空間最多2725個資源
unsigned int allgmcaddr[2725];//位址是真實位址,0x2000開始
初始化讀取如下:
file* file;
/* 裝載原始檔資料到緩衝區 */
if((file = fopen("dat.gmc", "rb")) == null)
// 測試檔案頭
fread(&mygmchead,16,1,file);
char teststr[4];
memset (teststr,0,4);
memcpy(teststr,mygmchead.ckheadstr,3);
if(stricmp(teststr,"gmc"))
//判斷畫素位元組大小
if(mygmchead.sizeofpixcel!=4)
//讀取索引和位址
fseek(file,16,seek_set);
fread(&allgmcindex,0x2000-16,1,file);
fseek(file,0x2000,seek_set);
fread(&allgmcaddr,2725<<2,1,file);
索引查詢方法
unsigned int getgmcaddr(int rtype, int otype, int oindex)
return 0;
}
讀取案例:
int resaddress=getgmcaddr(5,2,1);
printf("mysrs resaddress=%d\n",(int)resaddress);
fseek(file,resaddress,seek_set);
srs *mysrs=readsrs(file);
resaddress=getgmcaddr(7,1,1);
printf("mpic resaddress=%d\n",(int)resaddress);
fseek(file,resaddress,seek_set);
pic*mpic=readpic(file);
#include "zlib\zlib.h"
#pragma comment(lib,"zlib\\release\\zlib.lib")
使用了zlib讀取需匯入zlib庫
資源資料只有動畫 和資料不一樣,其他例如指令碼、npc、地圖等資料與lib一致。
地圖分割為32*32,npc大多數也是32的倍數,最常見rpg素材是32分割,原始碼中已經收集齊幾乎所有符合這種rpg彩色的npc素材和地圖素材。
戰鬥背景320*200(**於仙劍98資源),也就是主視窗至少320*200(因為仙劍98也是這麼大視窗)
地圖資源多數是**於軒轅劍之楓之舞地圖。
pic資料 mdataoffset +0
頭6位元組,依次是
mwidth,mheight,mnumber,mtransparent
typedef struct picheadstru pichead;
typedef struct pixcelstru pixcel;
typedef struct picstr pic;
mdataoffset +6 是畫素資料,可以壓縮
例如讀取案例
pic* readpic(file* file)
fread(&mypic->myphead,6,1,file); //讀取頭
printf("pic w=%d,h=%d,n=%d,t=%d\n",(int)mypic->myphead.mwidth,(int)mypic->myphead.mheight,
(int) mypic->myphead.mnumber,(int)mypic->myphead.mtransparent);
if(!mygmchead.iscomressed)
fread(mypic->pixs,picpixsize,1,file); //直接讀取
}else
fread(fbuf, 1, flen, file);//讀取已壓縮資料
// memcpy(&ulen,fbuf+ flen-4, 4); /* 獲取緩衝區大小 */
//printf("解壓畫素位元組數=%d\n",ulen);
/* 解壓縮資料 */
int failed_number=0;
while(failed_number < 4)
if(uncompress(ubuf, &ulen, fbuf, flen) != z_ok)
else
}if(failed_number==4)
free(fbuf);//釋放已壓縮資料的快取
mypic->pixs=(pixcel *)ubuf;/* 儲存解壓縮後的資料到目標檔案 */
}//測試畫素(0,1)紅值
//printf( "(0,1)畫素 r=%d\n",(mypic->pixs+(1*mypic->myphead.mwidth+0))->red);
return mypic;
}
用完後釋放
void freepic(pic* despic)
srs資料mdataoffset +0是資料頭,依次mtype,mindex ,mframenum,mimagenum ,mstartframe ,mendframe
mdataoffset +6是幀資料,大小7*mframenum
typedef struct srsheadstru srshead;
typedef struct framestru srsframe;
typedef struct srsstru srs;
mdataoffset +6+7*mframenum是資料
讀取srs方法
srs * readsrs(file* file)
fread(&mysrs->srshead,6,1,file);
if((mysrs->mframes= (srsframe*)malloc(7*mysrs->srshead.mframenum )) == null)
int i;//必須迴圈讀取,因為編譯器結構體大小判斷不准,每幀讀取7位元組
for (i=0;isrshead.mframenum;i++)fread(mysrs->mframes,7/*必須數字7*/ ,1,file);
if((mysrs->pics= (pic**)malloc( mysrs->srshead.mimagenum<<2)) == null)
pic * frampic;
for (i=0;isrshead.mimagenum;i++)
mysrs->pics[i]=frampic;
}return mysrs;
}
用完後釋放
void freesrs(srs * dessrs)
free(dessrs->mframes);
free(dessrs);
}
例子原始碼vc6(親測,已編譯通過)
關於檔案結構
根目錄,所有的目錄 檔案 裝置都在 之下,就是linux檔案系統的組織者,也是最上級的領導者。bin bin 就是二進位制 binary 英文縮寫。在一般的系統當中,都可以在這個目錄下找到linux常用的命令。系統所需要的那些命令位於此目錄。boot linux的核心及引導系統程式所需要的檔案目錄,...
關於結構體
關鍵字struct表示定義的是結構體的資料型別,緊隨其後的識別符號student是結構體型別名。花括號中依次列舉該型別的每個成員資料型別及其名稱,每個成員的資料型別可以是基本資料型別或者自定義資料型別,但是不能重名。結構的成員也成為域。結構體型別的定義以乙個分號結束。由於資料型別僅是為變數分配儲存空...
關於結構體
結構不可以定義無參的建構函式,缺省內置乙個 結構只能定義有參的建構函式,通過建構函式初始所有成員變數 結構可以不使用操作符new來例項化,但是在使用該結構時必須先給所有成員初始化 結構不能繼承,也不能被繼承 結構可以實現介面 結構不能存在受保護的成員,虛成員還有抽象成員 1.結構是值型別的,不是引用...