當前位置:編程學習大全網 - 源碼下載 - 夢幻西遊的地圖是什麽格式的

夢幻西遊的地圖是什麽格式的

《大話西遊II》和《夢幻西遊》地圖文件格式讀取類 實現代碼

此類是本人編寫的,主要用於讀取《大話西遊II》和《夢幻西遊》地圖文件格式, 而對於地圖中各個單元的處理功能不包含在這個類中,可以寫其他相關的類做這個方面的處理.本類主要用在教學研究方面,不得應用在商業領域以及其他侵害網易公司利益的地方. 本人不保證此類的安全和質量.如有疑慮請勿使用.參考資料:

Map File Old Format

Map File New Format

大話1302新地圖格式

大話0038新地圖格式

/*********************************************************************************************

* 《大話西遊II》和《夢幻西遊》

* 地圖文件格式讀取類

*---------------------------------------------------------------------------------------------

* 版本 2.2.0

*

* 王大理 <wdl@sina.com>

* 2006年05月20日

*---------------------------------------------------------------------------------------------

* 聲明:

* 本源代碼應用於網易公司的網絡遊戲《大話西遊II》和《夢幻西遊》地圖文件格式的讀取。

* 與此源代碼相應的文件格式版權屬於網易公司所有。

* 此源代碼應用於教育目的,禁止用於商業目的,否則後果自負,本源代碼作者不承擔任何責任。

* 如有異議請務使用本源代碼,並永久刪除此源代碼。

*---------------------------------------------------------------------------------------------

* 版權所有(c) 2006 王大理 , 保留所有權利。

*********************************************************************************************/

#include "ReadGameMap.h"

using namespace NetEase; // 使用NetEase命名空間ReadGameMap::ReadGameMap(void)

{

//m_MapWidth=0; // 初始化地圖的寬度

//m_MapHeight=0; // 初始化地圖的高度

m_SubMapWidth=320; // 初始化子地圖寬度

m_SubMapHeight=240; // 初始化子地圖高度

m_MaskTemp=1; // 初始化MASK臨時變量

//m_SubMapRowNum=0; // 子地圖的行數量

//m_SubMapColNum=0; // 子地圖的列數量

//m_SubMapTotal=0; // 子地圖的總數

}ReadGameMap::~ReadGameMap(void)

{

}// 加載地圖文件

bool ReadGameMap::LoadMap(char *filename)

{

FILE *fp;

//m_FileName=filename; // 全局變量地圖文件名 strcpy(m_FileName,filename); // 打開流

if( (fp = fopen(m_FileName, "rb" )) == NULL)

{

printf("打開文件錯誤。\n");

return false;

} // 讀取地圖文件頭

MapHeader header;

fread(&header, sizeof(MapHeader), 1, fp); // 讀取地圖文件頭 m_MapWidth=header.Width; // 地圖的寬度

m_MapHeight=header.Height; // 地圖的高度 m_SubMapRowNum=ceil((float)(m_MapWidth/m_SubMapWidth)); // 計算行中子地圖的數量

m_SubMapColNum=ceil((float)(m_MapHeight/m_SubMapHeight)); // 計算列中子地圖的數量

m_SubMapTotal=m_SubMapRowNum*m_SubMapColNum; // 計算地圖中總的子地圖數量 //printf("Flag=0x%X\n",header.Flag);

//printf("Width=%d\n",header.Width);

//printf("Height=%d\n",header.Height);

//printf("m_SubMapTotal=%d\n",m_SubMapTotal); // 判斷文件頭是否正確(MAPX) && (M1.0)

if((header.Flag!=0x4D415058) && (header.Flag!=0x4D312E30))

{

printf("未支持的地圖文件格式。\n");

return false;

} // 讀取子地圖偏移值列表

m_SubMapOffsetList=new uint32[m_SubMapTotal]; // 自動分配列表空間

fread(m_SubMapOffsetList, sizeof(uint32), m_SubMapTotal, fp); // 讀取列表

fread(&m_MapSize, sizeof(uint32), 1, fp); // 讀取文件大小或文件頭的大小 //printf("m_SubMapOffsetList=0x%X\n",m_SubMapOffsetList[60]); // MAPX

if (header.Flag == 0x4D415058)

{

ReadJPGH(fp); // 讀取JPGH的數據

m_FileType=1; // 設置地圖文件類型

}

// M1.0

if (header.Flag == 0x4D312E30)

{

ReadHEAD(fp); // 讀取新地圖的數據

m_FileType=2; // 設置地圖文件類型

} fclose(fp); // 關閉流

return true;

}// 讀取地圖JPGH的數據

bool ReadGameMap::ReadJPGH(FILE *fp)

