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

📄 3dgamemap-back.h

📁 网络游戏魔域源代码 测试可以完整变异
💻 H
字号:
// GameMap.h ...

#ifndef _GAMEMAP_H
#define _GAMEMAP_H

//-----------------------------
// header ...
#include "Radar.h"
#include "MapLayer.h"
#include "InteractiveLayer.h"
#include "TerrainLayer.h"
#include "MapLayer.h"

#include "PuzzleBmp.h"
#include "Layer.h"
#include "MapItemManager.h"
#include "Path.h"
#include "MagicEffectManager.h"
#include "TerrainEffectManager.h"
#include "InfoViewManager.h"
#include "3DRoleData.h"
#include "TerrainObjManager.h"
//-----------------------------
// Constant ...
const int _NORMAL_SCALE = 128;
const BOOL _SHOW_MASK = false;
const BOOL _SHOW_TERRAIN = false;
const BOOL _SHOW_ALTITUDE = false;
const BOOL _SHOW_EXIT = false;

const int _MAX_STEP = 360;
const int _MAX_DIRECTION	=8;
const int _DELTA_X[8]={0,-1,-1,-1,0,1,1,1};
const int _DELTA_Y[8]={1,1,0,-1,-1,-1,0,1};

const int _CELL_WIDTH	=64;
const int _CELL_HEIGHT	=32;
const int _BLOCK_SIZE	=18;
int  GetBaseAltitude(CMyPos posCell);
//-----------------------------

enum ENUM_MAPTYPE 
{
	MAPTYPE_NORMAL				= 0x0000,
	MAPTYPE_PKFIELD				= 0x0001,
	MAPTYPE_CHGMAP_DISABLE		= 0x0002,
	MAPTYPE_RECORD_DISABLE		= 0x0004,
	MAPTYPE_PK_DISABLE			= 0x0008,
	MAPTYPE_BOOTH_ENABLE		= 0x0010,
	MAPTYPE_TEAM_DISABLE		= 0x0020,	// 32
	MAPTYPE_TELEPORT_DISABLE	= 0x0040,	// 64					// chgmap by action
	MAPTYPE_SYN_MAP				= 0x0080,	// 128
	MAPTYPE_PRISON_MAP			= 0x0100,	// 256
	MAPTYPE_FLY_DISABLE			= 0x00200,
	MAPTYPE_FAMILY				= 0x00400,	
};

struct CellRes 
{
	DWORD X;
	DWORD Y;
	DWORD pResTmpID;
};
typedef map<__int64, CellRes*> MAP_CELLRES;

struct  NodeInfo
{
        int nX;
        int nY;
        int nG; // 目前代价
        int nH; // 估计代价, 改为总代价,减少计算量
        int nStep;
        int nDir;
        NodeInfo* pNode;
        NodeInfo* pChildNode;
};
enum REGION_TYPE 
{
	REGION_NONE					= 0,
	REGION_CITY					= 1,
	REGION_WEATHER				= 2,
	REGION_STATUARY				= 3,
	REGION_DESC					= 4,
	REGION_GOBALDESC			= 5,
	REGION_DANCE				= 6,
	REGION_PK_PROTECTED			= 7,
};

struct  RegionEffectInfo
{
	int	  nIndex;
	DWORD idMap;
	int	  nRegionType;
	int   nX;
	int   nY;
	int	  nW;
	int   nH;
	char  szEffect[2][64];
	int   nDelayTime;
};
typedef vector<RegionEffectInfo*> VECTOR_REGIONEFFECT;

#include <deque>
using namespace std;
typedef deque<CMapLayer* >  DEQUE_MAPLAYER;
typedef deque<CellInfo* >  DEQUE_CELL;
typedef deque<NodeInfo*>  DEQUE_NODE;
typedef deque<RegionInfo*>  DEQUE_REGIONINFO;
//-----------------------------
class CTerrainLayer;
class CFloorLayer;
class CSkyLayer;

class CGameMap
{
private:
        DEQUE_MAPLAYER		m_setMapLayer;
        CMySize				m_sizeMap;      // by cell
        CMySize				m_szieWorld;    // by World
        BOOL				m_bCreate;

