• 玩家移动


    玩家移动
    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和这个差不多,但少了几个操作

  • 相关阅读:
    CentOS 7 配置hadoop(二) 配置hdfs(伪分布)
    CentOS 7 配置hadoop(一) 安装虚拟机(伪分布)
    linux配置
    hive配置
    引用的layui框架在网页上时间显示object
    Spring常用的基本注解
    5W1H分析法
    项目在网页中字符编码问题
    eclipse项目上如何传到码云上!
    spring+springmvc+mybatis+Redis的配置文件
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/3947931.html
Copyright © 2020-2023  润新知