{

UnitHeader JpegHead;

fread(&JpegHead,sizeof(JpegHead),1,fp); // 讀取單元頭的數據 // 判斷標誌是否正確(HGPJ)

if (JpegHead.Flag!=0x4A504748)

{

printf("JPEG HEADER 標誌錯誤。\n");

return false;

}

m_jpgh.Data = new uint8[JpegHead.Size]; // 分配單元數據的內存空間

m_jpgh.Size=JpegHead.Size;

fread(m_jpgh.Data,JpegHead.Size,1,fp); // 讀取單元數據

//PrintHex(m_JpegHeadDate,JpegHead.Size);

return true;

}// 讀取地圖HEAD的數據

bool ReadGameMap::ReadHEAD(FILE *fp)

{

uint32 HeaderSize; HeaderSize=m_SubMapOffsetList[0]-m_MapSize; // 計算地圖頭數據的大小

m_head.Size=HeaderSize;

m_head.Data = new uint8[HeaderSize];

fread(m_head.Data,sizeof(uint8),HeaderSize,fp); // 讀取地圖頭數據

//PrintHex(MapHeadData.Data,MapHeadData.Size);

return true;

}// 讀取地圖的單元數據

bool ReadGameMap::ReadUnit(uint32 UnitNum)

{

FILE *fp;

int64 seek;

bool Result;

bool loop=true;

char * filename;

m_MaskTemp=1; // 打開流

//printf("m_FileName=%s\n",m_FileName);

if( (fp = fopen(m_FileName, "rb" )) == NULL)

{

printf("打開文件錯誤。\n");

return false;

} seek=m_SubMapOffsetList[UnitNum];

//printf("Seek=0x%X\n",seek);

fseek(fp,seek,SEEK_SET);

fread(&m_MaskNum,sizeof(uint32),1,fp); // 讀取MASK的數量

//printf("m_MaskNum=%d\n",m_MaskNum); // 新地圖使用

if ((m_FileType==2) && (m_MaskNum>0))

{

//printf("New Map!\n");

m_MaskList = new uint32[m_MaskNum];

fread(m_MaskList,sizeof(uint32),m_MaskNum,fp);

} UnitHeader unit; while(loop)

{

fread(&unit,sizeof(UnitHeader),1,fp); // 讀取單元的頭數據 //printf("單元標誌=%X\n", unit.Flag);

//printf("單元大小=%d\n", unit.Size); switch(unit.Flag)

{

// GAMI "47 41 4D 49"

case 0x494D4147:

Result=ReadIMAG(fp,unit.Flag,unit.Size);

break; // GEPJ "47 45 50 4A"

case 0x4A504547:

Result=ReadJPEG(fp,unit.Flag,unit.Size);

break; // KSAM "4B 53 41 4D"

case 0x4D41534B:

Result=ReadMASK(fp,unit.Flag,unit.Size);

break; // KOLB "4B 4F 4C 42"

case 0x424C4F4B:

Result=ReadBLOK(fp,unit.Flag,unit.Size);

break; // LLEC "4C 4C 45 43"

case 0x43454C4C:

Result=ReadCELL(fp,unit.Flag,unit.Size);

break; // GIRB "47 49 52 42"

case 0x42524947:

Result=ReadBRIG(fp,unit.Flag,unit.Size);

loop=false;

break; // 默認處理

default:

m_EndUnit.Flag=unit.Flag;

m_EndUnit.Size=unit.Size;

loop=false;

//printf("Flag錯誤!\n");

//printf("Flag=0x%X\n\n",unit.Flag);

break;

//return false;

} }

fclose(fp);

}// 讀取地圖寬度

uint32 ReadGameMap::ReadMapWidth()

{

return m_MapWidth;

}// 讀取地圖高度

uint32 ReadGameMap::ReadMapHeight()

{

return m_MapHeight;

}// 讀取子地圖的寬度

uint32 ReadGameMap::ReadSubMapWidth()

{

return m_SubMapWidth;

}// 讀取子地圖的高度

uint32 ReadGameMap::ReadSubMapHeight()

{

return m_SubMapHeight;

}// 讀取子地圖的總數量

uint32 ReadGameMap::ReadSubMapTotal()

{

return m_SubMapTotal;

}// 讀取子地圖中Mask的總數

uint32 ReadGameMap::ReadMaskTotal()

{

return m_MaskNum;

}// 讀取地圖文件大小

uint32 ReadGameMap::ReadMapSize()

{

return m_MapSize;

}// 讀取地圖IMAG的數據

bool ReadGameMap::ReadIMAG(FILE *fp, uint32 Flag, uint32 Size)