		CMyPos				m_posOrigin;
        CMyPos				m_posView;
        CellInfo*			m_pCellInfo;
		CMyPos				m_posViewOffset;
		DWORD				m_dwVersion;
		CMyPos				m_posPlayerMap;
		BOOL				m_bPlayerMap[37][37];
		
private: // the interaface for A*
        DEQUE_NODE m_setNode;
        int m_nNodeIndex;
        DEQUE_NODE m_setOpen;
        DEQUE_NODE m_setClose;
        int m_nCloseNodeAmount;
        DEQUE_NODE m_setPath;

        CMyPos m_posStart;
        CMyPos m_posTarget;
		CMyPos m_posRealTarget;
        DEQUE_CELL  m_setCellAStar;
		int		m_nPathMode;
		int		m_nLeaveDisc;
		BOOL	m_bShowMapObjInfo;

//----------------------------------------------------------------------
// A*
private:
		BOOL CheckPlayerMap(CMyPos posCell);
		void BuildPlayerMap(CMyPos posStart);
        void ClearNodeSet();
        NodeInfo* CreateNewNode();
        void ClearCloseSet();
        void ClearOpenSet();
        void ClearPathSet();
        void FindPath(CMyPos posStart, CMyPos posTarget);
        void InitAStar();
        void GetPath(NodeInfo* pNode);
        int  GetPathAmount();
        NodeInfo* GetNodeByIndex(int nIndex);
        int  GetStep(CMyPos posCell);
        int GetHValue(CMyPos pos);
        BOOL AddSucNode(NodeInfo* pNode);
        NodeInfo* CheckBestNode();
        NodeInfo* CheckOpenList();
        BOOL CheckNode(CMyPos posNode, int nHight);
        int GetNodeSetAmount(){return m_setNode.size();}
		void ShowPath();
		void GetBestTarget(CMyPos& posCell);
		
//		void FindPath(CMyPos posStart, CMyPos posTarget);
		
//----------------------------------------------------------------------
// others
private:
		void SetCamera(CMyPos posView);

//----------------------------------------------------------------------
// public Interface
public:
        CGameMap();
        virtual ~CGameMap();

public:
		void Reset();
        void Show(BOOL bMapItemInfo = false);
		void ShowMiniMap(CMySize& sizeMap);
		void SetShowExpFlag(BOOL bShow);
		void AddExp(int nExp);
		void ShowExp();
		void ClearExpSet();
        void Process(void* pInfo);


        void GetMapSize(CMySize& infoSize);
        void SetMapSize(CMySize infoSize);

        void GetWorldSize(CMySize& infoSize);

		void ResetViewPos();
		void SetViewPos(CMyPos posView, BOOL bShiftViewPos = false, BOOL bBgLimit = true);
        void GetViewPos(CMyPos& posShow);

		void GetBgWorldPos	(UINT& uWorldX, UINT& uWorldY);
		void GetBgViewport	(int& nViewportX, int& nViewportY);
		void GetBgSize(CMySize& infoSize);

        int  GetExitIndex(CMyPos posCell);
        BOOL IsPosVisible(CMyPos posCell, int nExtendSize=8);

        BOOL LoadDataMap(char* pszFileName);
		void SaveDataMap(char* pszFileName);

        BOOL LoadTextMap(char* pszFileName);
		void SaveTextMap(char* pszFileName);

		BOOL Create(DWORD idDoc);
		void FindPath(CPath& objPath, CMyPos posStart, CMyPos posTarget);
		BOOL TestPath(CMapObj* pMapObj, CMyPos posTarget);

