宠物AI(个人觉得有问题)
//宠物AI流程 1.刚开始添加宠物 Monster被动State:EnumMonster被NULL MonsterStat:EnumPet跟随 2.附近有怪物就改成攻击模式(相关的收尾工作) void PetObj::cancle_follow() { m_trace_line.clear(); is_move = false; MonsterStat = EnumMonsterStat::EnumMonster追击;//将怪物的状态改成EnumMonster追击 } //如果线路没有走完他会向客户端发送移动包和附近玩家通知包 3.当把怪度打死并且目标列表中为空时就把气状态置为跟随 void PetObj::cancle_attached() { m_is_attached = false;//玩家已死,取消攻击记录 m_attach_objs.clear();//取消攻击记录 m_trace_line.clear(); is_move = false; MonsterStat = EnumMonsterStat::EnumPet跟随; } 4.如果宠物在追击或者跟随的过程中和主人的距离超过20格子则会传送 void PetObj::传送()//这个函数写的有问题 { MonsterStat = EnumMonsterStat::EnumPet跟随;//将状态置为跟随,传送之后其状态回到原始状态就是跟随 auto owner_map_pos = m_map->m_spBase->getMapPos(owner->tgtPos); int mx = owner_map_pos.x; int my = owner_map_pos.y; pos2d mPos = {mx, my}; int dir = 0; for(dir = 0; dir < 8; dir ++) { switch(dir) { case DIR_UP: case DIR_LEFT: case DIR_LEFTUP: mPos.y++; break; case DIR_RIGHTUP: mPos.x++; break; case DIR_RIGHT: case DIR_RIGHTDOWN: mPos.y--; break; case DIR_DOWN: case DIR_LEFTDOWN: mPos.x--; break; } if(m_map->is_out_of_range(mPos.x, mPos.y) || !is_pet_stand(mPos)) continue; if(m_map->m_vec_collsion[mPos.x][mPos.y] != 1) break; } if(dir >= 8) { return; } //给附近玩家 和 角色发送消息信息 for(auto it : map_nearby_player) { it.second->nearby_monsters.erase(objId.id); std::vector<ObjecInfo> 远离的; 远离的.push_back(*this); it.second->send_obj_leave(远离的); } for(auto it : map_nearby_objs) { it.second->map_nearby_objs.erase(objId.id); } //m_map->m_move_objs.erase(objId.id);//移除对象 m_map->m_move_mgr.del_mask(objId); pos2d bpos = _getBlockPos(); m_map->m_map_blocks[bpos.x][bpos.y].del(objId); map_nearby_objs.clear(); map_nearby_player.clear(); curPos = tgtPos = m_map->m_spBase->getPos(mx, my); auto cur_block_pos = m_map->m_spBase->getBlockPos(curPos); block_x = cur_block_pos.x; block_y = cur_block_pos.y; base_mpos.x = mx; base_mpos.y = my; //加载到Map::的blockobj容器中 m_map->m_vec_collsion[mx][my] = 1;//当前点设置为1 //加入到容器中 m_map->m_map_objs[objId.id] = this; m_map->m_map_blocks[block_x][block_y].add(this); init(); return; }