源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

81 lines
1.9 KiB

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