Files
mir_server/server/LogicServer/misc/AreaRegion.h
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

64 lines
2.1 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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)
};