www.pudn.com > GameEngine_src.rar > CMap.h
// CMap.h: interface for the CMap class. // ////////////////////////////////////////////////////////////////////// #ifndef CMap_h #define CMap_h #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "Struct.h" #include "CEasyDraw.h" #include "CDynamicArray.h" #include "CPool.h" #include "CBaseSprite.h" #includeusing std::string; ////////////////////////////////////////////////////////////////////// //地图文件的文件头,注意里面的EPG指的是EPG文件名 ////////////////////////////////////////////////////////////////////// struct MAPFILEHEADER { char mapName[32]; //地图名字 char mapMusic[32]; //背景音乐文件名 DWORD mapFileType; //地图文件标识:'MF' DWORD mapFileSize; //文件头结构大小 DWORD mapWidth; //地图宽(单位:TILE) DWORD mapHeight; //地图高 DWORD mapNumTileSurface; //TILE页面数量 DWORD mapNumBuilding; //建筑物数量 DWORD mapNumBuildingEPG; //建筑物EPG数量 DWORD mapNumNpcSI; //NPC数量(对应SI文件) DWORD mapNumMonsterSI; //怪物种类数量(对应SI文件) POINT HeroPoint[4]; //英雄出现的point DWORD NumNpcDlg; //NPC对话框数量 DWORD rev; }; const DWORD MAPFILE = 'MF'; ////////////////////////////////////////////////////////////////////// //建筑物数据,用于存入文件中 ////////////////////////////////////////////////////////////////////// struct BUILDING_DATA { DWORD IndexOfBuildingEpg; //EPG文件索引 POINT BasePoint; //基点坐标 }; /////////////////////////////////////////////////////////////////////// //TILE结构,描述一个TILE /////////////////////////////////////////////////////////////////////// struct TILE { TILE() { m_Surf = NULL; } ~TILE() { m_SPool.Free(); m_APool.Free(); } bool Init() { if ( m_SPool.Init( 16 ) == false ) return false; if ( m_APool.Init( 32 ) == false ) return false; return true; } public: RECT m_Rect; PSURFACE m_Surf; CPool m_SPool; //不可选取的精灵:建筑物 CPool m_APool; //可选取的精灵:NPC,怪物,物品 }; typedef TILE *PTILE; const int TILE_WIDTH = 256; //TILE的宽高 const int TILE_HEIGHT= 128; const unsigned char HOLD_MASK = 0x03; // const unsigned char BUILDING_MASK = 0x01; //建筑物占位标记 const unsigned char MONSTER_MASK = 0x02; //monster占位标记,英雄也使用这个 const unsigned char SAVE_MASK = 0x04; //安全地区标记 const unsigned char ITEM_MASK = 0x08; //物品标记,表示位置有物品 //const unsigned char NO_HOLD_MASK = 0xfe; class CMagicSprite; //////////////////////////////////////////////////////////////////////// //地图类 //////////////////////////////////////////////////////////////////////// class CMap { public: CMap(); ~CMap(); bool Init(); void Free(); bool CreateMap( int width, int height ); void FreeMap(); void Draw(); void SetViewer( int left, int top, int right, int bottom ); const RECT &GetViewer() { return m_Viewer; } void MoveMap( int add_x, int add_y ); //void SelectSprite( int x_mouse, int y_mouse ); void ClientToMap( POINT &point ) { point.x += m_Viewer.left; point.y += m_Viewer.top; } void MapToClient( POINT &point ) { point.x -= m_Viewer.left; point.y -= m_Viewer.top; } void PointToCell( const POINT &point, CELL &cell ) { cell.row = point.y / CELL_HEIGHT; cell.col = point.x / CELL_WIDTH; } void CellToPoint( const CELL &cell, POINT &point ) { point.y = cell.row * CELL_HEIGHT; point.x = cell.col * CELL_WIDTH; } bool SetCell( int row, int col, BYTE data ); bool IsCellHold( int row, int col ); bool IsCellHold( int row, int col, BYTE mask ); bool IsCellNull( int row, int col ); void HoldCell( int row, int col ); void NoHoldCell( int row, int col ); void HoldCell( int row, int col, BYTE mask ); void NoHoldCell( int row, int col, BYTE mask ); BYTE *GetCellArray() { return m_CellArray; } int GetCellPitch() { return m_CellPitch; } int GetCellNum() { return m_CellNum; } bool LoadMap( const char *filename ); void SetNextMap( char *name ); void SetIndexHeroPoint( int i ) { m_IndexHeroPoint = i; } int GetWidth() { return m_iWidth;} int GetHeight(){ return m_iHeight; } bool AddStaticSprite( CBaseSprite *sprite ); bool AddAliveSprite( CBaseSprite *sprite ); bool AddMovingSprite( CBaseSprite *sprite ); bool AddItem( CBaseSprite *sprite ); bool AddMagicSprite( CMagicSprite *sprite ) { return m_MagicSpritePool.Add( sprite ) != NULL; } void ShowInfo(); void SetTileSurface( int row, int col, PSURFACE surf ); PTILE GetTile( int x, int y ); PTILE GetTilePointer( int row, int col ) { return &(m_TileArray[row*m_iWidth+col]); } void CalcViewerRect( int x, int y ); void GetVisibleTile( const RECT &viewer, RECT &rcOut ); const char *GetMapName() { return m_MapName.c_str(); } const char *GetNextMapName() { return m_NextMapName.c_str(); } const char *GetCurMapName() { return m_CurMapName.c_str(); } private: inline void SortSprite(CDynamicArray &array); private: int m_iWidth; //地图宽高(以Tile为单位) int m_iHeight; RECT m_Viewer; //可初区域 RECT m_ViewerEx; //扩展的可视区域 RECT m_MapRect; //地图总的区域 PTILE m_TileArray; //TILE数组 string m_MapName; //当前地图名 string m_NextMapName; string m_CurMapName; int m_IndexHeroPoint; //英雄出现在第几个位置 CDynamicArray m_TileSurfaceArray; //TILE页面数组 BYTE * m_CellArray; //CELL数组 int m_CellPitch; //CELL数组一行的数量 int m_CellNum; //number of CELL CDynamicArray m_BuildingArray; //building object array CDynamicArray m_BuildingPGArray; CDynamicArray m_RenderQueue; //render queue CDynamicArray m_SelectQueue; //被选取的精灵队列 CPool m_MovingSpritePool; //正在发生移动的精灵 CPool m_MagicSpritePool; PSURFACE m_SurfInfo; int m_NumRenderObj; //当前显示的精灵,用于测试. }; #endif