PGRData/Script/matrix/xredpoint/XRedPointEvent.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