使用Lua语言实现简单的事件系统

使用Lua语言实现简单的事件系统,注册监听/ 移除监听/ 广播消息

核心代码

-- event_system.lua

Event = {}

local events = {}

-- 第一个参数是事件名,后面是传入的其他参数
function Event.Trigger(eventname, ...)
	local eventlist = events[eventname] or {}

	for obj, callback in pairs(eventlist) do
		if obj.OnEvent then
			obj:OnEvent(eventname, ...)
		end
	end
end

-- 注册事件监听
function Event.Register(obj, eventname)
	if not obj then
		return error("Event.Register error: nil callback object", 2)
	end
	
	if not eventname then
		return error("Event.Register error: nil event name", 2)
	end
	
    if type(eventname) == "string" then
        local eventlist = events[eventname]
        
        if not eventlist then
            eventlist = {}
            setmetatable(eventlist, {__mode="k"}) -- 弱引用表,便于内存释放
        end
        
        eventlist[obj] = true
        events[eventname] = eventlist
    end

	return obj
end

-- 移除监听
function Event.Unregister(obj, eventname)
	if not obj then
		return error("Event.Unregister error: nil callback object", 2)
	end
	
	if not eventname then
		return error("Event.Unregister error: nil event name", 2)
	end

    local eventlist = events[eventname]
    if eventlist and eventlist[obj] then
        eventlist[obj] = nil
    end
end

return Event

Cat类

-- Cat.lua

local Event = require "event_system"

local Cat = {}

Cat.__index = Cat

function Cat:ChaseMouse(mouse)
    print(">>>>>>>>>The cat start CHASE the mouse", mouse)
end

function Cat:OnEvent(eventname, ...)
	if eventname == "MOUSE_SPAWNED" and not self.chasing then
		local mouse = ...
		self:ChaseMouse(mouse)
	end
end

-- 注册监听(有老鼠生成的事件)
Event.Register(Cat, "MOUSE_SPAWNED")

return Cat

Mouse类

-- Mouse.lua
local Mouse = {}

Mouse.__index = Mouse

function Mouse:initialize(x, y)
	self:Spawn(x, y)
	Event.Trigger("MOUSE_SPAWNED", self)
end

function Mouse:Spawn(x, y)
    print("A mouse is spawn at (", x, y, ")")
end

return Mouse

Test_main

-- test_main.lua
local Event = require "event_system"
local Mouse = require "Mouse"
local Cat = require "Cat"

Mouse:initialize(10, 20)
-- 移除监听
Event.Unregister(Cat, "MOUSE_SPAWNED")

Mouse:initialize(1, 1)
print("<<<<<< the cat now no longer chase the mouse")
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值