		int  GetAltitude(CMyPos posCell);
		int  GetBaseAltitude(CMyPos posCell);
		void Sampling(DEQUE_CELL& setCell, CMyPos& posHighest, CMyPos posStart, CMyPos posEnd, int nHits);

// for cell
public:
        void DestroyCell();
        void DelLayerInfo(LayerInfo* pLayerInfo);
        void CreateCell();
        void AddLayer(CellInfo* pCellInfo, LayerInfo* pLayerInfo);
        void DelLastLayer(CellInfo* pCellInfo);
		int  GetGroundAltitude(CellInfo* pCellInfo);
		DWORD GetGroundMask(CellInfo* pCellInfo);
		void  SetGroundMask(CellInfo* pCellInfo, DWORD dwMask);
//----------------------------------------------------------------------
// 坐标转换
public:
		void	World2Cell	(int iWorldX,int iWorldY,int& iCellX,int& iCellY);
		void	World2Screen(int iWorldX,int iWorldY,int& iScrX,int& iScrY);
		void	Cell2World	(int iCellX,int iCellY,int& iWorldX,int& iWorldY);
		void	Cell2Screen	(int iCellX,int iCellY,int& iScreenX,int& iScreenY);
		void	Screen2World(int iScrX,int iScrY,int& iWorldX,int& iWorldY);
		void	Screen2Cell	(int iScrX,int iScrY,int& iCellX,int& iCellY);
		void	World2Bg	(int iWorldX, int iWorldY, int& iBgX, int& iBgY);
		void	Bg2World	(int iBgX, int iBgY, int& iWorldX, int& iWorldY);
		void	Mouse2Cell(int nMouseX, int nMouseY, int &nCellX, int &nCellY);
		void	Cell2Map( int nCellX, int nCellY, int &nMapX, int &nMapY ) ;
		void	Map2Cell( int nMapX, int nMapY, int &nCellX, int &nCellY ) ;
//----------------------------------------------------------------------
// static
public:
	    static LayerInfo* GetLastLayerInfo(CellInfo* pCellInfo);

		static int		GetDirection		(int x0,int y0,int x1,int y1);
		static double	GetPreciseDistance	(int x0,int y0,int x1,int y1);
		static int		GetDistance			(int x0,int y0,int x1,int y1,int size=1);

		inline static int	GetMask				(LayerInfo* pInfo);
		inline static int	GetTerrain			(CellInfo* pCellInfo);
		inline static int	GetAltitude			(LayerInfo* pInfo);

		inline static void SetMask(int nMask, LayerInfo* pInfo);
		inline static void	SetTerrain(int nTerrain, LayerInfo* pInfo);
		inline static void SetAltitude(int nAltitude, LayerInfo* pInfo);
//----------------------------------------------------------------------
// layer operate..
public: 
		int GetTerrain(CMyPos posCell);
		int GetTerrain(int nPosX, int nPosY);
        CellInfo* GetCell(int iPosX,int iPosY);
        int  GetLayerAmount();
        CMapLayer* GetLayerByIndex(int nIndex);
        void DelLayer(int nIndex);
		void LayerUp(int nIndex);
		void LayerDn(int nIndex);

        void GetMapObjSize(CMySize& infoSize, CMapObj* pObj);

		void ApplyObjShow(CMapObj* pMapObj);
		void AddInteractiveObj(CMapObj* pMapObj);
		void DelInteractiveObj(CMapObj* pMapObj);

        void ClearMapLayer();
        void AddLayer(CMapLayer* pLayer, int nIndex = -1); //nIndex表示插入以后的位置

        CTerrainLayer* GetTerrainLayer();
        CInteractiveLayer* GetInteractiveLayer();
		CFloorLayer * GetFloorLayer();
		CSkyLayer * GetSkyLayer();

private:
		CMapItemManager m_objItemManager;
		CTerrainObjManager m_objTerrainObjManager;

		CMagicEffectManager	m_objMagicEffectManager;
		CTerrainEffectManager m_objTerrainEffectManager;
public:
		void AddMapItem(OBJID idMapItem, OBJID idItemType, CMyPos posCell);
		void DelMapItem(OBJID idMapItem);
		OBJID GetMapItem(CMyPos posCell);
		OBJID GetFocusMapItem(CMyPos& posCell);

		void Add2DMapItem(OBJID idMapItem, OBJID idItemType, CMyPos posCell,char* szName=NULL);
		void Del2DMapItem(OBJID idMapItem);
		OBJID Get2DMapItem(CMyPos posCell);
		OBJID Get2DFocusMapItem(CMyPos& posCell);

