/** @file PieceTemplatePathVerifier.h @brief 用地块模板方法的地图可行走验证
*	Copyright (c) 2007,第九城市游戏研发中心
*	All rights reserved.
*
*	当前版本:
*	作    者:Shi Yazheng
*	完成日期:2009-09-27
*
*	取代版本:
*	作    者:
*	完成日期:
*/ #ifndef PIECETTEMPLATEPATHVERIFIER_H #define PIECETTEMPLATEPATHVERIFIER_H #include "PathVerifier.h" #include "MapAccessTemplateGenerator.h" /// 验证地图上任意两点是否可直线通行 class CPieceTemplatePathVerifier : public CPathVerifier { public: /** *
功能说明:构造函数 *
可访问性:公共 *
注 释:pMap 是用 64 位整数表示的地图上每个 8x8 小块的可行走信息数组. * @param [in] iMapID 地图编号 * @param [in] iSizeX 地图尺寸, 必须是 8 的整倍数.(实际上是64的整倍数) * @param [in] iSizeY * @param [in] pMap 地图可行走信息. * @return */ CPieceTemplatePathVerifier(int iMapID, int iSizeX, int iSizeY, unsigned int** ppuiMapInfo, const uint64* pMap); virtual ~CPieceTemplatePathVerifier(void); /** *
功能说明:验证地图上两点间直线是否可行走 *
可访问性:公共 *
注 释: * @param [in] iStartX 起始点 * @param [in] iStartY * @param [in] iEndX 结束点 * @param [in] iEndY * @param [in] bUseExtraDDATest 当测试失败后是否使用额外的 dda 测试 * @return 是否可行走 */ virtual inline bool VerifiyWalkable(int iStartX, int iStartY, int iEndX, int iEndY, bool bUseExtraDDATest = false); /** *
功能说明: 将地图转换成以 uint64 表示每个 piece 阻挡信息的模式. 1bit/grid *
可访问性:公共 *
注 释:512x512 大小的地图占用 32K 内存 * @param [in] iSizeX 地图尺寸. 64 的整数次倍 * @param [in] iSizeY * @param [in] piOrigMap 原 .map 文件载入的地图信息. 32bit/grid * @param [out] pMapInPieceBlock 转换结果, 事先必须分配好内存 * @return */ static void MapToPieceBlock(int iSizeX, int iSizeY, const unsigned int* piOrigMap, uint64* pMapInPieceBlock); ////////////// //测试用函数 protected: static const int PIECE_SIZE = 8; // 地图每个小块的尺寸 // 将地图坐标转换为 piece id inline int _MapPosToPieceID(int iX, int iY); // 地图坐标转换为 piece 的 local id inline int _MapPosToPieceLocalID(int iX, int iY); // 判断两相临 piece 上两点是否可通行 inline bool _CanAccess(int iLastPieceX, int iLastPieceY, int iLastPieceID, int iLastLocalID, int iCurrPieceX, int iCurrPieceY, int iCurrPieceID, int iCurrLocalID); // 判断两 piece 是否符合模板, inline bool _IsFitTemplat(int iStartPiece, int iEndPiece, CMapAccessTemplateGenerator::eAccessDirection eDir, const uint64* arrTemp); int m_iNumPiecesX; // x 方向 piece 数量 int m_iNumPiecesY; // y 方向 piece 数量 const uint64* m_pMap; // 地图可行走信息, 每个 uint64 整数记录对应小块(8x8)的可行走信息. CMapAccessTemplateGenerator* m_pAccTempGen; // 可通行模板 }; #include "PieceTemplatePathVerifier.inl" #endif // PIECETTEMPLATEPATHVERIFIER_H