{

if (Flag==0x494D4147)

{

m_imag.Data = new uint8[Size]; // 分配單元數據的內存空間

fread(m_imag.Data,Size,1,fp); // 讀取單元IMAG的數據

m_imag.Size=Size;

//printf("IMAG的數據:\n");

//PrintHex(m_ImagData,Size);

}

else

{

printf("IMAG標誌錯誤!\n");

return false;

}

return true;

}// 讀取地圖JPEG的數據

bool ReadGameMap::ReadJPEG(FILE *fp, uint32 Flag, uint32 Size)

{

if (Flag==0x4A504547)

{

fread(&m_SubMapWidth,sizeof(uint16),1,fp); // 子地圖的寬度

fread(&m_SubMapHeight,sizeof(uint16),1,fp); // 子地圖的高度

m_jpeg.Data = new uint8[Size-4]; // 分配單元數據的內存空間

fread(m_jpeg.Data,Size-4,1,fp); // 讀取單元JPEG的數據

m_jpeg.Size=Size;

//printf("JPEG的數據:\n");

//PrintHex(m_JpegData,Size-4);

}

else

{

printf("JPEG標誌錯誤!\n");

return false;

} return true;

}// 讀取地圖MASK的數據

bool ReadGameMap::ReadMASK(FILE *fp, uint32 Flag, uint32 Size)

{

if (Flag==0x4D41534B)

{

//printf("m_MaskTemp=%d\n",m_MaskTemp);

m_mask[m_MaskTemp].Data = new uint8[Size]; // 分配單元數據的內存空間

m_mask[m_MaskTemp].Size=Size;

fread(m_mask[m_MaskTemp].Data,Size,1,fp); // 讀取單元MASK的數據

//printf("MASK的數據:\n");

//PrintHex(mask[m_MaskTemp].m_MaskData,Size); m_MaskTemp++;

}

else

{

printf("MASK標誌錯誤!\n");

return false;

} return true;

}// 讀取地圖BLOK的數據

bool ReadGameMap::ReadBLOK(FILE *fp, uint32 Flag, uint32 Size)

{

if (Flag==0x424C4F4B)

{

m_blok.Data = new uint8[Size]; // 分配單元數據的內存空間

fread(m_blok.Data,Size,1,fp); // 讀取單元BLOK的數據

m_blok.Size=Size;

//printf("BLOK的數據:\n");

//PrintHex(m_BlokData,Size);

}

else

{

printf("BLOK標誌錯誤!\n");

return false;

} return true;

}// 讀取地圖CELL的數據

bool ReadGameMap::ReadCELL(FILE *fp, uint32 Flag, uint32 Size)

{

if (Flag==0x43454C4C)

{

m_cell.Data = new uint8[Size]; // 分配單元數據的內存空間

fread(m_cell.Data,Size,1,fp); // 讀取單元CELL的數據

m_cell.Size=Size;

//printf("CELL的數據:\n");

//PrintHex(m_CellData,Size);

}

else

{

printf("CELL標誌錯誤!\n");

return false;

} return true;

}// 讀取地圖BRIG的數據

bool ReadGameMap::ReadBRIG(FILE *fp, uint32 Flag, uint32 Size)

{

if (Flag==0x42524947)

{

m_brig.Data = new uint8[Size]; // 分配單元數據的內存空間

fread(m_brig.Data,Size,1,fp); // 讀取單元BRIG的數據

m_brig.Size=Size;

//printf("BRIG的數據:\n");

//PrintHex(m_BirgData,Size);

}

else

{

printf("BRIG標誌錯誤!\n");

return false;

} return true;

}// 讀取JPGH的數據

MapData ReadGameMap::ReadJpghData()

{

return m_jpgh;

}// 讀取HEAD的數據

MapData ReadGameMap::ReadHeadData()

{

return m_head;

}// 讀取IMAG的數據

MapData ReadGameMap::ReadImagData()

{

return m_imag;

}// 讀取JPEG的數據

MapData ReadGameMap::ReadJpegData()

{

return m_jpeg;

}

// 讀取MASK的數據

MapData ReadGameMap::ReadMaskData(uint8 ID)

{

return m_mask[ID];

}

// 讀取BLOK的數據

MapData ReadGameMap::ReadBlokData()

{

return m_blok;

}// 讀取CELL的數據

MapData ReadGameMap::ReadCellData()

{

return m_cell;

}// 讀取BRIG的數據

MapData ReadGameMap::ReadBrigData()

{

return m_brig;

}

  • 上一篇:創建VB工程,運行時可將文本框中的文字縮小以及還原。程序代碼怎麽寫?
  • 下一篇:反向情緒指數源代碼
  • copyright 2024編程學習大全網