		void Add3DMapItem(OBJID idMapItem, OBJID idItemType, CMyPos posCell);
		void Del3DMapItem(OBJID idMapItem);
		OBJID Get3DMapItem(CMyPos posCell);
		OBJID Get3DFocusMapItem(CMyPos& posCell);
		
		C3DMapEffect*  Add3DMapEffect(CMyPos posWorld, char* pszIndex, BOOL bDelself = true);
		void Del3DMapEffect(CMyPos posWorld);
		void Del3DMapEffect(C3DMapEffect* pEffect);
		void AddMagicEffect(CMagicEffect* pEffect);

		void Add3DMapMagicItem(OBJID idType, OBJID id, CMyPos posCell);
		void LastMapMagicItem(OBJID id);
		void EndMapMagicItem(OBJID id);

// data memeber
		OBJID		m_idMap;
		OBJID		m_idDoc;
		DWORD		m_dwType;
		BOOL		m_bShowMiniMap;
		CRadar		m_objRadar;
		DWORD		m_dwMapARGB;
		char		m_szMapName[64];
		BOOL		m_bSnow;
public:
	void	SetID(OBJID idMap);
	OBJID	GetID();
	void	SetIDDoc(OBJID idMapDoc);
	OBJID	GetIDDoc();
	void	SetType(DWORD dwType);
	DWORD	GetType();
	const char*	GetMapName(){ return m_szMapName;}
	

	void ShowCellRange();
	void ShowCell(BOOL bGride, BOOL bMask, BOOL bArea, BOOL bAltitude);
	void InitMask();
	void SetShowMapObjInfoFlag(BOOL bShow){m_bShowMapObjInfo = bShow;}
	BOOL GetShowMapObjInfoFlag(){return m_bShowMapObjInfo;}
	DWORD GetARGB(){return m_dwMapARGB;}
	void SetARGB(DWORD dwARGB);
	void CleanForEditor();
	void GetMapSizeByPuzzle(CMySize& sizeMap);
	void CreateMapByPuzzle(char* pszPuzzleFile);
	void AddTerrainMagicUnit(CTerainEffectUnit* pUnit){m_objTerrainEffectManager.AddUnit(pUnit);}
	BOOL Outof9Block(CMyPos posHero, CMyPos posTarget);
	void ProcessManager();
	

// map Scale Show pos
	void MapScaleShowPos(int& nX, int& nY);
	void MapScaleMousePos(int& nX, int& nY);
	void SetShowExp(DWORD dwExp); 
private:
	int		m_nScale;
	int		m_nRealScreenWidth;
	int		m_nRealScreenHeight;

public:
	void	SetScale(int nScale);
	int		GetScale(){return m_nScale;}

// search friend and so on ...
private:
	DWORD	m_dwBeginShowFriendPos;
	CMyPos	m_posFriend;

// region and so on
private:
	BOOL	m_bRegionNameChangeCount;
	char	m_szRegionName[64];
	char	m_szRegionEffect[64];
	DWORD	m_dwRegionEffectBegin;
	BOOL	m_bShowRegionEffect;
	BOOL	m_bShowGobalRegionEffect;
	DWORD	m_dwRegionNameChangeBegin;
	BOOL	m_bShowExp;
	DWORD	m_dwOldExp;
	DWORD	m_dwTimeExpBegin;
	DWORD	m_dwShowExp;
	CGame3DEffectEx	 m_objRegionEffect;
	DEQUE_REGIONINFO m_setRegionData;
	VECTOR_INDEXLAYER m_setIndexLayerInfo;
	
public:
	void	ProcessRegion(CMyPos posCell);
	void	ShowRegionName();
	void	CreateRegionData();
	void	DestroyRegionData();
	void	SelectRegionData();
	BOOL	IsPkRegion(CMyPos posCell);
public:
	void	SetFriendPos(CMyPos posFriend){m_dwBeginShowFriendPos = ::TimeGet(); m_posFriend = posFriend;}
	void	GetFriendPos(CMyPos& posFriend){posFriend = m_posFriend;}
	DWORD	GetFriendBeginShow(){return m_dwBeginShowFriendPos;}

	DWORD	CellIndexCounter();
	void	CellIndexUniteCounter(DWORD &dwSame, DWORD &dwDif);

// screen effect ...
private:
	struct
	{
		DWORD	dwTimeBegin;
		DWORD	dwFrameInterval;
		DWORD	dwFrameAmount;
		DWORD	dwSwing;
		BOOL	bOn;
	}ShakeEffectInfo;

	struct
	{
		int		nOldScale;		
		DWORD	dwTimeBegin;
		DWORD	dwFrameInterval;
		DWORD	dwFrameAmount;
		DWORD	dwSwing;
		BOOL	bOn;
	}ScaleEffectInfo;

	struct
	{
		DWORD	dwOldColor;
		DWORD	dwTimeBegin;
		DWORD	dwChangeDuration;
		DWORD	dwChangeBackDuration;
		DWORD	dwDuration;
		BOOL	bOn;
		BYTE	bRed;
		BYTE	bGreen;
		BYTE	bBlue;
		BYTE	bRedE;
		BYTE	bGreenE;
		BYTE	bBlueE;
	}ColorEffectInfo;

public:
	enum{_SCREEN_EFFECT_NONE = 0, _SCREEN_EFFECT_NORMAL = 1};
	void	BeginShakeEffect(int nEffectType = _SCREEN_EFFECT_NORMAL);
	void	BeginScaleEffect(int nEffectType = _SCREEN_EFFECT_NORMAL);
	void	BeginColorEffect(int nEffectType = _SCREEN_EFFECT_NORMAL);
	void	ProcessShakeEffect();
	void	ProcessScaleEffect();
	void	ProcessColorEffect();
public:
	CInfoViewManager m_InfoViewManager;
public:
	TerrainWeatherInfo* GetDefaultWeatherInfo();

// for terrain npc
public:
	void AddTerrainNpc(int nType, int nDir, OBJID id, CMyPos posCell);
	void DeleteTerrainNpc(OBJID id);
	void SetTerrainNpcDir(OBJID id, int nDir);
	void SetTerrainNpcPos(OBJID id, CMyPos posCell);
	void GetTerrainNpcPos(OBJID id, CMyPos& posCell);
	int	GetTerrainNpcLook(OBJID id);
	OBJID GetFocusTerrainNpc();
	BOOL IsTerrainNpcFocus(OBJID id);
public:
	void	DDALine(int x0, int y0, int x1, int y1, vector<POINT>& vctPoint);
	char*	GetRegionName(){return m_szRegionName;}

// for resource edit
public:
	void SetShowRes(BOOL bShow) {m_bShowRes=bShow;}

	void LoadMapRes(char* szFileName);
	void SaveMapRes(char* szFileName);

	void PutCellRes(DWORD x, DWORD y, DWORD idTmp);
	void ClearRes();	
	void DelCellRes(DWORD x, DWORD y);
private:
	MAP_CELLRES		m_setCellRes;
	BOOL			m_bShowRes;
	CellRes*		GetCellRes(DWORD x, DWORD y);
private:

	VECTOR_REGIONEFFECT	m_setRegionEffect;

	DWORD			m_dwTimeRegionEffect;
	int				m_nCurRegionEffectIndex;
	
	CGame3DEffectEx m_objSnow;
	CMyPos			m_posSnow[4];
	
	BOOL			m_bMapShowWeather;
	void			ShowSnow();

	BOOL			m_bBrume;
	CGame3DEffectEx m_objBrume;
	CMyPos			m_posBrume[4];
	void			ShowBrume();
	
	void			ProcessRegionEffect(CMyPos posCell);
	bool			CreateRegionEffectInfo();
	void			DestroyRegionEffectInfo();
	int 			GetRegionEffectInfo(CMyPos posCell);
private:
	BOOL			m_bShowScreenInfo;
	void			ShowScreenInfo();
public:
	void			SwitchScreenInfo(){m_bShowScreenInfo = !m_bShowScreenInfo;}
	void			BuildMapResSql(const char* pszFileName, const char* pszTemplate);
};

//------------------------------------------
extern CGameMap g_objGameMap;

#ifdef _ANALYSIS_ON
extern BOOL g_bShowAnalysisInfo;
#endif

#endif

⌨️ 快捷键说明

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