222 lines
4.6 KiB
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 |