所谓的屏是指在一定范围内的实体的总称,一般是使用9屏(屏的单位大小是网格)。使用9屏意思是视野范围是9屏,每个屏是1/2屏幕的宽高的大小,别人看到的和自己看到的都是各自9屏内的数据,包括其内的各种实体,如npc 、怪物、场景道具等(特殊的话还有些特效和动态的阻挡如机关)。
1、屏大小
每屏的大小一般设置为4分之1的整个屏幕的大小,就是一半的整屏幕的长和宽。
所以对于页游来说的话,对于一般屏幕是1440*768的显示屏,使用的每个小格子为32*32 像素,一个屏的大小可以设置成屏幕大小的1/4,即23(1440/32/2=22.5)*14(900/32/2=14)格子。
地图的大小一般可以设置成1024 * 1024 个格子的大小(要修改成屏格子大小的整数,宽是24整数,高是13整数)。
地图大小限制:
const nPos MAP_MAX_POS(1024,1024);
//x轴最大的格子坐标
const uint16 MAP_SCREEN_X = (MAP_MAX_POS.x + SCREEN_GRID_WIDTH -1)/SCREEN_GRID_WIDTH;
//y轴最大的格子坐标
const uint16 MAP_SCREEN_Y = (MAP_MAX_POS.y + SCREEN_GRID_HEIGHT -1)/SCREEN_GRID_HEIGHT;
//格子数最大的总数
const uint32 MAP_SCREEN_MAX = MAP_SCREEN_X * MAP_SCREEN_Y + 1;
2、场景服务器屏索引
功能:
使用场景屏索引的有场景玩家、场景npc、场景道具。
数据结构:
所有类型物件的索引(SceneEntrySet all[SceneObject_MAX],所有类型物件的数组,SceneObject_MAX 是所有类型的枚举,)
所有类型物件的按屏索引的物件集合的关联容器(screenMapIndex _posi_index[SceneObject_MAX]; typedef std::map<uint32, SceneEntrySet> screenMapIndex; )
(方便唯一性检查)
所有类型物件的按屏索引的物件序列的关联容器 (screenMapVec _posi_index_vec[SceneObject_MAX];//typedef std::map<uint32, SceneObject_Vec> screenMapVec;) (方便遍历)
具体实现:
(1)屏索引的说明
屏索引可以查找到该索引对应的实体,视野同步时把场景服务器屏索引的数据同步到网关,再发到客户端。
场景索引类nIndexScene ,可以让场景类继承场景索引类。
索引的场景物件类型,SceneObjectType是所有的实体类型的枚举。
物件类型:
enum SceneObjectType
{
SceneObject_Invalid,/**< 无效类型 */
SceneObject_Player,/**< 玩家角色 */
SceneObject_NPC,/**< NPC */
SceneObject_Item,/**< 场景道具 */
SceneObject_MAX
};
(2)屏索引的容器类型
(2-1)根据屏(坐标哈希值)的屏索引容器(stl的map)的数组
容器1
screenMapVec _posi_index_vec[SceneObject_MAX];//typedef std::map<uint32, SceneObject_Vec> screenMapVec; (其中screen就是场景的屏坐标,类型是uint16(unsigned short))
容器2
screenMapIndex _posi_index[SceneObject_MAX];//typedef std::map<uint32, SceneEntrySet> screenMapIndex; 这个容器的作用只是为了保证_posi_index_vec数据的唯一性
其中:
SceneEntrySet 是实体集合(使用stl的set实现),因为每个实体都是指针,为了避免重复。
SceneObject_Vec 是实体列表(使用stl的vector实现),为的是遍历的效率。使用时会使用SceneObject_Vec
屏相关的实体集合就组成了某种实体的屏索引容器(screenMapIndex _posi_index[SceneObject_MAX])。
为了遍历的效率,使用了SceneObject_Vec 这个stl的vector实现的容器来实现的容器,实际上是SceneEntrySet里面的数据的数据冗余。
容器3
还有实体集合all(SceneEntrySet all[SceneObject_MAX])来冗余一张地图上的所有的类型的实体,主要用来全地图实体处理&