⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gamemap.h

📁 魔域的源代码
💻 H
字号:
// GameMap.h: interface for the CGameMap class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_GAMEMAP_H__7EF1735C_1C98_4A7D_A00A_5A41F4DAC44B__INCLUDED_)
#define AFX_GAMEMAP_H__7EF1735C_1C98_4A7D_A00A_5A41F4DAC44B__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "GameData.h"
#include "GameBlock.h"
#include "define.h"	// Added by ClassView

//////////////////////////////////////////////////////////////////////
#	define		MAPDATA_VERSION		(LPCTSTR)true
					// 地图数据的版本号
const DWORD	DEFAULT_LIGHTRGB		= 0xFFFFFFFF;

///////////////////////////////////////////////////////
// global
inline int	Block(int nPos)				{ return nPos / CELLS_PER_BLOCK; }

//////////////////////////////////////////////////////////////////////
inline int POS2INDEX(int x, int y, int cx, int cy) { return (x + y*cx); }
inline int INDEX2X(int idx, int cx, int cy) { return (idx % cy); }
inline int INDEX2Y(int idx, int cx, int cy) { return (idx / cy); }
inline void POS2LT(POINT* pTarget, const POINT& pos, int nRange) { pTarget->x = pos.x - nRange; pTarget->y = pos.y - nRange; }
inline void POS_ADD(POINT* pTarget, int nOffsetX, int nOffsetY) { pTarget->x += nOffsetX; pTarget->y += nOffsetY; }
inline void POS_SUB(POINT* pTarget, int nOffsetX, int nOffsetY) { pTarget->x -= nOffsetX; pTarget->y -= nOffsetY; }

///////////////////////////////////////////////////////
enum GAMEMAPDATA{
//	GAMEMAPDATA_ID = 0,

	GAMEMAPDATA_NAME=1,
	GAMEMAPDATA_DESCRIBE,
	GAMEMAPDATA_MAPDOC,
	GAMEMAPDATA_TYPE,
	GAMEMAPDATA_OWNERID,
	GAMEMAPDATA_MAPGROUPID,
	GAMEMAPDATA_IDXSERVER,
	GAMEMAPDATA_WEATHER,
	GAMEMAPDATA_BGMUSIC,
	GAMEMAPDATA_BGMUDIC_SHOW,
	GAMEMAPDATA_PORTAL0_X,
	GAMEMAPDATA_PORTAL0_Y,
	GAMEMAPDATA_REBORN_MAPID,
};

char	szMapTable[];
typedef	CGameData<GAMEMAPDATA,szMapTable,szID>	CGameMapData;

class CGameMap;
class IMapData;
class CGameMap : public CGameObj
{
public:
	CGameMap();
	virtual ~CGameMap();
	static CGameMap*	CreateNew()		{ return new CGameMap; }
	virtual bool	Create(IRecordset* pRes);
	virtual ULONG	ReleaseByOwner() { delete this; return 0; }
	IMapData*		QueryMapData()	 { ASSERT(m_pMapData); return m_pMapData; }

public: // get
	OBJID	GetID()					{ return m_pData->GetKey(); }
	LPCTSTR	GetName()				{ return m_pData->GetStr(GAMEMAPDATA_NAME); }
	int		GetWidth()				{ return m_pMapData->GetMapWidth(); }
	int		GetHeight()				{ return m_pMapData->GetMapHeight(); }
	int		GetWidthOfBlock()		{ return (m_pMapData->GetMapWidth()-1) / CELLS_PER_BLOCK + 1; }
	int		GetHeightOfBlock()		{ return (m_pMapData->GetMapHeight()-1) / CELLS_PER_BLOCK + 1; }
	int		GetStatus()				{ return m_nStatus; }

public: // const
	bool	IsStandEnable(int nPosX, int nPosY);
	bool	IsMoveEnable(int x, int y, int nDir, int nSizeAdd, int nClimbCap = 0);
	bool	IsSuperposition(IRole* pRole);
	int		Distance(int x1, int y1, int x2, int y2)	{ return __max(abs(x1-x2), abs(y1-y2)); }
	bool	IsValidPoint(int x, int y)					{ return (x >=0 && x < GetWidth() && y >= 0 && y < GetHeight()); }
	bool	IsWarTime()									{ return m_nStatus == STATUS_WAR; }
	bool	IsJumpEnable(int x, int y)					{ return IsStandEnable(x, y) && m_pMapData->GetRoleAmount(x, y) == 0; }
	void	CollectRole(vector<IRole*>* psetRole, const POINT pos, int nRange);

public: // modify
	void	SetStatus(int nStatus)	{ m_nStatus = nStatus; }
	bool	ChangeMapDoc(OBJID idDoc);
	void	AddTerrainObj(OBJID idOwner, int nPosX, int nPosY, OBJID idTerrainObj)	{ m_pMapData->AddTerrainItem(idOwner, nPosX, nPosY, idTerrainObj); }
	void	DelTerrainObj(OBJID idOwner)				{ m_pMapData->DelTerrainItem(idOwner); }

public: // MapData
	void	IncRole(int x, int y, int nSizeAdd = 0);
	void	DecRole(int x, int y, int nSizeAdd = 0);

public: // npc
//	bool		IsActiveCell(int nPosX, int nPosY);
	bool		SetDormancy(int nPosX, int nPosY);		// return false : 附近有玩家

public: // role
	void		EnterMap(CUser* pUser);
	void		EnterMap(INpc* pNpc);
	void		MoveTo(CUser* pUser, int nNewPosX, int nNewPosY);
	void		MoveTo(INpc* pNpc, int nNewPosX, int nNewPosY);
	void		LeaveMap(CUser* pUser);
	void		LeaveMap(INpc* pNpc);

public: // block
	CGameBlock&	BlockSet(int nPosX, int nPosY)		{ return m_setBlock[Block(nPosX)][Block(nPosY)]; }
	CGameBlock&	BlockByIndex(int x, int y)		{ return m_setBlock[x][y]; }

protected: // ref set
	IMapData*		m_pMapData;			// 地图文件的数据
protected: // owner set
	typedef	vector<CGameBlock>		BOOL_SET;
	typedef	vector<BOOL_SET>		BOOLS_SET;
	BOOLS_SET	m_setBlock; // ★请不要直接使用,请用BlockSet()

protected: // data
	CGameMapData*	m_pData;		//  数据库的数据

public: // application
	enum	{ STATUS_NONE, STATUS_WAR, };
protected:
	void CallWakeMonster(int nPosX, int nPosY);
	int				m_nStatus;
};

#define	FOR_9_BLOCKS(P,X,Y)							\
	for(x = __max(Block(X)-1,0); x <= Block(X)+1 && x < P->GetWidthOfBlock(); x++)		\
		for(y = __max(Block(Y)-1,0); y <= Block(Y)+1 && y < P->GetHeightOfBlock(); y++)
// ★注:使用FOR_9_BLOCKS时要注意else匹配问题和break的层次问题



#endif // !defined(AFX_GAMEMAP_H__7EF1735C_1C98_4A7D_A00A_5A41F4DAC44B__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -