标签:style blog color os io div log sp amp
玩家移动 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和这个差不多,但少了几个操作
标签:style blog color os io div log sp amp
原文地址:http://www.cnblogs.com/zzyoucan/p/3947931.html