SceneConnectMap = SceneConnectMap or BaseClass() function SceneConnectMap:__init() if SceneConnectMap.Instance ~= nil then LogError("attempt to create singleton twice!") end SceneConnectMap.Instance = self self.scene_map = {} if Config.SceneDoors == nil then return end for scene_id, scene_info in pairs(Config.SceneDoors) do self.scene_map[scene_id] = {} self.scene_map[scene_id].to_scene_info = scene_info end end function SceneConnectMap:ClearPath() for scene_id, scene_info in pairs(self.scene_map) do scene_info.parent = nil scene_info.visit = false end end function SceneConnectMap:FindPath(src_scene_id, tgt_scene_id) self:ClearPath() local rlt_path = List.New() if src_scene_id == tgt_scene_id then List.PushFront(rlt_path, tgt_scene_id) List.PushFront(rlt_path, src_scene_id) return rlt_path end local visit_queue = List.New() local handle_scene_info = self.scene_map[src_scene_id] if not handle_scene_info then return rlt_path end handle_scene_info.visit = true List.PushBack(visit_queue, src_scene_id) local is_find = false while not List.Empty(visit_queue) do local handle_scene_id = List.PopFront(visit_queue) local handle_scene_info = self.scene_map[handle_scene_id] if handle_scene_id == tgt_scene_id then is_find = true break end for _,to_scene_id in pairs(handle_scene_info.to_scene_info) do local to_scene_info = self.scene_map[to_scene_id] if to_scene_info and not to_scene_info.visit then to_scene_info.visit = true to_scene_info.parent = handle_scene_id List.PushBack(visit_queue, to_scene_id) end end end -- 返回查找列表 if is_find then local cur_scene_info = self.scene_map[tgt_scene_id] List.PushFront(rlt_path, tgt_scene_id) while cur_scene_info.parent do List.PushFront(rlt_path, cur_scene_info.parent) cur_scene_info = self.scene_map[cur_scene_info.parent] end end return rlt_path end