/** @file PathVerifier.h
@brief 地图可行走验证, 抽象类
* Copyright (c) 2007,第九城市游戏研发中心
* All rights reserved.
*
* 当前版本:
* 作 者:Shi Yazheng
* 完成日期:2009-09-27
*
* 取代版本:
* 作 者:
* 完成日期:
*/
#ifndef PATHVERIFIER_H
#define PATHVERIFIER_H
#include
#include
// 抽象类
class CPathVerifier
{
public:
/**
*
功能说明:构造函数
*
可访问性:公共
*
注 释:必须在子类构造列表中调用, 本类不负责任何指针参数的内存释放
* @param [in] 地图 id
* @param [in] 地图 x 方向尺寸
* @param [in] 地图 y 方向尺寸
* @param [in] 以二维数组表示的原始地图信息 ( 从.map 文件中读入).
* @return
*/
CPathVerifier(int iMapID, int iSizeX, int iSizeY, unsigned int** ppuiMapInfo);
virtual ~CPathVerifier(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 = true) = 0;
// 使用 dda 测试
inline bool DDAVerify(int iStartX, int iStartY, int iEndX, int iEndY);
/**
*
功能说明:验证两点构成的直线是否能通过 BlockQuad 碰撞
*
可访问性:公共
*
注 释:纯虚函数
* @param [in] iStartX 起始点
* @param [in] iStartY
* @param [in] iEndX 结束点
* @param [in] iEndY
* @return 是否可行走
*/
virtual inline bool BlockQuadTest(int iStartX, int iStartY, int iEndX, int iEndY);
// 碰撞矩形
class CBlockQuad
{
public:
CBlockQuad()
{
}
CBlockQuad(int iID, int iMinX, int iMinY, int iMaxX, int iMaxY)
: m_iID(iID), m_iMinX(iMinX), m_iMinY(iMinY),
m_iMaxX(iMaxX), m_iMaxY(iMaxY), m_bEnable(false)
{
m_iCenterX = (m_iMinX+m_iMaxX) >> 1;
m_iCenterY = (m_iMinY+m_iMaxY) >> 1;
m_iExtendX = m_iCenterX - m_iMinX;
m_iExtendY = m_iCenterY - m_iMinY;
}
void SetEnable(bool bEnable) {m_bEnable = bEnable;}
friend class CPathVerifier;
protected:
int m_iID; // id
int m_iMinX, m_iMinY; // 矩形的范围
int m_iMaxX, m_iMaxY;
int m_iCenterX, m_iCenterY; // 中心点
int m_iExtendX, m_iExtendY; //
bool m_bEnable; // 是否开启
};
// 设置碰撞矩形
inline void SetBlockQuads(int iNum, CBlockQuad* pBlockQuads);
inline void SetBlockQuadEnable(int iID, bool bEnable);
protected:
// 重新计算开启的 BlockQuad 数量
inline void _RefreshNumBlockQuadEnabled();
// 线段与aabb 的碰撞测试, 返回是否通过测试
inline bool _BlockQuadTest(int iStartX, int iStartY, int iEndX, int iEndY, CBlockQuad* pTagBlockQuad);
int m_iMapID; // 地图编号
int m_iSizeX; // 地图 x 方向尺寸
int m_iSizeY; // 地图 y 方向尺寸
unsigned int** m_ppuiMapInfo; // 从 .map 文件读入的原始地图信息
CBlockQuad* m_arrBlockQuads; // 碰撞矩形列表
int m_iNumBlockQuads; // 碰撞矩形数量
int m_iNumBlockQuadEnabled; // 开启的 BlockQuad 数量
};
#include "PathVerifier.inl"
#endif