游戏区域系统设计

游戏中地图中需要设置不同的区域,尤其对于大型网络游戏,到达不同的区域通常需要提示本区域名称。

本节主要讨论一种游戏区域信息的管理方法:

实现步骤

 1.首先对区域进行边界的描边,获取区域的顶点描边信息


2. 对存储有区域以及区域描边信息的地图,进行信息归纳,形成稀疏矩阵存储, 其中X再加入区域ID信息

区域信息:

	struct SMapAreaInfo
	{
		typedef vector<POINT> Polygon;
		 size_t		nAreaID;		// area map ID
		 size_t		nFatherMapID;		 // father ID, a nearest area which contain it
		// tchar	szAreaName[32];		// Area name
		 tstring szAreaName;
		 RECT areaMapRect;                     //area Rect
		Polygon points;                        //edge points
	};
地图信息: MapQueryInfo 即是 稀疏矩阵,每行表示Y这行的边界点以及该边界点的区域ID; 包含有本地图中所有的区域,用List 存储起来
	struct SMapStateInfo
	{
		struct QueryItem{ 
			short tile; 
			size_t areaid ;
		};
		typedef vector<QueryItem> MapLine;
		typedef vector<MapLine> MapQueryInfo;

		typedef std::vector<size_t> StateAreaList;
	    size_t nStateID;                                       //state ID, key to a map that should be showed independent
		StateAreaList  nStateAreaInfo;  
		MapQueryInfo QueryVertex;                         // query map information
	};
	typedef std::map<size_t,SMapAreaInfo>	TMAP_AREAINFO;          //map of SMapAreaInfo list 
	typedef map<size_t, SMapStateInfo>   TMAP_MAPSTATE;         //map of  SMapStateInfo list map

 3.判断区域所属哪个区域

 主要思想即: 查询每张地图的稀疏矩阵(即含有区域ID的边界顶点信息),如果X大于最近的边界,则在这个区域之中。

/**get Title's area ID
 * @ param  x,y:  is title 
 * @ param  nStateId: the title in map ID   
 * @ return : title's area ID
*/
size_t CTerrainMapArea::GetTerrainAreaID(size_t nStateID, int x, int y)const
{	
	//case 1 title or stateID is error return 0
	if(x<0 || y<0 || nStateID <=0)
		return 0;
	//case 2: title is not in map of nStateID return 0
        RECT rc;
	if(GetBoundingBox(nStateID,rc))
	{
		// for safety consideration, y = limitation should be deleted,  
		// as it may be a vertex point that not in linenum
		if(x<rc.left || x > rc.right || y<=rc.top || y >= rc.bottom)
			return 0;
	}
	TMAP_MAPSTATE::const_iterator it = m_mapTerrainMapState.find(nStateID);
	if (it == m_mapTerrainMapState.end())
		return 0;
	// put in case 2
	SMapStateInfo::MapLine const & line = it->second.QueryVertex[y];

	size_t index = 0;
	//case x <min( line[].titles) or x > max(line.titles) is out of consideration
	while(x > line[index].tile ){
		index++;
	}
	if(/*stackArearId.size() >0*/ index >0){
		//return stackArearId.top();
        return line[index - 1].areaid;
	}
	else{
		return 0;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不负初心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值