miduo_client/Assets/ManagedResources/~Lua/event.lua

222 lines
4.6 KiB
Lua

--------------------------------------------------------------------------------
-- Copyright (c) 2015 - 2016 , 蒙占志(topameng) topameng@gmail.com
-- All rights reserved.
-- Use, modification and distribution are subject to the "MIT License"
--------------------------------------------------------------------------------
local setmetatable = setmetatable
local xpcall = xpcall
local pcall = pcall
local assert = assert
local rawget = rawget
local error = error
local print = print
local maxn = table.maxn
local traceback = tolua.traceback
local ilist = ilist
local _xpcall = {}
_xpcall.__call = function(self, ...)
if jit then
if nil == self.obj then
return xpcall(self.func, traceback, ...)
else
return xpcall(self.func, traceback, self.obj, ...)
end
else
local args = {...}
if nil == self.obj then
local func = function() self.func(unpack(args, 1, maxn(args))) end
return xpcall(func, traceback)
else
local func = function() self.func(self.obj, unpack(args, 1, maxn(args))) end
return xpcall(func, traceback)
end
end
end
_xpcall.__eq = function(lhs, rhs)
return lhs.func == rhs.func and lhs.obj == rhs.obj
end
local function xfunctor(func, obj)
return setmetatable({func = func, obj = obj}, _xpcall)
end
local _pcall = {}
_pcall.__call = function(self, ...)
if nil == self.obj then
return pcall(self.func, ...)
else
return pcall(self.func, self.obj, ...)
end
end
_pcall.__eq = function(lhs, rhs)
return lhs.func == rhs.func and lhs.obj == rhs.obj
end
local function functor(func, obj)
return setmetatable({func = func, obj = obj}, _pcall)
end
local _event = {}
_event.__index = _event
--废弃
function _event:Add(func, obj)
assert(func)
if self.keepSafe then
func = xfunctor(func, obj)
else
func = functor(func, obj)
end
if self.lock then
local node = {value = func, _prev = 0, _next = 0, removed = true}
table.insert(self.opList, function() self.list:pushnode(node) end)
return node
else
return self.list:push(func)
end
end
--废弃
function _event:Remove(func, obj)
for i, v in ilist(self.list) do
if v.func == func and v.obj == obj then
if self.lock then
table.insert(self.opList, function() self.list:remove(i) end)
else
self.list:remove(i)
end
break
end
end
end
function _event:CreateListener(func, obj)
if self.keepSafe then
func = xfunctor(func, obj)
else
func = functor(func, obj)
end
return {value = func, _prev = 0, _next = 0, removed = true}
end
function _event:AddListener(handle)
assert(handle)
if self.lock then
table.insert(self.opList, function() self.list:pushnode(handle) end)
else
self.list:pushnode(handle)
end
end
function _event:RemoveListener(handle)
assert(handle)
if self.lock then
table.insert(self.opList, function() self.list:remove(handle) end)
else
self.list:remove(handle)
end
end
function _event:Count()
return self.list.length
end
function _event:Clear()
self.list:clear()
self.opList = {}
self.lock = false
self.keepSafe = false
self.current = nil
end
function _event:Dump()
local count = 0
for _, v in ilist(self.list) do
if v.obj then
print("update function:", v.func, "object name:", v.obj.name)
else
print("update function: ", v.func)
end
count = count + 1
end
print("all function is:", count)
end
_event.__call = function(self, ...)
local _list = self.list
self.lock = true
local ilist = ilist
for i, f in ilist(_list) do
self.current = i
local flag, msg = f(...)
if not flag then
_list:remove(i)
self.lock = false
error(msg)
end
end
local opList = self.opList
self.lock = false
for i, op in ipairs(opList) do
op()
opList[i] = nil
end
end
function event(name, safe)
safe = safe or false
return setmetatable({name = name, keepSafe = safe, lock = false, opList = {}, list = list:new()}, _event)
end
UpdateBeat = event("Update", true)
LateUpdateBeat = event("LateUpdate", true)
FixedUpdateBeat = event("FixedUpdate", true)
CoUpdateBeat = event("CoUpdate") --只在协同使用
local Time = Time
local UpdateBeat = UpdateBeat
local LateUpdateBeat = LateUpdateBeat
local FixedUpdateBeat = FixedUpdateBeat
local CoUpdateBeat = CoUpdateBeat
--逻辑update
function Update(deltaTime, unscaledDeltaTime)
Time:SetDeltaTime(deltaTime, unscaledDeltaTime)
UpdateBeat()
end
function LateUpdate()
LateUpdateBeat()
CoUpdateBeat()
Time:SetFrameCount()
end
--物理update
function FixedUpdate(fixedDeltaTime)
Time:SetFixedDelta(fixedDeltaTime)
FixedUpdateBeat()
end
function PrintEvents()
UpdateBeat:Dump()
FixedUpdateBeat:Dump()
end