GameMap地图初始化
init_map(res_path) 1.初始化mapbase的基本信息 pos2d screen_area = {1000, 600}; //普通屏幕大小 m_spBase->init(screen_area.x / 3, screen_area.y / 3 , //屏幕划分成3*3格子 header.map_size_item.base_size.x, header.map_size_item.base_size.y ); //map格子单位大小 初始化了mapbase里面的map格子的大小为48*32,block大小1000/3,600/3这些单位都是像素 2.初始化m_mapCellMgr基本信息 屏幕大小:1000*600 新手村:107*160 std::vector<std::vector<int> > m_vec_collsion;//当前地图阻挡信息(0能通过,1不能,2透明,3摊位) std::vector<std::vector<int> > m_base_collsion;//基础地图阻挡信息(不包括人物、怪物阻挡,注意区分m_vec_collsion) m_mapCellMgr.init(m_vec_collsion); info->get_collsion(m_map_width, m_map_hight, m_vec_collsion); m_base_collsion = m_vec_collsion; m_mapCellMgr.init(m_vec_collsion); //初始化MapCellMgr对象m_mapCellMgr基本信息,这个是最近刚加进去的,估计是模仿天龙上面的 // 单元格上对象类 struct CellObject { CellObjType m_type; //对应 枚举CellObjType size_t m_addTime; pos2d m_localmPos; //单元格所在位置 CellObject():m_type(CELL_INVALID), m_addTime(0){} virtual bool isBlocking()const = 0 ; //是否为阻塞的 }; // map单元格信息 struct MapCellInfo { int m_baseFlag; //地图基础阻塞信息 std::list<CellObject*>* m_pObjList; //单元格上的对象列表 }; std::vector<std::vector<MapCellInfo> > m_allMapCell; // 单元格信息 void MapCellMgr::init(const std::vector<std::vector<int> >& mapBlockInfo) { m_w = mapBlockInfo.size(); m_h = mapBlockInfo[0].size(); m_allMapCell.resize(m_w); for(int x = 0; x < m_w; ++x) { m_allMapCell[x].resize(m_h); for(int y = 0; y < m_h; ++y) { auto& cell = m_allMapCell[x][y]; cell.m_baseFlag = mapBlockInfo[x][y];//只初始化了这个地图基础阻塞信息 cell.m_pObjList = nullptr; } } } 3.计算地图的block格子的大小 // 计算出整张地图大概需要横纵大概需要多少的block格子 int map_all_w = m_map_width * header.map_size_item.base_size.x;//计算x坐标的像素大小 int map_all_h = m_map_hight * header.map_size_item.base_size.y;//计算y坐标的像素大小 //由于bolck格子是按照屏幕的3*3的格子换分的,所以这样可以计算出block格子的数目,至于为什么要+4,不太明白 int block_w_num = map_all_w / (screen_area.x / 3) + 4; //多出4格预防外围(满足7x7范围控制 int block_h_num = map_all_h / (screen_area.y / 3) + 4; 4.角色(玩家和NPC)管理容器的初始化 class MapBlockInfo { private: std::map<ObjID, ObjecInfo*> objs; public: void add(ObjecInfo* obj) { objs[obj->objId] = obj; } void del(ObjID id) { objs.erase(id); } std::map<ObjID, ObjecInfo*>* getAllobj() { return &objs; } }; std::vector<std::vector<MapBlockInfo> > m_rolesBlock; // 所有角色(玩家和NPC) m_mapCellMgr.m_rolesBlock.resize(block_w_num); //角色 5.魔法管理器初始化 std::vector<std::vector<std::map<pos2d, SpellObj*> > > m_spellsBlock; // 所有魔法(key:block pos) m_mapCellMgr.m_spellsBlock.resize(block_w_num); //魔法 6.道具管理器容器初始化 m_mapCellMgr.m_itemsBlock.resize(block_w_num); //道具物品 std::vector<std::vector<std::map<size_t, ItemObj*> > > m_itemsBlock; // 所有道具(key:uid) 6.装饰物容器初始化 struct role_node //角色节点(NPC、怪物、装饰物) { pos2d point; //坐标 int id; //id std::string name; //名称 void clear() { point.clear(); id = 0; name.clear(); } }; //[bx][by] map[key:uid, value:装饰物信息] std::vector<std::vector<std::map<unsigned long, mapinfo::role_node> > > m_ornamemtal_block; m_ornamemtal_block.resize(block_w_num); 7.起来类的map指针初始化,对于为什么要加入这个map指针,说是为了访问map里面的那些共有的变量也是。 TeamOption.m_TeamMap = this; ShopOption.m_ShopMap = this; TradeOption.m_TradeMap = this; Relation.m_RelationMap = this;