|
|
local create = coroutine.create
|
|
local running = coroutine.running
|
|
local resume = coroutine.resume
|
|
local yield = coroutine.yield
|
|
local error = error
|
|
local unpack = unpack
|
|
local debug = debug
|
|
local FrameTimer = FrameTimer
|
|
local CoTimer = CoTimer
|
|
|
|
local comap = {}
|
|
setmetatable(comap, {__mode = "kv"})
|
|
|
|
function coroutine.start(f, ...)
|
|
local co = create(f)
|
|
|
|
if running() == nil then
|
|
local flag, msg = resume(co, ...)
|
|
|
|
if not flag then
|
|
msg = debug.traceback(co, msg)
|
|
LogError(msg)
|
|
end
|
|
else
|
|
local args = {...}
|
|
local timer = nil
|
|
|
|
local action = function()
|
|
local flag, msg = resume(co, unpack(args))
|
|
|
|
if not flag then
|
|
timer:Stop()
|
|
msg = debug.traceback(co, msg)
|
|
LogError(msg)
|
|
end
|
|
end
|
|
|
|
timer = FrameTimer.New(action, 0, 1)
|
|
comap[co] = timer
|
|
timer:Start()
|
|
end
|
|
|
|
return co
|
|
end
|
|
|
|
function coroutine.wait(t, co, ...)
|
|
local args = {...}
|
|
co = co or running()
|
|
local timer = nil
|
|
|
|
local action = function()
|
|
local flag, msg = resume(co, unpack(args))
|
|
|
|
if not flag then
|
|
timer:Stop()
|
|
msg = debug.traceback(co, msg)
|
|
LogError(msg)
|
|
return
|
|
end
|
|
end
|
|
|
|
timer = CoTimer.New(action, t, 1)
|
|
comap[co] = timer
|
|
timer:Start()
|
|
return yield()
|
|
end
|
|
|
|
function coroutine.step(t, co, ...)
|
|
local args = {...}
|
|
co = co or running()
|
|
local timer = nil
|
|
|
|
local action = function()
|
|
local flag, msg = resume(co, unpack(args))
|
|
|
|
if not flag then
|
|
timer:Stop()
|
|
msg = debug.traceback(co, msg)
|
|
LogError(msg)
|
|
return
|
|
end
|
|
end
|
|
|
|
timer = FrameTimer.New(action, t or 1, 1)
|
|
comap[co] = timer
|
|
timer:Start()
|
|
return yield()
|
|
end
|
|
|
|
function coroutine.www(www, co)
|
|
co = co or running()
|
|
local timer = nil
|
|
|
|
local action = function()
|
|
if not www.isDone then
|
|
return
|
|
end
|
|
|
|
timer:Stop()
|
|
local flag, msg = resume(co)
|
|
|
|
if not flag then
|
|
msg = debug.traceback(co, msg)
|
|
LogError(msg)
|
|
return
|
|
end
|
|
end
|
|
|
|
timer = FrameTimer.New(action, 1, -1)
|
|
comap[co] = timer
|
|
timer:Start()
|
|
return yield()
|
|
end
|
|
|
|
function coroutine.stop(co)
|
|
local timer = comap[co]
|
|
|
|
if timer ~= nil then
|
|
comap[co] = nil
|
|
timer:Stop()
|
|
end
|
|
end
|