zoukankan      html  css  js  c++  java
  • 人物上线(激活玩家之后)

    人物上线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);更新玩家的区域信息
    
    中间两个读取玩家装备的消息
  • 相关阅读:
    webpack的基本使用2
    js调用本地exe程序,并获取exe运行结果
    BLE技术简介(转)
    在线编解码转换工具
    json字符转数组
    PPT图标
    在线IP地址与数字互转工具
    C# Combobox
    C# 设置本机日期格式
    sql server删除字段约束
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/4264775.html
Copyright © 2011-2022 走看看