人物上线(激活玩家之后)
2015-01-31 21:50
197 查看
人物上线block格子通知(相当重要了) 人物上线需要看到可视范围内玩家,npc,玩家,同时附近玩家也需要看到本玩家上线 对于进入地图 switch (eBlockChange) { case Map::eBlockChange_EnterMap: { m_MapBlockMgr.ProcessVisibleObjs(enterBlockPos, ProcessEnterObj);//此通知主要是玩家,NPC,怪物的通知 if(ObjID_Player == pObject->GetAttrObjID_Type()) m_MapBlockMgr.ProcessMapObjs(enterBlockPos, true, ProcessMapObj);//主要是物品,装饰物的通知 } break; } //遍历玩家进入地图所在的block格子的附近5*5格子中所有对象 template<typename Fn> void MapBlockMgr::ProcessVisibleObjs(const pos2d& bpos, Fn ProcessFunc) { if (!IsValidBlockPos(bpos)) return; auto& rBlockInfo = GetBlockInfo(bpos); for (auto p2d : rBlockInfo.m_vecVisibleBlockBPos) { for (auto pObj : *GetBlockInfo(p2d).GetAllobj()) { ProcessFunc(pObj.second); } } } 对于5*5格子中所有对象处理方法如下: void Map::NotifyBlockX(pos2d leaveBlockPos, pos2d enterBlockPos, ObjecInfo* pObject, BlockChange eBlockChange/* = eBlockChange_Move*/) { std::vector<ObjecInfo> vecLeaveObjs ; std::vector<ObjecInfo> vecEnterObjs ; if (leaveBlockPos == enterBlockPos) return; auto ProcessEnterObj = [pObject, &vecEnterObjs, this](ObjecInfo* pObj) {// 只处理自己以外的玩家 if (pObj == pObject) return; ObjIDEnum eType = (ObjIDEnum)pObj->GetAttrObjID_Type(); if (eType == ObjID_Player) //如果是玩家的话直接进行发包通知 { //战场中名字颜色显示 if(eMAPTYPE_BATTLE == this->m_MapType || eMAPTYPE_PALACE == this->m_MapType) {//只能实现同一帮会,帮会是异步的 同盟目前无法实现 this->m_spCityObj->SetNameColor(pObject, pObj); } PlayerInfo* me = (PlayerInfo*)pObj; std::vector<ObjecInfo> pTgtObjs; pTgtObjs.push_back(*pObject); me->m_fnSendObjEnter(pTgtObjs);//在附近玩家的可视范围之内,直接发包通知那个玩家 } if(ObjID_Player == pObject->GetAttrObjID_Type())//针对玩家需要通知,其他npc不需要通知 vecEnterObjs.push_back(*pObj);//其他类型就直接放入进入对象的map容器中(对于NPC,宠物则加入到此容器中进行统一通知本地玩家) }; } //物品装饰物通知 auto ProcessMapObj = [pObject, this](pos2d BlockPos, bool bEnter) { ObjIDEnum eType = (ObjIDEnum)pObject->GetAttrObjID_Type(); if(eType == ObjID_Player) { PlayerInfo* pPlayer = (PlayerChannel*)pObject; this->NotifyItem(BlockPos, pPlayer, bEnter);//物品通知 this->NotifyOrnamental(BlockPos, pPlayer, bEnter); //装饰物通知 } } { if(ObjID_Player != pObject->GetAttrObjID_Type())//对于怪物,NPC只有玩家需要通知 return; PlayerChannel* pPlayer = (PlayerChannel*)pObject; if (!vecLeaveObjs.empty()) pPlayer->m_fnSendObjLeave(vecLeaveObjs); if (!vecEnterObjs.empty()) pPlayer->m_fnSendObjEnter(vecEnterObjs);//向本地玩家,npc,怪物信息,让其一上线就能看到他们的动作 } 然后将玩家加入到相应block格子的管理容器中 m_MapCellMgr.AddPlayer(pPC->GetAttrObjID_Id(), pPC);//加入到单元格管理中的所有玩家信息 m_MapCellMgr.AddObj(cPlayerMapPos.x, cPlayerMapPos.y, pPC);//加入相应单元格信息当中 //在新进入块中通知 pPC->m_fnSendStatChange(pPC->GetAttrObjStat());//这个是什么意思,难道是初始化 UpdateRegionInfo(pPC, cPlayerMapPos);更新玩家的区域信息 中间两个读取玩家装备的消息
相关文章推荐
- xpsp2问世之后激活经典场景的问题分析
- MATLAB2013在2017年10月份之后就不能激活了
- 【DotA2玩家心得】激活显示FPS/PING 开启国服 开启右键反补
- 玩家上线
- PIX 525下的怪问题(需在防火墙后的同子网上激活之后才能在INTERNET上使用)?
- weblogic配置完数据源之后,激活更改出错?
- ERP管理系统上线之后可能会面临的问题?
- 项目分析(人物上线消息)
- map 玩家上线
- MAC安装最新datagrip之后无法非官方激活,而且启动过慢
- 升级或重装Win10之后如何激活Win10的方法分享
- 激活本博客,留着之后用!
- MatlabR2015b用了一段时间之后需要重新激活
- 看了隋老师的挨踢人物传之后的一些想法
- ms人物上线
- MatlabR2015b用了一段时间之后需要重新激活
- 华硕主板使用nt6 oem loader激活之后重启卡在ASUS LOGO位置无法进入BIOS界面
- “聘宝”上线“轻简ATS系统”,在推荐之后增加管理工作,打造一站式智能招聘_36氪
- Android工具类之LogUtils,打印工具类,上线之后在此变值不打印
- 关于**活动项目上线之后的一些总结