cc = cc or {}
|
|
cc.CC_INVALID_INDEX = -1
|
|
|
|
cc.ActionManager = cc.ActionManager or {}
|
|
|
|
function cc.ActionManager:init()
|
|
cc.ActionManager.Instance = self
|
|
self._targets = {}
|
|
setmetatable(self._targets, {__mode = "k"})
|
|
|
|
self._currentTarget = nil
|
|
self._currentTargetSalvaged = false
|
|
Runner.Instance:AddRunObj(self, 1)
|
|
end
|
|
|
|
function cc.ActionManager:getInstance()
|
|
if cc.ActionManager.Instance == nil then
|
|
cc.ActionManager.Instance = self
|
|
self:init()
|
|
end
|
|
return cc.ActionManager.Instance
|
|
end
|
|
|
|
function cc.ActionManager:addAction(action, target, paused)
|
|
if action == nil then
|
|
print("Cat_Error:ActionManager.lua [addAction] action is nil", debug.traceback())
|
|
return
|
|
end
|
|
assert(target ~= false, "你传进来的transform是false 是不是没加载完啊")
|
|
if target == nil then
|
|
print("Cat_Error:ActionManager.lua [addAction] target is nil", debug.traceback())
|
|
return
|
|
end
|
|
|
|
local element = self._targets[target]
|
|
if not element then
|
|
element = {actions = {} ,target = target, actionIndex = 0, currentActionSalvaged = false, paused=paused}
|
|
self._targets[target] = element
|
|
end
|
|
if self:isArrayContainsObject(element.actions, action) then
|
|
print("Cat_Error:ActionManager.lua [addAction] action already be added!")
|
|
end
|
|
table.insert(element.actions, action)
|
|
action:startWithTarget(target);
|
|
end
|
|
|
|
function cc.ActionManager:removeAction(action)
|
|
if action == nil then return end
|
|
|
|
local target = action:getOriginalTarget()
|
|
local element = self._targets[target]
|
|
if element then
|
|
local i = self:arrayGetIndexOfObject(element.actions, action)
|
|
if i ~= cc.CC_INVALID_INDEX then
|
|
self:removeActionAtIndex(i, element);
|
|
end
|
|
else
|
|
print("Cat:ActionManager.lua [removeAction] Target not found")
|
|
end
|
|
end
|
|
|
|
function cc.ActionManager:isTargetInAction(target)
|
|
return self:getNumberOfRunningActionsInTarget(target)>0
|
|
end
|
|
|
|
function cc.ActionManager:getNumberOfRunningActionsInTarget(target)
|
|
local element = self._targets[target]
|
|
if element then
|
|
return element.actions and #(element.actions) or 0
|
|
end
|
|
return 0
|
|
end
|
|
|
|
function cc.ActionManager:Update(total_time, dt)
|
|
-- if G_DEBUG_STOP_ACTION then
|
|
-- return
|
|
-- end
|
|
-- print('Cat:ActionManager.lua[86] start update', next(self._targets))
|
|
for k,v in pairs(self._targets) do
|
|
--unity组件释放了的话会变成null
|
|
if tostring(k) == "null" then
|
|
self._targets[k] = nil
|
|
else
|
|
self._currentTarget = v
|
|
self._currentTargetSalvaged = false
|
|
|
|
if not self._currentTarget.paused then
|
|
self._currentTarget.actionIndex = 1
|
|
while self._currentTarget.actionIndex <= #(self._currentTarget.actions) do
|
|
|
|
self._currentTarget.currentAction = self._currentTarget.actions[self._currentTarget.actionIndex]
|
|
repeat
|
|
if self._currentTarget.currentAction == nil then
|
|
self._currentTarget.actionIndex = self._currentTarget.actionIndex + 1
|
|
break
|
|
end
|
|
|
|
self._currentTarget.currentActionSalvaged = false
|
|
self._currentTarget.currentAction:step(dt)
|
|
|
|
if self._currentTarget.currentActionSalvaged then
|
|
self._currentTarget.currentAction = nil
|
|
elseif self._currentTarget.currentAction:isDone() then
|
|
self._currentTarget.currentAction:stop()
|
|
|
|
local action = self._currentTarget.currentAction
|
|
self._currentTarget.currentAction = nil
|
|
self:removeAction(action)
|
|
end
|
|
|
|
self._currentTarget.currentAction = nil
|
|
self._currentTarget.actionIndex = self._currentTarget.actionIndex + 1
|
|
until true
|
|
end
|
|
end
|
|
-- only delete currentTarget if no actions were scheduled during the cycle (issue #481)
|
|
if self._currentTargetSalvaged and #(self._currentTarget.actions) == 0 then
|
|
self._targets[k] = nil
|
|
end
|
|
end
|
|
end
|
|
|
|
self._currentTarget = nil
|
|
end
|
|
|
|
function cc.ActionManager:arrayRemoveObjectAtIndex(actions, index,releaseObj)
|
|
if releaseObj and actions[index] then
|
|
actions[index] = nil
|
|
end
|
|
table.remove(actions,index)
|
|
end
|
|
|
|
function cc.ActionManager:isArrayContainsObject(actions, action)
|
|
for i,v in ipairs(actions) do
|
|
if action == v then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function cc.ActionManager:removeActionAtIndex(index, element)
|
|
local action = element.actions[index]
|
|
if action == element.currentAction and not element.currentActionSalvaged then
|
|
element.currentActionSalvaged = true;
|
|
end
|
|
self:arrayRemoveObjectAtIndex(element.actions, index, true)
|
|
if element.actionIndex > index then
|
|
element.actionIndex = element.actionIndex - 1
|
|
end
|
|
if #(element.actions) == 0 then
|
|
if self._currentTarget == element then
|
|
self._currentTargetSalvaged = true
|
|
end
|
|
end
|
|
end
|
|
|
|
function cc.ActionManager:arrayGetIndexOfObject(actions, action)
|
|
for i,v in ipairs(actions) do
|
|
if action == v then
|
|
return i
|
|
end
|
|
end
|
|
return cc.CC_INVALID_INDEX
|
|
end
|
|
|
|
function cc.ActionManager:removeAllActions()
|
|
for k,v in pairs(self._targets) do
|
|
self:removeAllActionsFromTarget(v.target)
|
|
end
|
|
self._targets = {}
|
|
setmetatable(self._targets, {__mode = "k"})
|
|
end
|
|
|
|
function cc.ActionManager:removeAllActionsFromTarget(target)
|
|
if target == nil then
|
|
return
|
|
end
|
|
|
|
local element = self._targets[target]
|
|
if element then
|
|
if self:isArrayContainsObject(element.actions, element.currentAction) and (not element.currentActionSalvaged) then
|
|
element.currentActionSalvaged = true
|
|
end
|
|
|
|
element.actions = {}
|
|
if self._currentTarget == element then
|
|
self._currentTargetSalvaged = true
|
|
else
|
|
self._targets[target] = nil
|
|
end
|
|
end
|
|
end
|