玩家移动

玩家移动
1.检查位置包
auto& mpos = m_spBase->getMapPos(pos.tgtPos);
if(!check_move_pos(pos, pl))
    return;
2.跟新当前位置及方向,更新客户端发过来的位置
pl->last_move_mode = EnumMoveMode::MOVE_MODE_TELEPORT;
pl->last_move_tick = GetTickCount(); // 更新tick
pl->last_move_mode = pos.mov_mode; //更新move_mode
pl->curPos = pl->tgtPos;
pl->tgtPos = pos.tgtPos;
pl->speed = pos.speed;
pl->mov_face = pos.mov_face;
pl->dir = pos.dir;

int curPosX = pl->curPos.x;
int curPosY = pl->curPos.y;
int tgtPosX = pl->tgtPos.x;
int tgtPosY = pl->tgtPos.y;
3.角色位置管理跟新
m_mapCellMgr.updateObjPos(pl, cur_map_pos, tgt_map_pos);//有了这个就不用设置阻挡信息了,因为现在把东西都放在格子里面都是管理这个格子的信息,确实比以前方便多了
5.标记移动
m_move_mgr.add_mask(pl);//这个比较重要,只要把他加入进去就会通知附近玩家他的移动位置,以前我知道通知进入的块和离开的块,当时以为这个是通知的,原来是这样处理的

6.更新区域
pl->region = getRegion(tgt_map_pos);

pos2d new_block_pos = m_spBase->getBlockPos(tgtPosX, tgtPosY);
if((x == new_block_pos.x) && (y == new_block_pos.y))
    return ; //没变化

7.删除原来的
ObjID plid;
plid.id = id;
plid.type = ObjID_Player;
m_mapCellMgr.m_rolesBlock[x][y].del(plid);//m_rolesBlock:针对块的,块上的所有角色,估计也是为了通知用的

8.通知
//更新玩家附近的对象(其他玩家/怪)
pos2d oldBlockPos = {x, y}; 
notify_block(oldBlockPos, new_block_pos, pl);//这个是通知离开的块和进入块上面的所有人,不然别人看不到他的离开和进入,而addMask是通知附近玩家用的

8.加入新的
pl->block_x = new_block_pos.x;
pl->block_y = new_block_pos.y;
m_mapCellMgr.m_rolesBlock[new_block_pos.x][new_block_pos.y].add(pl);//添加到新的块

9.火墙处理
FireWall(pl, pos.tgtPos);//这个啥操作不太清楚

//可以看到玩家移动需要处理这么多事情,NPC和这个差不多,但少了几个操作

原文地址:https://www.cnblogs.com/zzyoucan/p/3947931.html