/** @file MapAccessTemplateGenerator.h
@brief 可行走摸板生成器, 可生成任意两个相临(8x8)小块任意两点间直线可行走需检查的以 int64 表示的模板
函数均忽略参数合法性检查以提高效率,必须在上下文中保证参数正确
* Copyright (c) 2007,第九城市游戏研发中心
* All rights reserved.
*
* 当前版本:
* 作 者:Shi Yazheng
* 完成日期:2009-09-27
*
* 取代版本:
* 作 者:
* 完成日期:
*/
#ifndef MAPACCESSTEMPLATEGENERATOR_H
#define MAPACCESSTEMPLATEGENERATOR_H
#include
#include
#include
#ifndef uint64
typedef unsigned __int64 uint64;
#endif
//#ifndef max
//#define max __max
//#endif
// 地图每个小块的尺寸
#define MAP_PIECE_DIM 8
// 每个小块中的 grid 数量
#define MAP_NUM_GRIDS_IN_PIECE 64
// 单件
class CMapAccessTemplateGenerator
{
public:
// 获取唯一实例
static CMapAccessTemplateGenerator* GetInstance();
~CMapAccessTemplateGenerator(void);
// 到相临 piece 所可能的方向
enum eAccessDirection
{
AD_SELF = 0,
AD_UPLEFT = 1,
AD_UP = 2,
AD_UPRIGHT = 3,
AD_RIGHT = 4,
AD_MAX = 5,
};
// 生成可通行模板, 在构造时候会自动调用,一般不用手动调用
void GenAccessTemplate(eAccessDirection eDirection = AD_MAX);
protected:
CMapAccessTemplateGenerator(void);
static CMapAccessTemplateGenerator* ms_pInstance;
/**
*
功能说明:生成从一个 piece 的 Start 点 到一个相临 piece(偏移 Offset) 的 End 点的 DDA 测试模板
*
可访问性:公共
*
注 释:abs(iOffsetX) <= 1 && abs(iOffsetY) <= 1
* @param [in] iStartX 起始点在 start piece 中的坐标
* @param [in] iStartY
* @param [in] iEndX 终点在 end piece 中的坐标
* @param [in] iEndY
* @param [in] eDir 目标点所在 piece 相对起始点所在 piece 的位置
* @param [out] uiTemp0 左右,上下相临只有两个模板,斜角相临使用4个模板.从 start piece 开始按顺时针顺序
* @param [out] uiTemp1
* @param [out] uiTemp2
* @param [out] uiTemp3
* @return true - 生成成功 false - 有非法参数,生成失败
*/
inline bool _DDASetTemplate(int iStartX, int iStartY, int iEndX, int iEndY,
eAccessDirection eDir, uint64& uiTemp0);
inline bool _DDASetTemplate(int iStartX, int iStartY, int iEndX, int iEndY,
eAccessDirection eDir, uint64& uiTemp0, uint64& uiTemp1);
inline bool _DDASetTemplate(int iStartX, int iStartY, int iEndX, int iEndY,
eAccessDirection eDir, uint64& uiTemp0, uint64& uiTemp1, uint64& uiTemp2, uint64& uiTemp3);
// 初始化 DDA 系数
inline void _InitDDAParams(const int iDX, const int iDY, float& dx, float& dy, int& iSteps);
// 将 uiTag 的第 iWhere 位设置为 1.
// iWhere = [0, 63], iValue = [0, 1]
inline void _SetBit(uint64& uiTag, int iWhere);
public:
// 从当前 piece 到周围任意相临 piece 的模板, 总共占用 416KB 内存
uint64 m_arrAccTmpSelf[MAP_NUM_GRIDS_IN_PIECE][MAP_NUM_GRIDS_IN_PIECE]; // 相同 piece
uint64 m_arrAccTmpUpLeft[MAP_NUM_GRIDS_IN_PIECE][MAP_NUM_GRIDS_IN_PIECE][4]; // 到左上, 到斜角可能会经过另外两个 相临 piece 中的一个, 所以有4个 piece 的模板
uint64 m_arrAccTmpUp[MAP_NUM_GRIDS_IN_PIECE][MAP_NUM_GRIDS_IN_PIECE][2]; // 到上方
uint64 m_arrAccTmpUpRight[MAP_NUM_GRIDS_IN_PIECE][MAP_NUM_GRIDS_IN_PIECE][4]; // 到右上
uint64 m_arrAccTmpRight[MAP_NUM_GRIDS_IN_PIECE][MAP_NUM_GRIDS_IN_PIECE][2]; // 到右边
};
#include "MapAccessTemplateGenerator.inl"
#endif // MAPACCESSTEMPLATEGENERATOR_H