64 lines
2.1 KiB
C++
64 lines
2.1 KiB
C++
#pragma once
|
||
|
||
class CAreaRegion
|
||
{
|
||
public:
|
||
CAreaRegion();
|
||
~CAreaRegion();
|
||
|
||
/*
|
||
* Comments: 初始化区域地图,设置地图大小(非区域大小)
|
||
* Param INT_PTR uMapWidth: 地图宽度
|
||
* Param INT_PTR uMapHeight: 地图高度
|
||
* @Return void:
|
||
*/
|
||
void setSize(INT_PTR uMapWidth, INT_PTR uMapHeight);
|
||
/*
|
||
* Comments: 添加并填充一个区域
|
||
* Param LPPOINT lpPoints: 用于构成区域的坐标集,坐标集中必须至少包含3个坐标(三点构成面)
|
||
* Param int nNumPoints: 坐标集中的坐标数量
|
||
* Param int nAreaIndex: 区域ID,必须是1到255之间的一个数字
|
||
* Param LPBYTE lpMapData: 用于存储地图区域索引数据的缓冲区,如果调用者提供,则类内部会将数据生成到此缓冲区中。
|
||
* 缓冲区的大小不得小于地图宽度*地图高度。如果不提供缓冲区,则类会在第一次添加区域的时
|
||
* 候自动创建一个缓冲区。
|
||
* @Return bool: 返回添加区域成功与否,导致失败的唯一原因是坐标集中的坐标数量少于3个或区域ID不在有效范围内
|
||
*/
|
||
bool addArea(LPPOINT lpPoints, int nNumPoints, int nAreaIndex, LPBYTE lpMapData = NULL);
|
||
/*
|
||
* Comments: 获取区域地图数据
|
||
* @Return PBYTE: 返回一个以BYTE为单位的地图数据,数据中包含了每个坐标的区域索引值,使用[MapWidth * Y + X]定位坐标
|
||
*/
|
||
inline PBYTE getAreaMapData(){ return m_pMapData; }
|
||
|
||
protected:
|
||
/** 定义填充区域时的区域数据结构,仅类内部使用 **/
|
||
struct AreaDesc
|
||
{
|
||
INT_PTR nLeft;
|
||
INT_PTR nTop;
|
||
INT_PTR nRight;
|
||
INT_PTR nBottom;
|
||
INT_PTR nWidth;
|
||
INT_PTR nHeight;
|
||
LPPOINT lpPoints;
|
||
LPBYTE lpMapData;
|
||
INT_PTR nPointCount;
|
||
BYTE btIndex;
|
||
};
|
||
|
||
//计算区域所处最小矩形信息
|
||
void calcAreaBounds(IN OUT AreaDesc &area);
|
||
//绘制区域边界
|
||
void drawAreaOutline(const AreaDesc area);
|
||
//填充区域内部
|
||
void fillAreaRegion(const AreaDesc area);
|
||
//以文字输出区域形状,用于调试
|
||
void traceAreaShape(const AreaDesc area);
|
||
protected:
|
||
INT_PTR m_nMapWdith;
|
||
INT_PTR m_nMapHeight;
|
||
PBYTE m_pMapData;
|
||
|
||
DECLARE_OBJECT_COUNTER(CAreaRegion)
|
||
};
|