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" 
#include  
 
using 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