forked from endernon/PGRData
143 lines
No EOL
3.3 KiB
Lua
143 lines
No EOL
3.3 KiB
Lua
--[[--红点事件个体类
|
|
RedPointEvent.id 唯一Id
|
|
RedPointEvent.conditionGroup 类型 XRedPointConditionGroup
|
|
RedPointEvent.listener 类型 XRedPointListener
|
|
RedPointEvent.node 持有的节点用于判断释放
|
|
]]
|
|
--
|
|
local XRedPointEvent = XClass(nil, "XRedPointEvent")
|
|
|
|
local EventHandler = function(method, eventId)
|
|
return function(obj, ...)
|
|
return method(obj, eventId, ...)
|
|
end
|
|
end
|
|
|
|
|
|
|
|
--构造
|
|
function XRedPointEvent:Ctor(id, node, condition, listener, args)
|
|
self.id = id
|
|
self.condition = condition
|
|
self.listener = listener
|
|
self.node = node
|
|
self.args = args
|
|
self:AddConditonsChangeEvent()
|
|
|
|
self.checkExist = nil
|
|
|
|
if node.Exist then
|
|
self.checkExist = function() return node:Exist() end
|
|
else
|
|
local gameObject = node.GameObject or node.gameObject or node.Transform or node.transform
|
|
if gameObject and gameObject.Exist then
|
|
self.checkExist = function() return gameObject:Exist() end
|
|
end
|
|
end
|
|
end
|
|
|
|
--检测红点条件
|
|
function XRedPointEvent:Check(args)
|
|
|
|
if not self:CheckNode() then
|
|
self:Release()
|
|
return
|
|
end
|
|
|
|
if self.condition then
|
|
--如果条件参数改变,则替换
|
|
if args then
|
|
self.args = args
|
|
end
|
|
|
|
--条件检测
|
|
local result = self.condition:Check(self.args)
|
|
|
|
--回调
|
|
if self.listener then
|
|
if self.listener.func then
|
|
self.listener:Call(result, self.args)
|
|
else
|
|
self.node.gameObject:SetActive(result >= 0)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
--添加事件監聽
|
|
function XRedPointEvent:AddConditonsChangeEvent()
|
|
if not self.condition then
|
|
return
|
|
end
|
|
|
|
local events = self.condition.Events
|
|
|
|
if not events then
|
|
return
|
|
end
|
|
|
|
for _, var in pairs(events) do
|
|
XEventManager.AddEventListener(var.EventId, EventHandler(self.OnCondintionChange, var.EventId), self)
|
|
end
|
|
end
|
|
|
|
--删除事件監聽
|
|
function XRedPointEvent:RemoveConditonsChageEvent()
|
|
if not self.condition then
|
|
return
|
|
end
|
|
|
|
local events = self.condition.Events
|
|
|
|
if not events then
|
|
return
|
|
end
|
|
|
|
for _, var in pairs(events) do
|
|
XEventManager.RemoveEventListener(var.EventId, EventHandler(self.OnCondintionChange, var.EventId), self)
|
|
end
|
|
end
|
|
|
|
--条件改变事件回调
|
|
function XRedPointEvent:OnCondintionChange(eventId, args)
|
|
|
|
-- 分析参数
|
|
if self.condition and self.condition.Events and self.condition.Events[eventId] then
|
|
local element = self.condition.Events[eventId]
|
|
if element:Equal(eventId, args) then
|
|
self:Check()
|
|
return
|
|
end
|
|
end
|
|
|
|
if self.args == nil or args == nil then
|
|
self:Check(args)
|
|
elseif self.args == args and args ~= nil then
|
|
self:Check(args)
|
|
end
|
|
end
|
|
|
|
--检测是否已经被释放
|
|
function XRedPointEvent:CheckNode()
|
|
if self.checkExist == nil then
|
|
return false
|
|
end
|
|
|
|
if not self.checkExist() then
|
|
return false
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
--释放
|
|
function XRedPointEvent:Release()
|
|
self:RemoveConditonsChageEvent()
|
|
self.checkExist = nil
|
|
self.listener:Release()
|
|
self.node = nil
|
|
|
|
XRedPointManager.RemoveRedPointEventOnly(self.id)
|
|
end
|
|
|
|
return XRedPointEvent |